diff --git a/_build/.doctrees/api/core/core_objects.doctree b/_build/.doctrees/api/core/core_objects.doctree
index 6f4812bd638b211edc5df383dbe48a0173970fc2..a6bf0bf632cee0b929812e3fdfd0166ab20766bf 100644
Binary files a/_build/.doctrees/api/core/core_objects.doctree and b/_build/.doctrees/api/core/core_objects.doctree differ
diff --git a/_build/.doctrees/api/core/model.doctree b/_build/.doctrees/api/core/model.doctree
index d5c9b533dec8e40254521676404b20ddd6ad0db8..eb56547947fb6f393491be025883dcdea9aecf00 100644
Binary files a/_build/.doctrees/api/core/model.doctree and b/_build/.doctrees/api/core/model.doctree differ
diff --git a/_build/.doctrees/api/core/sim_config.doctree b/_build/.doctrees/api/core/sim_config.doctree
index f4971eda3fb6f0ec95dbdf51c1677edd1b72c4f5..b2f89e8b05b9526eb023226658700bcf31af2c1f 100644
Binary files a/_build/.doctrees/api/core/sim_config.doctree and b/_build/.doctrees/api/core/sim_config.doctree differ
diff --git a/_build/.doctrees/api/interaction_potentials/ibi.doctree b/_build/.doctrees/api/interaction_potentials/ibi.doctree
index 012381eef911f0922f80fff3b81a5ca8ca297fa0..eef4aebaeb27c1c7736e932ab46243edd11adac0 100644
Binary files a/_build/.doctrees/api/interaction_potentials/ibi.doctree and b/_build/.doctrees/api/interaction_potentials/ibi.doctree differ
diff --git a/_build/.doctrees/api/interaction_potentials/interactions.doctree b/_build/.doctrees/api/interaction_potentials/interactions.doctree
index 7584f573044d51ebfe60a93588354a1424787280..0efa78e991634c38b8c967798b41232a691ed841 100644
Binary files a/_build/.doctrees/api/interaction_potentials/interactions.doctree and b/_build/.doctrees/api/interaction_potentials/interactions.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/fjc_polymer_model.doctree b/_build/.doctrees/api/polymer_modeling/fjc_polymer_model.doctree
index 3ca74ba5804e49f89e0c6d204ba86f647724c89c..0a872655e7f178ae0a330ccba00c64c2047817f8 100644
Binary files a/_build/.doctrees/api/polymer_modeling/fjc_polymer_model.doctree and b/_build/.doctrees/api/polymer_modeling/fjc_polymer_model.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/hps_polymer_model.doctree b/_build/.doctrees/api/polymer_modeling/hps_polymer_model.doctree
index dcc3178cff9be9d1a9ab0ac3d13e0615303dae15..26190a52d902dbfe88e51a87569f4965a12e1d06 100644
Binary files a/_build/.doctrees/api/polymer_modeling/hps_polymer_model.doctree and b/_build/.doctrees/api/polymer_modeling/hps_polymer_model.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/kh_polymer_model.doctree b/_build/.doctrees/api/polymer_modeling/kh_polymer_model.doctree
index 3cf8db1383b7215d11b9982898cb3b12a87d9ad7..63f0f0a26f0465d80eff4c2ecc89bd41ab25dc8e 100644
Binary files a/_build/.doctrees/api/polymer_modeling/kh_polymer_model.doctree and b/_build/.doctrees/api/polymer_modeling/kh_polymer_model.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/mpipi_polymer.doctree b/_build/.doctrees/api/polymer_modeling/mpipi_polymer.doctree
index be044266dd04ce5d14fd82a798e2d726256f1128..3ed3c33dc0e91748afc4d2fbdeb5a834ba3155fc 100644
Binary files a/_build/.doctrees/api/polymer_modeling/mpipi_polymer.doctree and b/_build/.doctrees/api/polymer_modeling/mpipi_polymer.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/onck_polymer_model.doctree b/_build/.doctrees/api/polymer_modeling/onck_polymer_model.doctree
index c4b84ed31b17bcb447cc2b5054d6ba40f972848a..00e6c8af7505834a62afb8185bb9a783f6904306 100644
Binary files a/_build/.doctrees/api/polymer_modeling/onck_polymer_model.doctree and b/_build/.doctrees/api/polymer_modeling/onck_polymer_model.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/polymer.doctree b/_build/.doctrees/api/polymer_modeling/polymer.doctree
index df1d64c080d1e5848d7ea06f6f0d154fab0a6f19..615a963fbbf465b2671d23486f175b73c53f20ea 100644
Binary files a/_build/.doctrees/api/polymer_modeling/polymer.doctree and b/_build/.doctrees/api/polymer_modeling/polymer.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/sali_polymer_model.doctree b/_build/.doctrees/api/polymer_modeling/sali_polymer_model.doctree
index 04f6bbeca9225dd43c3324aa17e3047b685c6c9d..fee2f2a2abff3e023e6ab53467ad4f7b36f869df 100644
Binary files a/_build/.doctrees/api/polymer_modeling/sali_polymer_model.doctree and b/_build/.doctrees/api/polymer_modeling/sali_polymer_model.doctree differ
diff --git a/_build/.doctrees/api/polymer_modeling/ssdna_two_bead.doctree b/_build/.doctrees/api/polymer_modeling/ssdna_two_bead.doctree
index 67dd888b547fc89872e9570f9d8d2b1083d6209f..5231ebf325740a2f5d39ced64fec21ff42994a81 100644
Binary files a/_build/.doctrees/api/polymer_modeling/ssdna_two_bead.doctree and b/_build/.doctrees/api/polymer_modeling/ssdna_two_bead.doctree differ
diff --git a/_build/.doctrees/api/rigidbody_models/mesh_process_surface.doctree b/_build/.doctrees/api/rigidbody_models/mesh_process_surface.doctree
index d07281719e47b14f9b94cf441ff2801bf6760710..58f6e1bdd7d931156a245f371ff9f08cd0959bf3 100644
Binary files a/_build/.doctrees/api/rigidbody_models/mesh_process_surface.doctree and b/_build/.doctrees/api/rigidbody_models/mesh_process_surface.doctree differ
diff --git a/_build/.doctrees/api/rigidbody_models/mesh_process_volume.doctree b/_build/.doctrees/api/rigidbody_models/mesh_process_volume.doctree
index e98f23e3bf6b9a1b38f6a3752878d7f0199c928b..dfc261a0ee5103990d06df0060b8fcd518fdffe4 100644
Binary files a/_build/.doctrees/api/rigidbody_models/mesh_process_volume.doctree and b/_build/.doctrees/api/rigidbody_models/mesh_process_volume.doctree differ
diff --git a/_build/.doctrees/api/rigidbody_models/mesh_rigidbody.doctree b/_build/.doctrees/api/rigidbody_models/mesh_rigidbody.doctree
index 6dc2d834abd5418cd037050ef6cddb1ba507c482..a4b6f8f9e111632c4ccbdaf65e84944680fd59e3 100644
Binary files a/_build/.doctrees/api/rigidbody_models/mesh_rigidbody.doctree and b/_build/.doctrees/api/rigidbody_models/mesh_rigidbody.doctree differ
diff --git a/_build/.doctrees/api/rigidbody_models/simplearbd.doctree b/_build/.doctrees/api/rigidbody_models/simplearbd.doctree
index ecdc0ad2a81288855b7943d76642829c77dc0654..c5ff3ae5505905b837c79055ada6343f64e6de41 100644
Binary files a/_build/.doctrees/api/rigidbody_models/simplearbd.doctree and b/_build/.doctrees/api/rigidbody_models/simplearbd.doctree differ
diff --git a/_build/.doctrees/api/rigidbody_models/structure_from_pdb.doctree b/_build/.doctrees/api/rigidbody_models/structure_from_pdb.doctree
index 7fb49b6ea66fb3785005ffa5378df5a39e6403f8..f9e1196973c6e517110a92230039aae8e6af319b 100644
Binary files a/_build/.doctrees/api/rigidbody_models/structure_from_pdb.doctree and b/_build/.doctrees/api/rigidbody_models/structure_from_pdb.doctree differ
diff --git a/_build/.doctrees/api/rigidbody_models/structure_rigidbody.doctree b/_build/.doctrees/api/rigidbody_models/structure_rigidbody.doctree
index 3ee572aa370f8c4bcbf63f30f403654630c01277..f95973d08334f5e5fe96acd5f1a78f8c2b7b6484 100644
Binary files a/_build/.doctrees/api/rigidbody_models/structure_rigidbody.doctree and b/_build/.doctrees/api/rigidbody_models/structure_rigidbody.doctree differ
diff --git a/_build/.doctrees/api/shape-based_models/shape_cg.doctree b/_build/.doctrees/api/shape-based_models/shape_cg.doctree
index e3f8520d60db446aaa4cc1e0c2207e9c1fc479cc..99991312eb093f8c90938b6c48739b13c94a4c03 100644
Binary files a/_build/.doctrees/api/shape-based_models/shape_cg.doctree and b/_build/.doctrees/api/shape-based_models/shape_cg.doctree differ
diff --git a/_build/.doctrees/api/simulation_engines/engine.doctree b/_build/.doctrees/api/simulation_engines/engine.doctree
index 5ee5190f58d4cf34f27407e3ab9884d966f44600..8dda4187c80c7f95294391927a1095301be8e6f8 100644
Binary files a/_build/.doctrees/api/simulation_engines/engine.doctree and b/_build/.doctrees/api/simulation_engines/engine.doctree differ
diff --git a/_build/.doctrees/api/simulation_engines/parmed_bd.doctree b/_build/.doctrees/api/simulation_engines/parmed_bd.doctree
index 7e8302d82a7e9c07dd37a953e6c69d75e65fb814..0028d0e809a500dd27358f0283eea80bde635307 100644
Binary files a/_build/.doctrees/api/simulation_engines/parmed_bd.doctree and b/_build/.doctrees/api/simulation_engines/parmed_bd.doctree differ
diff --git a/_build/.doctrees/api/utilities/binary_manager.doctree b/_build/.doctrees/api/utilities/binary_manager.doctree
index f18ca17ad52a50a821a0e5be9e77d437e97ce636..c3beeb4be7a81a7907696ce61c6f720a6a3f7020 100644
Binary files a/_build/.doctrees/api/utilities/binary_manager.doctree and b/_build/.doctrees/api/utilities/binary_manager.doctree differ
diff --git a/_build/.doctrees/api/utilities/coords.doctree b/_build/.doctrees/api/utilities/coords.doctree
index d7ab658551214ab5ba95db12236b198ec6611776..b009dc3520a8b6537146ae22f58fd32f76216a37 100644
Binary files a/_build/.doctrees/api/utilities/coords.doctree and b/_build/.doctrees/api/utilities/coords.doctree differ
diff --git a/_build/.doctrees/api/utilities/grid.doctree b/_build/.doctrees/api/utilities/grid.doctree
index 29dfeb235d282df8bb31df7849aaa3beddae53d5..854290bacf0f7a08b14e29b0e8a3fcd8ce580746 100644
Binary files a/_build/.doctrees/api/utilities/grid.doctree and b/_build/.doctrees/api/utilities/grid.doctree differ
diff --git a/_build/.doctrees/api/utilities/logger.doctree b/_build/.doctrees/api/utilities/logger.doctree
index c84c73968f3a0499fcc65dfbb4f5b3826ca9ae8e..11e95708379422f708aab85a23b4296dca8b3abb 100644
Binary files a/_build/.doctrees/api/utilities/logger.doctree and b/_build/.doctrees/api/utilities/logger.doctree differ
diff --git a/_build/.doctrees/api/utilities/version.doctree b/_build/.doctrees/api/utilities/version.doctree
index 2c0313ef828dc0016bfdff8ab0b641694d933a14..1623b65820cfb81f0f5cd182abaf4d6eec77097b 100644
Binary files a/_build/.doctrees/api/utilities/version.doctree and b/_build/.doctrees/api/utilities/version.doctree differ
diff --git a/_build/.doctrees/environment.pickle b/_build/.doctrees/environment.pickle
index 6cbad059ddd04f26f5954f23c4e65d41bc4072ae..4753aa39a4dfccc6b1a5c766f682d2f9717e15d1 100644
Binary files a/_build/.doctrees/environment.pickle and b/_build/.doctrees/environment.pickle differ
diff --git a/_build/.doctrees/tutorials/index.doctree b/_build/.doctrees/tutorials/index.doctree
index 224d07568a72c379842a7d380ed65066355be4f4..6cf84ab234c0f8ed5543b2afb2006f51351dca0f 100644
Binary files a/_build/.doctrees/tutorials/index.doctree and b/_build/.doctrees/tutorials/index.doctree differ
diff --git a/_build/html/_modules/arbdmodel/binary_manager.html b/_build/html/_modules/arbdmodel/binary_manager.html
new file mode 100644
index 0000000000000000000000000000000000000000..64cdc2584efbe3d523223935689839d6a6f984b3
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/binary_manager.html
@@ -0,0 +1,606 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.binary_manager &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/binary_manager';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.binary_manager</h1><div class="highlight"><pre>
+<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Binary path management module for simulation engines and processors.</span>
+<span class="sd">This module provides a singleton object to manage paths to external binaries.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">platform</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">shutil</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">get_resource_path</span>
+
+<span class="c1"># Default binary names by platform</span>
+<span class="n">DEFAULT_BINARIES</span> <span class="o">=</span> <span class="p">{</span>
+    <span class="s2">&quot;arbd&quot;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s2">&quot;windows&quot;</span><span class="p">:</span> <span class="s2">&quot;arbd.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;linux&quot;</span><span class="p">:</span> <span class="s2">&quot;arbd&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;darwin&quot;</span><span class="p">:</span> <span class="s2">&quot;arbd&quot;</span><span class="p">,</span>  <span class="c1"># macOS uses same binary name as Linux</span>
+    <span class="p">},</span>
+    <span class="s2">&quot;namd&quot;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s2">&quot;windows&quot;</span><span class="p">:</span> <span class="s2">&quot;namd2.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;linux&quot;</span><span class="p">:</span> <span class="s2">&quot;namd2&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;darwin&quot;</span><span class="p">:</span> <span class="s2">&quot;namd2&quot;</span><span class="p">,</span>  <span class="c1"># macOS uses same binary name as Linux</span>
+    <span class="p">},</span>
+    <span class="s2">&quot;vmd&quot;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s2">&quot;windows&quot;</span><span class="p">:</span> <span class="s2">&quot;vmd.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;linux&quot;</span><span class="p">:</span> <span class="s2">&quot;vmd&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;darwin&quot;</span><span class="p">:</span> <span class="s2">&quot;vmd&quot;</span><span class="p">,</span>  <span class="c1"># macOS uses same binary name as Linux</span>
+    <span class="p">},</span>
+    <span class="s2">&quot;hydropro&quot;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s2">&quot;windows&quot;</span><span class="p">:</span> <span class="s2">&quot;hydropro10-msd.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;linux&quot;</span><span class="p">:</span> <span class="s2">&quot;hydropro10-lnx.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;darwin&quot;</span><span class="p">:</span> <span class="s2">&quot;hydropro10-lnx.exe&quot;</span><span class="p">,</span>  <span class="c1"># HydroPro doesn&#39;t have a macOS-specific version, use Linux version</span>
+    <span class="p">},</span>
+    <span class="s2">&quot;apbs&quot;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s2">&quot;windows&quot;</span><span class="p">:</span> <span class="s2">&quot;apbs.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;linux&quot;</span><span class="p">:</span> <span class="s2">&quot;apbs&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;darwin&quot;</span><span class="p">:</span> <span class="s2">&quot;apbs&quot;</span><span class="p">,</span>  <span class="c1"># macOS uses same binary name as Linux</span>
+    <span class="p">},</span>
+    <span class="s2">&quot;gmsh&quot;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s2">&quot;windows&quot;</span><span class="p">:</span> <span class="s2">&quot;gmsh.exe&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;linux&quot;</span><span class="p">:</span> <span class="s2">&quot;gmsh&quot;</span><span class="p">,</span>
+        <span class="s2">&quot;darwin&quot;</span><span class="p">:</span> <span class="s2">&quot;gmsh&quot;</span><span class="p">,</span>  <span class="c1"># macOS uses same binary name as Linux</span>
+    <span class="p">},</span>
+<span class="p">}</span>
+
+<span class="c1"># Resource directories where binaries might be bundled with the package</span>
+<span class="n">RESOURCE_DIRS</span> <span class="o">=</span> <span class="p">{</span>
+    <span class="s2">&quot;hydropro&quot;</span><span class="p">:</span> <span class="s2">&quot;hydropro10&quot;</span><span class="p">,</span>
+<span class="p">}</span>
+
+<span class="c1"># Singleton for binary path management</span>
+<span class="k">class</span><span class="w"> </span><span class="nc">_BinaryManager</span><span class="p">:</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1"># Initialize empty paths dictionary</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span> <span class="o">=</span> <span class="p">{}</span>
+        
+        <span class="c1"># Determine platform</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_platform</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_platform</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;windows&quot;</span><span class="p">,</span> <span class="s2">&quot;linux&quot;</span><span class="p">,</span> <span class="s2">&quot;darwin&quot;</span><span class="p">):</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unsupported platform: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_platform</span><span class="si">}</span><span class="s2">, using linux defaults&quot;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_platform</span> <span class="o">=</span> <span class="s2">&quot;linux&quot;</span>
+        
+        <span class="c1"># For binary path purposes, treat macOS (darwin) similar to Linux for many tools</span>
+        <span class="c1"># that don&#39;t have macOS-specific versions</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">set_binary_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary_name</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Set the path for a specific binary.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            binary_name: The name of the binary (e.g., &#39;arbd&#39;, &#39;hydropro&#39;)</span>
+<span class="sd">            path: The full path to the binary</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">binary_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="p">:</span>
+                <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="p">[</span><span class="n">binary_name</span><span class="p">]</span>
+            <span class="k">return</span>
+            
+        <span class="n">path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="p">[</span><span class="n">binary_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()]</span> <span class="o">=</span> <span class="n">path</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_binary_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary_name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the path for a specific binary, searching if not explicitly set.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            binary_name: The name of the binary (e.g., &#39;arbd&#39;, &#39;hydropro&#39;)</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Path to the binary if found, None otherwise</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">binary_name</span> <span class="o">=</span> <span class="n">binary_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+        
+        <span class="c1"># 1. Return already configured path if available</span>
+        <span class="k">if</span> <span class="n">binary_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="p">[</span><span class="n">binary_name</span><span class="p">]</span>
+        
+        <span class="c1"># 2. Search for the binary</span>
+        <span class="n">binary_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_binary</span><span class="p">(</span><span class="n">binary_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">binary_path</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="p">[</span><span class="n">binary_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">binary_path</span>
+            <span class="k">return</span> <span class="n">binary_path</span>
+            
+        <span class="c1"># 3. Not found</span>
+        <span class="k">return</span> <span class="kc">None</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_find_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary_name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Search for a binary in standard locations.</span>
+<span class="sd">        </span>
+<span class="sd">        Search order:</span>
+<span class="sd">        1. System PATH</span>
+<span class="sd">        2. Package resource directories</span>
+<span class="sd">        3. Current directory</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            binary_name: The name of the binary to find</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Path to the binary if found, None otherwise</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Get the default binary name for the current platform</span>
+        <span class="k">if</span> <span class="n">binary_name</span> <span class="ow">in</span> <span class="n">DEFAULT_BINARIES</span><span class="p">:</span>
+            <span class="n">binary_filename</span> <span class="o">=</span> <span class="n">DEFAULT_BINARIES</span><span class="p">[</span><span class="n">binary_name</span><span class="p">][</span><span class="bp">self</span><span class="o">.</span><span class="n">_platform</span><span class="p">]</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="c1"># If not in our defaults, use the name as is</span>
+            <span class="n">binary_filename</span> <span class="o">=</span> <span class="n">binary_name</span>
+        
+        <span class="c1"># 1. Check in system PATH</span>
+        <span class="n">system_path</span> <span class="o">=</span> <span class="n">shutil</span><span class="o">.</span><span class="n">which</span><span class="p">(</span><span class="n">binary_filename</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">system_path</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">Path</span><span class="p">(</span><span class="n">system_path</span><span class="p">)</span>
+        
+        <span class="c1"># 2. Check in package resource directories</span>
+        <span class="k">if</span> <span class="n">binary_name</span> <span class="ow">in</span> <span class="n">RESOURCE_DIRS</span><span class="p">:</span>
+            <span class="n">resource_dir</span> <span class="o">=</span> <span class="n">get_resource_path</span><span class="p">(</span><span class="n">RESOURCE_DIRS</span><span class="p">[</span><span class="n">binary_name</span><span class="p">])</span>
+            <span class="n">resource_path</span> <span class="o">=</span> <span class="n">resource_dir</span> <span class="o">/</span> <span class="n">binary_filename</span>
+            <span class="k">if</span> <span class="n">resource_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="c1"># Make binary executable if needed (Unix only)</span>
+                <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_platform</span> <span class="o">!=</span> <span class="s2">&quot;windows&quot;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">resource_path</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">):</span>
+                    <span class="n">os</span><span class="o">.</span><span class="n">chmod</span><span class="p">(</span><span class="n">resource_path</span><span class="p">,</span> <span class="mo">0o755</span><span class="p">)</span>
+                <span class="k">return</span> <span class="n">resource_path</span>
+        
+        <span class="c1"># 3. Check in current directory</span>
+        <span class="n">local_path</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="n">binary_filename</span>
+        <span class="k">if</span> <span class="n">local_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">return</span> <span class="n">local_path</span>
+        
+        <span class="c1"># Not found</span>
+        <span class="k">return</span> <span class="kc">None</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_all_paths</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get all configured binary paths.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Dictionary of binary name to path</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">export_to_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Export all binary paths as a dictionary of strings.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Dictionary of binary name to string path</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_binary_paths</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">import_from_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">paths_dict</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Import binary paths from a dictionary.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            paths_dict: Dictionary of binary name to path</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">paths_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">path</span><span class="p">:</span>  <span class="c1"># Skip empty paths</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+                
+    <span class="k">def</span><span class="w"> </span><span class="nf">is_binary_essential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary_name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if a binary is considered essential for core functionality.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            binary_name: The name of the binary to check</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            True if the binary is essential, False otherwise</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">essential_binaries</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;arbd&quot;</span><span class="p">]</span>  <span class="c1"># These are required for core functionality</span>
+        <span class="k">return</span> <span class="n">binary_name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="n">essential_binaries</span>
+
+<span class="c1"># Create the singleton instance</span>
+<span class="n">BinaryManager</span> <span class="o">=</span> <span class="n">_BinaryManager</span><span class="p">()</span>
+
+<span class="c1"># Initialize binary paths from environment variables</span>
+<div class="viewcode-block" id="initialize_binary_paths">
+<a class="viewcode-back" href="../../api/utilities/binary_manager.html#arbdmodel.binary_manager.initialize_binary_paths">[docs]</a>
+<span class="k">def</span><span class="w"> </span><span class="nf">initialize_binary_paths</span><span class="p">():</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Initialize binary paths from environment variables.</span>
+<span class="sd">    This function should be called during package initialization.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="c1"># Check environment variables for binary paths</span>
+    <span class="k">for</span> <span class="n">binary</span> <span class="ow">in</span> <span class="n">DEFAULT_BINARIES</span><span class="p">:</span>
+        <span class="n">env_var</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">binary</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="si">}</span><span class="s2">_PATH&quot;</span>
+        <span class="k">if</span> <span class="n">env_var</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
+            <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="n">binary</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="n">env_var</span><span class="p">])</span>
+    
+    <span class="c1"># Try to load from configuration file</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
+        <span class="n">config_path</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">home</span><span class="p">()</span> <span class="o">/</span> <span class="s2">&quot;.config&quot;</span> <span class="o">/</span> <span class="s2">&quot;arbd&quot;</span> <span class="o">/</span> <span class="s2">&quot;binaries.json&quot;</span>
+        <span class="k">if</span> <span class="n">config_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">config_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+                <span class="n">paths_dict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
+                <span class="n">BinaryManager</span><span class="o">.</span><span class="n">import_from_dict</span><span class="p">(</span><span class="n">paths_dict</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+        <span class="c1"># Silently continue with environment or defaults if config loading fails</span>
+        <span class="k">pass</span></div>
+
+
+<span class="c1"># Initialize binary paths on module import</span>
+<span class="n">initialize_binary_paths</span><span class="p">()</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Usage example: </span>
+<span class="sd">arbd_path = BinaryManager.get_binary_path(&quot;arbd&quot;)</span>
+<span class="sd">print(f&quot;ARBD binary path: {arbd_path}&quot;)</span>
+
+<span class="sd"># Set binary path</span>
+<span class="sd">BinaryManager.set_binary_path(&quot;hydropro&quot;, &quot;/path/to/hydropro&quot;)</span>
+<span class="sd">&quot;&quot;&quot;</span>
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/core_objects.html b/_build/html/_modules/arbdmodel/core_objects.html
new file mode 100644
index 0000000000000000000000000000000000000000..477f08cd4f932444ff74417eed1c7a01d3e918ec
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/core_objects.html
@@ -0,0 +1,1359 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.core_objects &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/core_objects';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.core_objects</h1><div class="highlight"><pre>
+<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">inspect</span><span class="w"> </span><span class="kn">import</span> <span class="n">ismethod</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">copy</span><span class="w"> </span><span class="kn">import</span> <span class="n">copy</span><span class="p">,</span> <span class="n">deepcopy</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">get_resource_path</span><span class="p">,</span><span class="n">devlogger</span>
+
+
+<span class="c1">## Abstract classes</span>
+<div class="viewcode-block" id="Transformable">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Transformable">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">Transformable</span><span class="p">():</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">orientation</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">position</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">position</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">orientation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">orientation</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">orientation</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">orientation</span> <span class="o">=</span> <span class="n">orientation</span>
+
+<div class="viewcode-block" id="Transformable.translate">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Transformable.translate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Transformable.rotate">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Transformable.rotate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">rotate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">R</span><span class="p">,</span> <span class="n">about</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span> <span class="n">R</span> <span class="o">=</span> <span class="n">R</span><span class="p">,</span> <span class="n">center</span> <span class="o">=</span> <span class="n">about</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Transformable.transform">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Transformable.transform">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">transform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">R</span> <span class="o">=</span> <span class="p">((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)),</span>
+                  <span class="n">center</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)):</span>
+
+        <span class="n">R</span><span class="p">,</span><span class="n">center</span><span class="p">,</span><span class="n">offset</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">R</span><span class="p">,</span><span class="n">center</span><span class="p">,</span><span class="n">offset</span><span class="p">)]</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">position</span> <span class="o">=</span> <span class="n">R</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">position</span><span class="o">-</span><span class="n">center</span><span class="p">)</span><span class="o">+</span><span class="n">center</span><span class="o">+</span><span class="n">offset</span>
+                
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">orientation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="c1">## TODO: what if self.orientation is taken from parent?!</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">orientation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>  </div>
+
+
+<div class="viewcode-block" id="Transformable.get_collapsed_position">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Transformable.get_collapsed_position">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_collapsed_position</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1"># print(&quot;get_collapsed_position called&quot;, type(self), self.name)</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Child</span><span class="p">):</span>
+            <span class="c1"># print(self.parent, isinstance(self.parent,Transformable))</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">Transformable</span><span class="p">):</span>
+                <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">applyOrientation</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">position</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()</span>
+            
+                <span class="c1"># if self.parent.orientation is not None:</span>
+                <span class="c1">#     return self.parent.collapsedOrientation().dot(self.position) + self.parent.get_collapsed_position()</span>
+        <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">position</span><span class="p">)</span> <span class="c1"># return a copy</span></div>
+
+                
+<div class="viewcode-block" id="Transformable.applyOrientation">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Transformable.applyOrientation">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">applyOrientation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">obj</span><span class="p">):</span>
+        <span class="c1"># print(&quot;applyOrientation called&quot;, self.name, obj)</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Child</span><span class="p">):</span>
+            <span class="c1"># print( self.orientation, self.orientation is not None, None is not None )</span>
+            <span class="c1"># if self.orientation is not None:</span>
+            <span class="c1">#     # print(&quot;applyOrientation applying&quot;, self, self.name, self.orientation)</span>
+            <span class="c1">#     obj = self.orientation.dot(obj)</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">Transformable</span><span class="p">):</span>
+                <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">orientation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                    <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+                <span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">applyOrientation</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+        <span class="c1"># print(&quot;applyOrientation returning&quot;, self.name, obj)</span>
+        <span class="k">return</span> <span class="n">obj</span></div>
+</div>
+
+
+<div class="viewcode-block" id="Parent">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">Parent</span><span class="p">():</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">children</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">remove_duplicate_bonded_terms</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">if</span> <span class="n">children</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">children</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span> <span class="o">=</span> <span class="n">remove_duplicate_bonded_terms</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">bonds</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">dihedrals</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">impropers</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">exclusions</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">bond_angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">product_potentials</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="c1">## TODO: self.cacheInvalid = True # What will be in the cache?</span>
+
+<div class="viewcode-block" id="Parent.add">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
+        <span class="c1">## TODO: check the parent-child tree to make sure there are no cycles</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">Child</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Attempted to add an object to a group that does not inherit from the &quot;Child&quot; type&#39;</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Child </span><span class="si">{}</span><span class="s2"> already belongs to some group&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
+        <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.insert">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.insert">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">idx</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
+        <span class="c1">## TODO: check the parent-child tree to make sure there are no cycles</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">Child</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Attempted to add an object to a group that does not inherit from the &quot;Child&quot; type&#39;</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Child </span><span class="si">{}</span><span class="s2"> already belongs to some group&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
+        <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span><span class="n">x</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.index">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.index">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">x</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.clear_all">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.clear_all">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">clear_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keep_children</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">keep_children</span> <span class="o">==</span> <span class="kc">False</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+                <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="kc">None</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">bonds</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">dihedrals</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">impropers</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">exclusions</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">bond_angles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">product_potentials</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span> <span class="o">=</span> <span class="p">[]</span></div>
+
+
+<div class="viewcode-block" id="Parent.remove">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.remove">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="bp">self</span><span class="p">:</span>
+                <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="kc">None</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_center">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_center">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_center</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">weight</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">center</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="n">weight</span> <span class="o">==</span> <span class="s1">&#39;mass&#39;</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">center</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_bond">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_bond">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_bond</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span> <span class="n">bond</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="n">i</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">j</span> <span class="p">)</span>
+        <span class="c1">## TODO: how to handle duplicating and cloning bonds</span>
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">bonds</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span> <span class="n">bond</span><span class="p">,</span> <span class="n">exclude</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_angle">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_angle">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_angle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span> <span class="n">angle</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">((</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">)))</span> <span class="o">==</span> <span class="mi">3</span> <span class="p">)</span>
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j,k): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">angles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span> <span class="n">angle</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_dihedral">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_dihedral">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_dihedral</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">dihedral</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">((</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">)))</span> <span class="o">==</span> <span class="mi">4</span> <span class="p">)</span>
+
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j,k,l): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">dihedrals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">dihedral</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_vector_angle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">potential</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">((</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">)))</span> <span class="o">==</span> <span class="mi">4</span> <span class="p">)</span>
+
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j,k,l): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">potential</span><span class="p">)</span> <span class="p">)</span>
+
+<div class="viewcode-block" id="Parent.add_improper">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_improper">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_improper</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">dihedral</span><span class="p">):</span>
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j,k,l): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">impropers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">dihedral</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_exclusion">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_exclusion">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_exclusion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">):</span>
+        <span class="c1">## TODO: how to handle duplicating and cloning bonds</span>
+        <span class="c1">## TODO: perform following check elsewhere</span>
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">exclusions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_vector_angle">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_vector_angle">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_vector_angle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">potential</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">((</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">)))</span> <span class="o">&gt;=</span> <span class="mi">3</span> <span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">potential</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_bond_angle">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_bond_angle">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_bond_angle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">bond_angle</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">((</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">)))</span> <span class="o">==</span> <span class="mi">4</span> <span class="p">)</span>
+        <span class="c1">## TODO: how to handle duplicating and cloning bonds</span>
+        <span class="c1"># beads = [b for b in self]</span>
+        <span class="c1"># for b in (i,j): assert(b in beads)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">bond_angles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span> <span class="n">bond_angle</span><span class="p">)</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Parent.add_product_potential">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.add_product_potential">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_product_potential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">potential_list</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; potential_list: list of tuples of form (particle_i, particle_j,..., TabulatedPotential) &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">potential_list</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Too few potentials&quot;</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">elem</span> <span class="ow">in</span> <span class="n">potential_list</span><span class="p">:</span>
+            <span class="n">beads</span> <span class="o">=</span> <span class="n">elem</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+            <span class="n">pot</span> <span class="o">=</span> <span class="n">elem</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">beads</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Too few particles specified in product_potential&quot;</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">beads</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">4</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Too many particles specified in product_potential&quot;</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">product_potentials</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">potential_list</span><span class="p">)</span></div>
+
+        <span class="c1">## TODO: how to handle duplicating and cloning bonds</span>
+
+<div class="viewcode-block" id="Parent.get_restraints">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_restraints">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_restraints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span> <span class="o">+</span>  <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span><span class="p">:</span>
+            <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_restraints</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">return</span> <span class="n">ret</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_bonds">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_bonds">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_bonds</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bonds</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+
+<div class="viewcode-block" id="Parent.get_angles">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_angles">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_angles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">angles</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_angles</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_dihedrals">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_dihedrals">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_dihedrals</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dihedrals</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_dihedrals</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_vector_angles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">vector_angles</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span>
+
+<div class="viewcode-block" id="Parent.get_impropers">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_impropers">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_impropers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">impropers</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_impropers</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_exclusions">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_exclusions">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_exclusions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">exclusions</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_exclusions</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_vector_angles">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_vector_angles">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_vector_angles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vector_angles</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_vector_angles</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_bond_angles">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_bond_angles">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_bond_angles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bond_angles</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_bond_angles</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+<div class="viewcode-block" id="Parent.get_product_potentials">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Parent.get_product_potentials">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_product_potentials</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">ret</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">product_potentials</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">c</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span> <span class="n">ret</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span> <span class="n">c</span><span class="o">.</span><span class="n">get_product_potentials</span><span class="p">()</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicate_bonded_terms</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">ret</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_bond_potentials</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">bonds</span> <span class="o">=</span>  <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">ex</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">()]</span>
+        <span class="n">bondangles1</span> <span class="o">=</span> <span class="p">[</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_bond_angles</span><span class="p">()]</span>
+        <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">bonds</span><span class="o">+</span><span class="n">bondangles1</span><span class="p">)</span> <span class="p">))</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_angle_potentials</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">angles</span> <span class="o">=</span>  <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_angles</span><span class="p">()]</span>
+        <span class="n">bondangles1</span> <span class="o">=</span> <span class="p">[</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_bond_angles</span><span class="p">()]</span>
+        <span class="n">bondangles2</span> <span class="o">=</span> <span class="p">[</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_bond_angles</span><span class="p">()]</span>
+        <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">angles</span><span class="o">+</span><span class="n">bondangles1</span><span class="o">+</span><span class="n">bondangles2</span><span class="p">)</span> <span class="p">))</span>
+
+
+    <span class="c1">## Removed because prohibitively slow</span>
+    <span class="c1"># def remove_duplicate_terms(self):</span>
+    <span class="c1">#     for key in &quot;bonds angles dihedrals impropers exclusions&quot;.split():</span>
+    <span class="c1">#         self.remove_duplicate_item(key)</span>
+
+    <span class="c1"># def remove_duplicate_item(self, dict_key, existing=None):</span>
+    <span class="c1">#     if existing is None: existing = []</span>
+    <span class="c1">#     ret = [i for i in list(set(self.__dict__[dict_key])) if i not in existing]</span>
+    <span class="c1">#     self.__dict__[dict_key] = ret</span>
+    <span class="c1">#     existing.extend(ret)</span>
+    <span class="c1">#     for c in self.children:</span>
+    <span class="c1">#         if isinstance(c,Parent): </span>
+    <span class="c1">#             ret = ret + c.remove_duplicate_item(dict_key, existing)</span>
+    <span class="c1">#     return ret</span>
+        
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">## TODO: decide if this is the nicest way to do it!</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Depth-first iteration through tree&quot;&quot;&quot;</span>
+        <span class="c1"># devlogger.info(f&#39;{self}.__iter__(): 0th child {None if len(self.children) == 0 else self.children[0]}&#39;)</span>
+        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span>
+                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">Clone</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">get_original_recursively</span><span class="p">(),</span><span class="n">Parent</span><span class="p">):</span>
+                    <span class="k">yield</span> <span class="n">x</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">x</span><span class="p">:</span>
+                        <span class="k">yield</span> <span class="n">y</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">yield</span> <span class="n">x</span>    
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">l</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">Parent</span><span class="p">):</span>
+                <span class="n">l</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">l</span> <span class="o">+=</span> <span class="mi">1</span>
+        <span class="k">return</span> <span class="n">l</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
+        <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+        <span class="n">x</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="n">val</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span></div>
+
+        
+<div class="viewcode-block" id="Child">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Child">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">Child</span><span class="p">():</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
+        <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">assert</span><span class="p">(</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">Parent</span><span class="p">)</span> <span class="p">)</span>
+            <span class="n">parent</span><span class="o">.</span><span class="n">children</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Try to get attribute from the parent</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># if self.parent is not None:</span>
+        <span class="k">if</span> <span class="s2">&quot;parent&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">&quot;parent&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;children&quot;</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+
+        <span class="c1">## Skip certain attributes from search</span>
+        <span class="n">excluded_attributes</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;parent&#39;</span><span class="p">]</span>
+        <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">excluded_attributes</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39; and cannot look it up from the parent&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+
+        <span class="c1">## TODO: determine if there is a way to avoid __getattr__ if a method is being looked up  </span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">ret</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span><span class="n">name</span><span class="p">)</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+        <span class="k">if</span> <span class="n">ismethod</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no method &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+        <span class="k">return</span> <span class="n">ret</span> 
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_clear_types</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">_clear_types</span><span class="p">()</span></div>
+
+            
+    <span class="c1"># def __getstate__(self):</span>
+    <span class="c1">#     print(&quot;Child getstate called&quot;, self)</span>
+    <span class="c1">#     print(self.__dict__)</span>
+    <span class="c1">#     return (self.__dict__,)</span>
+
+    <span class="c1"># def __setstate__(self, state):</span>
+    <span class="c1">#     self.__dict__, = state</span>
+
+<div class="viewcode-block" id="Clone">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Clone">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">Clone</span><span class="p">(</span><span class="n">Transformable</span><span class="p">,</span> <span class="n">Parent</span><span class="p">,</span> <span class="n">Child</span><span class="p">):</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">position</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+                 <span class="n">orientation</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">position</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">original</span><span class="o">.</span><span class="n">position</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">position</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span> <span class="n">original</span><span class="o">.</span><span class="n">position</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="n">orientation</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">original</span><span class="o">.</span><span class="n">orientation</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">orientation</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span> <span class="n">original</span><span class="o">.</span><span class="n">orientation</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">parent</span> <span class="o">=</span> <span class="n">original</span><span class="o">.</span><span class="n">parent</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">original</span> <span class="o">=</span> <span class="n">original</span>
+        <span class="n">Child</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span>        
+        <span class="n">Transformable</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">orientation</span><span class="p">)</span>        
+
+        <span class="c1">## TODO: keep own bond_list, etc, update when needed original changes</span>
+
+        <span class="k">if</span> <span class="s2">&quot;children&quot;</span> <span class="ow">in</span> <span class="n">original</span><span class="o">.</span><span class="vm">__dict__</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">original</span><span class="o">.</span><span class="n">children</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="p">[</span><span class="n">Clone</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">original</span><span class="o">.</span><span class="n">children</span><span class="p">]</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="p">[]</span>
+
+<div class="viewcode-block" id="Clone.get_original_recursively">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Clone.get_original_recursively">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_original_recursively</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">original</span><span class="p">,</span> <span class="n">Clone</span><span class="p">):</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">original</span><span class="o">.</span><span class="n">get_original_recursively</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">original</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Try to get attribute from the original without descending the tree heirarchy, then look up parent</span>
+
+<span class="sd">        TODO: handle PointParticle lookups into ParticleType</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># print(&quot;Clone getattr&quot;,name)</span>
+        <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">original</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
+            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">original</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">if</span> <span class="s2">&quot;parent&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">&quot;parent&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+            <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div>
+
+        
+<span class="c1">## Particle classes</span>
+<div class="viewcode-block" id="ParticleType">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.ParticleType">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">ParticleType</span><span class="p">():</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Class that hold common attributes that particles can point to&quot;&quot;&quot;</span>
+
+    <span class="n">excludedAttributes</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;idx&quot;</span><span class="p">,</span><span class="s2">&quot;type_&quot;</span><span class="p">,</span>
+                          <span class="s2">&quot;position&quot;</span><span class="p">,</span>
+                          <span class="s2">&quot;orientation&quot;</span><span class="p">,</span>
+                          <span class="s2">&quot;children&quot;</span><span class="p">,</span>
+                          <span class="s2">&quot;name&quot;</span><span class="p">,</span>
+                          <span class="s2">&quot;parent&quot;</span><span class="p">,</span> <span class="s2">&quot;excludedAttributes&quot;</span><span class="p">,</span>
+    <span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">charge</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">mass</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">diffusivity</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">damping_coefficient</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">rigid_body_potentials</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Parent type is used to fall back on for nonbonded</span>
+<span class="sd">        interactions if this type is not specifically referenced &quot;&quot;&quot;</span>
+
+        <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">parent</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ParticleType</span><span class="o">.</span><span class="n">excludedAttributes</span><span class="p">:</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+            <span class="k">assert</span><span class="p">(</span> <span class="nb">type</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span> <span class="o">==</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="p">)</span>
+
+        <span class="c1"># if diffusivity is None:</span>
+        <span class="c1">#     assert( (damping_coefficient is not None) and (mass is not None) )</span>
+
+        <span class="c1">## TODO: make most attributes @property</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span>   <span class="o">=</span> <span class="n">name</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">charge</span> <span class="o">=</span> <span class="n">charge</span>
+        <span class="k">if</span> <span class="n">mass</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="n">mass</span>
+        <span class="k">if</span> <span class="n">damping_coefficient</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">damping_coefficient</span> <span class="o">=</span> <span class="n">damping_coefficient</span>
+        <span class="k">if</span> <span class="n">diffusivity</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">diffusivity</span> <span class="o">=</span> <span class="n">diffusivity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_body_potentials</span> <span class="o">=</span> <span class="n">rigid_body_potentials</span>
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Created </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s1"> @ </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+        
+        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">ParticleType</span><span class="o">.</span><span class="n">excludedAttributes</span><span class="p">:</span>
+            <span class="k">assert</span><span class="p">(</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span> <span class="p">)</span>
+
+        <span class="k">for</span> <span class="n">key</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
+
+<div class="viewcode-block" id="ParticleType.is_same_type">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.ParticleType.is_same_type">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">is_same_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="n">consider_parents</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">type</span><span class="p">(</span><span class="n">other</span><span class="p">)</span> <span class="o">==</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="bp">self</span> <span class="o">==</span> <span class="n">other</span><span class="p">:</span>
+            <span class="k">return</span> <span class="kc">True</span>
+        <span class="k">elif</span> <span class="n">consider_parents</span><span class="p">:</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">==</span> <span class="n">other</span><span class="p">:</span>
+                <span class="k">return</span> <span class="kc">True</span>
+            <span class="k">elif</span> <span class="n">other</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">other</span><span class="o">.</span><span class="n">parent</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
+                <span class="k">return</span> <span class="kc">True</span>
+            <span class="c1"># elif other.parent is not None and self.parent is not None and other.parent == self.parent:</span>
+            <span class="c1">#     return True</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">return</span> <span class="kc">False</span></div>
+
+
+<div class="viewcode-block" id="ParticleType.add_grid_potential">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.ParticleType.add_grid_potential">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_grid_potential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gridfile</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">boundary_condition</span><span class="o">=</span><span class="s1">&#39;dirichlet&#39;</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">boundary_condition</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;dirichlet&#39;</span><span class="p">,</span><span class="s1">&#39;neumann&#39;</span><span class="p">,</span><span class="s1">&#39;periodic&#39;</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Unrecognized grid boundary condition &quot;</span><span class="si">{</span><span class="n">boundary_condition</span><span class="si">}</span><span class="s1">&quot;; should be one of &quot;dirichlet&quot;, &quot;neumann&quot; or &quot;periodic&quot;.&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">grid_potentials</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;grid_potentials&#39;</span><span class="p">,</span> <span class="p">[])</span> <span class="o">+</span> <span class="p">[(</span><span class="n">gridfile</span><span class="p">,</span><span class="n">scale</span><span class="p">,</span><span class="n">boundary_condition</span><span class="p">)]</span></div>
+
+        
+    <span class="k">def</span><span class="w"> </span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Try to get attribute from the parent</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="s2">&quot;parent&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">&quot;parent&quot;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;children&quot;</span><span class="p">:</span>
+           <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+
+        <span class="n">excluded_attributes</span> <span class="o">=</span> <span class="n">ParticleType</span><span class="o">.</span><span class="n">excludedAttributes</span>
+        <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">excluded_attributes</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39; and cannot look it up from the parent&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+
+        <span class="c1">## TODO: determine if there is a way to avoid __getattr__ if a method is being looked up</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">ret</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span><span class="n">name</span><span class="p">)</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+        <span class="k">if</span> <span class="n">ismethod</span><span class="p">(</span><span class="n">ret</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no method &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+        <span class="k">return</span> <span class="n">ret</span> 
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_hash_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+
+        <span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)),</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">charge</span><span class="p">]</span>
+        <span class="k">for</span> <span class="n">keyval</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">keyval</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nb">list</span><span class="p">):</span> <span class="n">keyval</span> <span class="o">=</span> <span class="p">(</span><span class="n">keyval</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="nb">tuple</span><span class="p">(</span><span class="n">keyval</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
+            <span class="n">l</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">keyval</span><span class="p">)</span>
+        <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_hash_key</span><span class="p">())</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_equal_check</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">_hash_key</span><span class="p">()</span> <span class="o">!=</span> <span class="n">b</span><span class="o">.</span><span class="n">_hash_key</span><span class="p">():</span>
+                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Two different ParticleTypes have same &#39;name&#39; attribute&quot;</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span> <span class="n">check_equal</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">check_equal</span><span class="p">:</span> <span class="n">a</span><span class="o">.</span><span class="n">_equal_check</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__lt__</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
+        <span class="n">a</span><span class="o">.</span><span class="n">_equal_check</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">&lt;</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__le__</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
+        <span class="n">a</span><span class="o">.</span><span class="n">_equal_check</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">&lt;=</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__gt__</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
+        <span class="n">a</span><span class="o">.</span><span class="n">_equal_check</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">&gt;</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__ge__</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
+        <span class="n">a</span><span class="o">.</span><span class="n">_equal_check</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">{}</span><span class="s1"> </span><span class="si">{}{}</span><span class="s1">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="s1">&#39;[</span><span class="si">{}</span><span class="s1">]&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="s1">&#39;&#39;</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="RigidBodyType">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.RigidBodyType">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">RigidBodyType</span><span class="p">(</span><span class="n">ParticleType</span><span class="p">):</span>
+
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Class that holds common attributes for RigidBody objects&quot;&quot;&quot;</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">moment_of_inertia</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+                 <span class="n">rotational_diffusivity</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+                 <span class="n">rotational_damping_coefficient</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+                 <span class="n">attached_particles</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span> <span class="n">potential_grids</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span>
+                 <span class="n">charge_grids</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span> <span class="n">pmf_grids</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Parent type is used to fall back on for nonbonded</span>
+<span class="sd">        interactions if this type is not specifically referenced &quot;&quot;&quot;</span>
+
+        <span class="k">if</span> <span class="n">rotational_diffusivity</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">assert</span><span class="p">(</span> <span class="p">(</span><span class="n">rotational_damping_coefficient</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">moment_of_inertia</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)</span> <span class="p">)</span>
+
+        <span class="k">for</span> <span class="n">_grids</span> <span class="ow">in</span> <span class="p">(</span><span class="n">potential_grids</span><span class="p">,</span><span class="n">charge_grids</span><span class="p">,</span><span class="n">pmf_grids</span><span class="p">):</span>
+            <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">_grids</span><span class="p">:</span>
+                <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span> <span class="p">)</span> <span class="c1">#                 </span>
+                
+        <span class="n">ParticleType</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">parent</span><span class="p">,</span>
+                              <span class="n">moment_of_inertia</span> <span class="o">=</span> <span class="n">moment_of_inertia</span><span class="p">,</span>
+                              <span class="n">rotational_diffusivity</span><span class="o">=</span><span class="n">rotational_diffusivity</span><span class="p">,</span>
+                              <span class="n">rotational_damping_coefficient</span> <span class="o">=</span> <span class="n">rotational_damping_coefficient</span><span class="p">,</span>
+                              <span class="n">potential_grids</span> <span class="o">=</span> <span class="n">potential_grids</span><span class="p">,</span>
+                              <span class="n">charge_grids</span> <span class="o">=</span> <span class="n">charge_grids</span><span class="p">,</span>
+                              <span class="n">pmf_grids</span> <span class="o">=</span> <span class="n">pmf_grids</span><span class="p">,</span>
+                              <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">attached_particles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">attached_particles</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">attach_particle</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+
+<div class="viewcode-block" id="RigidBodyType.attach_particle">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.RigidBodyType.attach_particle">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">attach_particle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">particle</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; The particle argument must be a PointParticle. The position/orientation of the attached particle/group is in the RigidBody frame. &quot;&quot;&quot;</span>
+        
+        <span class="k">if</span> <span class="n">particle</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;RigidBody-attached particles are not allowed to have a parent&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">attached_particles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">particle</span> <span class="p">)</span></div>
+
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_equal_check</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">b</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">_hash_key</span><span class="p">()</span> <span class="o">!=</span> <span class="n">b</span><span class="o">.</span><span class="n">_hash_key</span><span class="p">():</span>
+                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Two different RigidBodyTypes have same &#39;name&#39; attribute&quot;</span><span class="p">)</span>    </div>
+
+
+<div class="viewcode-block" id="PointParticle">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.PointParticle">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">PointParticle</span><span class="p">(</span><span class="n">Transformable</span><span class="p">,</span> <span class="n">Child</span><span class="p">):</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">type_</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;A&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+        <span class="n">parent</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">if</span> <span class="s1">&#39;parent&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+            <span class="n">parent</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;parent&#39;</span><span class="p">]</span>
+        <span class="n">Child</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">parent</span><span class="p">)</span>
+        <span class="n">Transformable</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">position</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_</span>    <span class="o">=</span> <span class="n">type_</span>                
+        <span class="bp">self</span><span class="o">.</span><span class="n">idx</span>     <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid</span> <span class="o">=</span> <span class="kc">False</span>
+        
+        <span class="k">for</span> <span class="n">key</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
+        
+<div class="viewcode-block" id="PointParticle.add_restraint">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.PointParticle.add_restraint">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_restraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">restraint</span><span class="p">):</span>
+        <span class="c1">## TODO: how to handle duplicating and cloning bonds</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">restraint</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="PointParticle.add_grid_potential">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.PointParticle.add_grid_potential">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_grid_potential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gridfile</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">boundary_condition</span><span class="o">=</span><span class="s1">&#39;dirichlet&#39;</span><span class="p">):</span>
+        <span class="n">t0</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">type_</span>
+        <span class="n">name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">t0</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1">_g_</span><span class="si">{</span><span class="n">gridfile</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;.dx&quot;</span><span class="p">,</span><span class="s2">&quot;&quot;</span><span class="p">)</span><span class="si">}</span><span class="s1">_s_</span><span class="si">{</span><span class="n">scale</span><span class="si">}</span><span class="s1">&#39;</span>
+        <span class="k">if</span> <span class="n">t0</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="n">t0</span><span class="p">)</span>
+            <span class="n">t</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="c1"># TODO: REMOVE LINE: t = ParticleType(name, parent=t0)</span>
+             <span class="n">t</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">t0</span><span class="p">)(</span><span class="n">name</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">t0</span><span class="p">)</span>
+        <span class="n">t</span><span class="o">.</span><span class="n">add_grid_potential</span><span class="p">(</span><span class="n">gridfile</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="n">scale</span><span class="p">,</span> <span class="n">boundary_condition</span><span class="o">=</span><span class="n">boundary_condition</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_</span> <span class="o">=</span> <span class="n">t</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_clear_types</span><span class="p">()</span></div>
+
+        
+<div class="viewcode-block" id="PointParticle.get_restraints">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.PointParticle.get_restraints">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_restraints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span><span class="n">r</span><span class="p">)</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span><span class="p">]</span></div>
+
+
+<div class="viewcode-block" id="PointParticle.duplicate">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.PointParticle.duplicate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">duplicate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">new</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">new</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        First try to get attribute from the parent, then type_</span>
+<span class="sd">        </span>
+<span class="sd">        Note that this data structure seems to be fragile, can result in stack overflow</span>
+<span class="sd">        </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;__copy__&#39;</span><span class="p">,</span><span class="s1">&#39;__deepcopy__&#39;</span><span class="p">):</span>
+            <span class="c1">## Avoid using type_ and parent __copy__/__deepcopy__ functions!</span>
+            <span class="k">return</span> <span class="kc">None</span>
+
+        <span class="c1"># return Child.__getattr__(self,name)</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">Child</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)</span>
+        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+            <span class="k">if</span> <span class="s1">&#39;type_&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
+                <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;parent&#39;</span><span class="p">:</span>
+                    <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Programming error&#39;</span><span class="p">)</span>
+                <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type_</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;&#39;</span><span class="si">{}</span><span class="s2">&#39; object has no attribute &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_psfpdb_dictionary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">p</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">segname</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">segname</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">segname</span> <span class="o">=</span> <span class="s2">&quot;A&quot;</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">chain</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">chain</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">chain</span> <span class="o">=</span> <span class="s2">&quot;A&quot;</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">resname</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">resname</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">resname</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">name</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">resid</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">resid</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">resid</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">mass</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">mass</span>
+            <span class="k">if</span> <span class="n">mass</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">mass</span> <span class="o">=</span> <span class="mi">1</span>
+
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">occ</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">occupancy</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">occ</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">beta</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">beta</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">beta</span> <span class="o">=</span> <span class="mi">0</span>
+
+        <span class="n">data</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">segname</span> <span class="o">=</span> <span class="n">segname</span><span class="p">,</span>
+                    <span class="n">resname</span> <span class="o">=</span> <span class="n">resname</span><span class="p">,</span>
+                    <span class="n">name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">name</span><span class="p">)[:</span><span class="mi">4</span><span class="p">],</span>
+                    <span class="n">chain</span> <span class="o">=</span> <span class="n">chain</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
+                    <span class="n">resid</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">resid</span><span class="p">),</span>
+                    <span class="n">idx</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>
+                    <span class="nb">type</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">type_</span><span class="o">.</span><span class="n">name</span><span class="p">[:</span><span class="mi">7</span><span class="p">],</span>
+                    <span class="n">charge</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">charge</span><span class="p">,</span>
+                    <span class="n">mass</span> <span class="o">=</span> <span class="n">mass</span><span class="p">,</span>
+                    <span class="n">occupancy</span> <span class="o">=</span> <span class="n">occ</span><span class="p">,</span>
+                    <span class="n">beta</span> <span class="o">=</span> <span class="n">beta</span>
+                <span class="p">)</span>
+        <span class="k">return</span> <span class="n">data</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="sa">f</span><span class="s1">&#39;&lt;</span><span class="si">{</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1"> &quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1">&quot; of </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">type_</span><span class="si">}</span><span class="s1">&gt;&#39;</span></div>
+
+
+<div class="viewcode-block" id="RigidBody">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.RigidBody">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">RigidBody</span><span class="p">(</span><span class="n">PointParticle</span><span class="p">):</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">type_</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">orientation</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;A&quot;</span><span class="p">,</span> <span class="n">attached_particles</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+        <span class="n">parent</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">if</span> <span class="s1">&#39;parent&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+            <span class="n">parent</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;parent&#39;</span><span class="p">]</span>
+        <span class="n">Child</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">parent</span><span class="p">)</span>
+        <span class="n">Transformable</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">position</span><span class="p">,</span> <span class="n">orientation</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">type_</span><span class="p">)</span> <span class="o">!=</span> <span class="n">RigidBodyType</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Attempted to create a RigidBody object from an invalid type </span><span class="si">{</span><span class="n">type_</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_</span>    <span class="o">=</span> <span class="n">type_</span>                
+        <span class="bp">self</span><span class="o">.</span><span class="n">idx</span>     <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid</span> <span class="o">=</span> <span class="kc">True</span>
+
+        <span class="c1">## TODO: it should be possible to uniquely apply bonds/angles etc to these particles, but their types should be fixed or otherwise unified among rbs; here we are copying them simply so that they can recieve and index and be used in bonded potentials and group sites</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">attached_particles</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">type_</span><span class="o">.</span><span class="n">attached_particles</span><span class="p">]</span>
+        
+        <span class="k">for</span> <span class="n">key</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
+        
+<div class="viewcode-block" id="RigidBody.add_restraint">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.RigidBody.add_restraint">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_restraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">restraint</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">&#39;Harmonic restraints are not yet supported for rigid bodies; consider implementing this by attaching a dummy particle&#39;</span><span class="p">)</span>
+        <span class="c1">## TODO: how to handle duplicating and cloning bonds</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">restraint</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="RigidBody.get_restraints">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.RigidBody.get_restraints">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_restraints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span><span class="n">r</span><span class="p">)</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span><span class="p">]</span></div>
+
+
+<div class="viewcode-block" id="RigidBody.duplicate">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.RigidBody.duplicate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">duplicate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">new</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">new</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        First try to get attribute from the parent, then type_</span>
+<span class="sd">        </span>
+<span class="sd">        Note that this data structure seems to be fragile, can result in stack overflow</span>
+<span class="sd">        </span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># return Child.__getattr__(self,name)</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">Child</span><span class="o">.</span><span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)</span>
+        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+            <span class="k">if</span> <span class="s1">&#39;type_&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
+                <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type_</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;&#39;{type(self).__name__}&#39; object has no attribute &#39;</span><span class="si">{name}</span><span class="s2">&#39;&quot;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Group">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Group">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">Group</span><span class="p">(</span><span class="n">Transformable</span><span class="p">,</span> <span class="n">Parent</span><span class="p">,</span> <span class="n">Child</span><span class="p">):</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">children</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                 <span class="n">position</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)),</span>
+                 <span class="n">orientation</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(((</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">))),</span>
+                 <span class="n">remove_duplicate_bonded_terms</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
+                 <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+
+        <span class="n">Transformable</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">orientation</span><span class="p">)</span>
+        <span class="n">Child</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">)</span> <span class="c1"># Initialize Child first</span>
+        <span class="n">Parent</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">children</span><span class="p">,</span> <span class="n">remove_duplicate_bonded_terms</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">isClone</span> <span class="o">=</span> <span class="kc">False</span>
+
+        <span class="k">for</span> <span class="n">key</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
+
+
+<div class="viewcode-block" id="Group.clone">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Group.clone">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">clone</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="n">Clone</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+        <span class="n">g</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+        <span class="n">g</span><span class="o">.</span><span class="n">isClone</span> <span class="o">=</span> <span class="kc">True</span>        <span class="c1"># TODO: use?</span>
+        <span class="n">g</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="p">[</span><span class="n">copy</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">g</span><span class="o">.</span><span class="n">children</span><span class="p">]</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">g</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">g</span>
+        <span class="k">return</span> <span class="n">g</span>
+        <span class="n">g</span> <span class="o">=</span> <span class="n">Group</span><span class="p">(</span><span class="n">position</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">position</span><span class="p">,</span>
+                  <span class="n">orientation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">orientation</span><span class="p">)</span>
+        <span class="n">g</span><span class="o">.</span><span class="n">children</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span> <span class="c1"># lists point to the same object</span></div>
+
+
+<div class="viewcode-block" id="Group.duplicate">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.Group.duplicate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">duplicate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">new</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">new</span><span class="o">.</span><span class="n">children</span><span class="p">:</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">new</span>
+        <span class="k">return</span> <span class="n">new</span></div>
+</div>
+
+
+    <span class="c1">## TODO override deepcopy so parent can be excluded from copying?</span>
+        
+    <span class="c1"># def __getstate__(self):</span>
+    <span class="c1">#     return (self.children, self.parent, self.position, self.orientation)</span>
+
+    <span class="c1"># def __setstate__(self, state):</span>
+    <span class="c1">#     self.children, self.parent, self.position, self.orientation = state</span>
+
+<span class="c1">#Not sure where should it go</span>
+<div class="viewcode-block" id="GroupSite">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.GroupSite">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">GroupSite</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; Class to represent a collection of particles that can be used by bond potentials. In arbdmodel only &quot;&quot;&quot;</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">particles</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">weights</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="n">particles</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">idx</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span> <span class="o">=</span> <span class="p">[]</span>
+        
+<div class="viewcode-block" id="GroupSite.get_center">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.GroupSite.get_center">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_center</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">c</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+            <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="n">p</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()</span>
+        <span class="n">c</span> <span class="o">=</span> <span class="n">c</span> <span class="o">/</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span></div>
+
+
+<div class="viewcode-block" id="GroupSite.add_restraint">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.GroupSite.add_restraint">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_restraint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">restraint</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">restraint</span><span class="p">)</span></div>
+
+        
+<div class="viewcode-block" id="GroupSite.get_restraints">
+<a class="viewcode-back" href="../../api/core/core_objects.html#arbdmodel.core_objects.GroupSite.get_restraints">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_restraints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">restraints</span><span class="p">]</span></div>
+</div>
+
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/engine.html b/_build/html/_modules/arbdmodel/engine.html
new file mode 100644
index 0000000000000000000000000000000000000000..d6ee79f69a2270a038e340148eb6ee7c874a8cd4
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/engine.html
@@ -0,0 +1,1766 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.engine &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/engine';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.engine</h1><div class="highlight"><pre>
+<span></span><span class="c1">## Import packages</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">sys</span><span class="o">,</span><span class="w"> </span><span class="nn">subprocess</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">platform</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">abc</span><span class="w"> </span><span class="kn">import</span> <span class="n">abstractmethod</span><span class="p">,</span> <span class="n">ABCMeta</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">shutil</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.core_objects</span><span class="w"> </span><span class="kn">import</span> <span class="n">GroupSite</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">devlogger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">get_resource_path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.interactions</span><span class="w"> </span><span class="kn">import</span> <span class="n">NullPotential</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.sim_config</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimConf</span>
+
+
+<span class="sd">&quot;&quot;&quot; SimEngines</span>
+<span class="sd">Abstract classes for running simulations with different engines.</span>
+<span class="sd">SimEngine is the base class for all simulation engines.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<div class="viewcode-block" id="SimEngine">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.SimEngine">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SimEngine</span><span class="p">(</span><span class="n">metaclass</span><span class="o">=</span><span class="n">ABCMeta</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; Abstract class for running a simulation of a model &quot;&quot;&quot;</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">configuration</span> <span class="o">=</span> <span class="n">configuration</span>
+
+    <span class="nd">@property</span>
+    <span class="nd">@abstractmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">default_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="o">...</span>
+
+    <span class="nd">@abstractmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">_generate_command_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">output_directory</span><span class="p">,</span> <span class="n">gpu</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">replicas</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+        <span class="o">...</span>
+
+<div class="viewcode-block" id="SimEngine.write_simulation_files">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.write_simulation_files">[docs]</a>
+    <span class="nd">@abstractmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_simulation_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">):</span>
+        <span class="o">...</span></div>
+
+
+<div class="viewcode-block" id="SimEngine.get_default_conf">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.get_default_conf">[docs]</a>
+    <span class="nd">@abstractmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_default_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="o">...</span></div>
+
+        
+<div class="viewcode-block" id="SimEngine.simulate">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.simulate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">simulate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">output_directory</span><span class="o">=</span><span class="s1">&#39;output&#39;</span><span class="p">,</span>
+                 <span class="n">directory</span><span class="o">=</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="n">log_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">binary</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">num_procs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dry_run</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span> <span class="n">configuration</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">replicas</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+
+        <span class="c1">## TODO: Allow _get_combined_conf to take certain parameters as arguments, or otherwise refactor to make this more elegant</span>
+        <span class="n">gpu</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span><span class="o">.</span><span class="n">gpu</span>
+        <span class="k">assert</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">gpu</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">int</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">num_procs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">import</span><span class="w"> </span><span class="nn">multiprocessing</span>
+            <span class="n">num_procs</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">multiprocessing</span><span class="o">.</span><span class="n">cpu_count</span><span class="p">()</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+
+        <span class="n">d_orig</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">model</span><span class="o">.</span><span class="n">_d_orig</span> <span class="o">=</span> <span class="n">d_orig</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
+                <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
+
+            <span class="n">model</span><span class="o">.</span><span class="n">prepare_for_simulation</span><span class="p">()</span>
+
+            <span class="k">if</span> <span class="n">output_directory</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span> <span class="n">output_directory</span><span class="o">=</span><span class="s1">&#39;.&#39;</span>
+
+            <span class="k">if</span> <span class="n">dry_run</span><span class="p">:</span>
+                <span class="k">if</span> <span class="n">binary</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">binary</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">binary</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_binary</span><span class="p">(</span><span class="n">binary</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">output_directory</span><span class="p">):</span>
+                <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">output_directory</span><span class="p">)</span>
+            <span class="k">elif</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">output_directory</span><span class="p">):</span>
+                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;output_directory &#39;</span><span class="si">%s</span><span class="s2">&#39; is not a directory!&quot;</span> <span class="o">%</span> <span class="n">output_directory</span><span class="p">)</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">write_simulation_files</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+
+            <span class="c1">## http://stackoverflow.com/questions/18421757/live-output-from-subprocess-command</span>
+            <span class="n">cmd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_generate_command_string</span><span class="p">(</span><span class="n">binary</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">output_directory</span><span class="p">,</span> <span class="n">num_procs</span><span class="p">,</span> <span class="n">gpu</span><span class="p">,</span> <span class="n">replicas</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="n">dry_run</span><span class="p">:</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Run with: </span><span class="si">{</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Running </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span><span class="si">}</span><span class="s1"> with: </span><span class="si">{</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">log_file</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span><span class="s1">&#39;write&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">callable</span><span class="p">(</span><span class="n">log_file</span><span class="o">.</span><span class="n">write</span><span class="p">)):</span>
+                    <span class="n">fd</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span> <span class="k">if</span> <span class="n">log_file</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">log_file</span>
+                    <span class="n">process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="c1"># , universal_newlines=True)</span>
+                    <span class="c1">## re-open to get \r recognized as new line</span>
+                    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">dup</span><span class="p">(</span><span class="n">process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()),</span> <span class="n">newline</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">nice_stdout</span><span class="p">:</span>
+                        <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">nice_stdout</span><span class="p">:</span>
+                            <span class="k">try</span><span class="p">:</span>
+                                <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
+                            <span class="k">except</span><span class="p">:</span>
+                                <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WARNING: could not encode line; your locale might not be set correctly&quot;</span><span class="p">)</span>
+                            <span class="n">fd</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">log_file</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fd</span><span class="p">:</span>
+                        <span class="n">process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">log_file</span><span class="p">,</span> <span class="n">universal_newlines</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+                        <span class="n">process</span><span class="o">.</span><span class="n">communicate</span><span class="p">()</span>
+
+        <span class="k">except</span><span class="p">:</span>
+            <span class="k">raise</span>
+        <span class="k">finally</span><span class="p">:</span>
+            <span class="k">del</span> <span class="n">model</span><span class="o">.</span><span class="n">_d_orig</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">d_orig</span><span class="p">)</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">binary</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.binary_manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">BinaryManager</span>
+            <span class="n">binary_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span>
+            <span class="n">binary</span> <span class="o">=</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">get_binary_path</span><span class="p">(</span><span class="n">binary_name</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">binary</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s2">&quot;PATH&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">pathsep</span><span class="p">):</span>
+                <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;&quot;&#39;</span><span class="p">)</span>
+                <span class="n">fname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">fname</span><span class="p">)</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">fname</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">):</span>
+                    <span class="n">binary</span> <span class="o">=</span> <span class="n">fname</span>
+                    <span class="k">break</span>
+        <span class="k">if</span> <span class="n">binary</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> was not found&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span><span class="p">))</span>
+
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">binary</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> was not found&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span><span class="p">))</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">binary</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> was not found&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span><span class="p">))</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="n">binary</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{}</span><span class="s2"> is not executable&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_binary</span><span class="p">))</span>
+
+        <span class="k">return</span> <span class="n">binary</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_combined_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="n">conf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_default_conf</span><span class="p">()</span> 
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">configuration</span><span class="p">)</span>
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">configuration</span><span class="p">)</span>
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="n">SimConf</span><span class="p">(</span><span class="o">**</span><span class="n">conf_params</span><span class="p">))</span>
+        <span class="k">return</span> <span class="n">conf</span>
+
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; TODO: Remove</span>
+<span class="sd">    # def _configuration_as_dict(self, model):</span>
+<span class="sd">    #     params = dict()</span>
+<span class="sd">    #     for o in (self.configuration, self, model):</span>
+<span class="sd">    #         for k in _get_properties_and_dict_keys(o):</span>
+<span class="sd">    #             params[k] = o.__get_attribute__(k)</span>
+<span class="sd">    #     return params</span>
+<span class="sd">    &quot;&quot;&quot;</span></div>
+
+
+<div class="viewcode-block" id="ArbdEngine">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">ArbdEngine</span><span class="p">(</span><span class="n">SimEngine</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; Interface to ARBD simulation engine &quot;&quot;&quot;</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extra_bd_file_lines</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">extra_bd_file_lines</span> <span class="o">=</span> <span class="n">extra_bd_file_lines</span>
+        
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> 
+            <span class="n">configuration</span> <span class="o">=</span> <span class="n">SimConf</span><span class="p">(</span><span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        <span class="n">SimEngine</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">configuration</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_particles</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="p">[]</span>     <span class="c1"># TODO decide if this should belong here, or with model</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># TODO decide if this should belong here, or with model</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_written_bond_files</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>        
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">cacheUpToDate</span> <span class="o">=</span> <span class="kc">False</span>
+
+    <span class="nd">@property</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">default_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s1">&#39;arbd&#39;</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_generate_command_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">output_directory</span><span class="p">,</span> <span class="n">num_procs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">gpu</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">replicas</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">binary</span><span class="p">,</span> <span class="s1">&#39;-g&#39;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">gpu</span><span class="p">]</span>
+        <span class="k">if</span> <span class="n">replicas</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+            <span class="n">cmd</span> <span class="o">=</span> <span class="n">cmd</span> <span class="o">+</span> <span class="p">[</span><span class="s1">&#39;-r&#39;</span><span class="p">,</span><span class="n">replicas</span><span class="p">]</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="n">cmd</span> <span class="o">+</span> <span class="p">[</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.bd&quot;</span> <span class="o">%</span> <span class="n">output_name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">output_directory</span><span class="p">,</span> <span class="n">output_name</span><span class="p">)]</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">cmd</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">cmd</span>
+
+<div class="viewcode-block" id="ArbdEngine.get_default_conf">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine.get_default_conf">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_default_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">SimConf</span><span class="p">(</span><span class="n">num_steps</span><span class="o">=</span><span class="mf">1e5</span><span class="p">,</span> <span class="n">output_period</span><span class="o">=</span><span class="mf">1e3</span><span class="p">,</span>
+                 <span class="n">integrator</span><span class="o">=</span><span class="s1">&#39;MD&#39;</span><span class="p">,</span> <span class="n">timestep</span><span class="o">=</span><span class="mf">20e-6</span><span class="p">,</span> <span class="n">thermostat</span><span class="o">=</span><span class="s1">&#39;Langevin&#39;</span><span class="p">,</span> <span class="n">barostat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">temperature</span><span class="o">=</span><span class="mi">295</span><span class="p">,</span> <span class="n">pressure</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">cutoff</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">pairlist_distance</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">decomp_period</span><span class="o">=</span><span class="mi">40</span><span class="p">,</span> <span class="n">gpu</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
+                 <span class="n">seed</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">restart_file</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">conf</span></div>
+
+    
+    <span class="c1"># -------------------------- #</span>
+    <span class="c1"># Methods for printing model #</span>
+    <span class="c1"># -------------------------- #</span>
+
+<div class="viewcode-block" id="ArbdEngine.write_simulation_files">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine.write_simulation_files">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_simulation_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        
+        <span class="c1">## TODO: save and reference directories and prefixes using member data</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">potential_directory</span> <span class="o">=</span> <span class="s2">&quot;potentials&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+        <span class="n">rb_type_dirs</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="k">for</span> <span class="n">rbk</span><span class="p">,</span> <span class="n">num</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">rigid_body_type_counts</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">num</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">rbt</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">rigid_body_index</span><span class="p">[</span><span class="n">rbk</span><span class="p">]</span>
+                <span class="n">rb_dir</span> <span class="o">=</span> <span class="n">rbt</span><span class="o">.</span><span class="n">name</span>  <span class="c1"># Create top-level directory named after the RigidBodyType</span>
+                <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">rb_dir</span><span class="p">):</span>
+                    <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">rb_dir</span><span class="p">)</span>
+                <span class="n">rb_type_dirs</span><span class="p">[</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">rb_dir</span>
+        
+        <span class="n">main_potentials_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">potential_directory</span> 
+        <span class="bp">self</span><span class="o">.</span><span class="n">rb_type_dirs</span> <span class="o">=</span> <span class="n">rb_type_dirs</span>
+
+        <span class="n">model</span><span class="o">.</span><span class="n">write_psf</span><span class="p">(</span> <span class="n">output_name</span><span class="o">+</span><span class="s1">&#39;.psf&#39;</span> <span class="p">)</span>
+        <span class="n">model</span><span class="o">.</span><span class="n">write_pdb</span><span class="p">(</span> <span class="n">output_name</span><span class="o">+</span><span class="s1">&#39;.pdb&#39;</span> <span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_particle_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">output_name</span> <span class="o">+</span> <span class="s2">&quot;.particles.txt&quot;</span><span class="p">,</span> <span class="n">configuration</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_restraint_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.restraint.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_bond_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.bond.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_angle_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.angle.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_dihedral_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.dihedral.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_vector_angle_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.vecangle.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_exclusion_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.exclusion.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_bond_angle_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.bond-angle.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_product_potential_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.product_potential.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_group_sites_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">main_potentials_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">.group_sites.txt&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_rb_coordinate_file</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">configuration</span><span class="p">,</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s1">.rbcoords.txt&#39;</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_potential_files</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">directory</span><span class="o">=</span><span class="n">main_potentials_dir</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="n">configuration</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_rb_attached_particles_files</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="p">)</span></div>
+
+        <span class="c1">## , numSteps=numSteps, outputPeriod=outputPeriod, restart_file=restart_file )</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_particle_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">configuration</span><span class="o">.</span><span class="n">integrator</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;Brown&#39;</span><span class="p">,</span> <span class="s1">&#39;Brownian&#39;</span><span class="p">,</span> <span class="s1">&#39;BD&#39;</span><span class="p">):</span>
+                <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+                    <span class="n">data</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span><span class="n">p</span><span class="o">.</span><span class="n">type_</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">p</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()])</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;ATOM </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">data</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+                    <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span><span class="n">p</span><span class="o">.</span><span class="n">type_</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">p</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()]</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">p</span><span class="o">.</span><span class="n">momentum</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="k">try</span><span class="p">:</span>
+                            <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">p</span><span class="o">.</span><span class="n">velocity</span><span class="o">*</span><span class="n">p</span><span class="o">.</span><span class="n">mass</span>
+                        <span class="k">except</span><span class="p">:</span>
+                            <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;ATOM </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_rb_attached_particles_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">rbk</span><span class="p">,</span> <span class="n">num</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">rigid_body_type_counts</span><span class="p">:</span>
+                <span class="n">rbt</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">rigid_body_index</span><span class="p">[</span><span class="n">rbk</span><span class="p">]</span>
+                <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Writing attached particles file for rigid body type </span><span class="si">{</span><span class="n">rbt</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">num</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">attached_particles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                    <span class="c1"># Use RB-specific directory</span>
+                    <span class="n">rb_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rb_type_dirs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+                    <span class="k">if</span> <span class="ow">not</span> <span class="n">rb_dir</span><span class="p">:</span>
+                        <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No directory found for RigidBodyType </span><span class="si">{</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">, using default&quot;</span><span class="p">)</span>
+                        <span class="n">rb_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">potential_directory</span>
+                    
+                    <span class="c1"># Create the attached particles file inside the RB directory</span>
+                    <span class="n">f</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rb_dir</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;attached_particles.txt&quot;</span><span class="p">)</span>
+                    <span class="n">rbt</span><span class="o">.</span><span class="n">_attached_particles_filename</span> <span class="o">=</span> <span class="n">f</span>
+                    <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">rbt</span><span class="o">.</span><span class="n">attached_particles</span><span class="p">:</span>
+                            <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">position</span>
+                            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">p</span><span class="o">.</span><span class="n">type_</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">y</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">z</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_rigid_group_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">groups</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Deprecated&#39;</span><span class="p">)</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">groups</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;#Group</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="o">.</span><span class="n">trans_damping</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span> <span class="k">raise</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">g</span><span class="o">.</span><span class="n">trans_damping</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span><span class="p">)</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Group </span><span class="si">{}</span><span class="s2"> lacks 3-value &#39;trans_damping&#39; attribute&quot;</span><span class="p">)</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="o">.</span><span class="n">rot_damping</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span> <span class="k">raise</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">g</span><span class="o">.</span><span class="n">rot_damping</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span><span class="p">)</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Group </span><span class="si">{}</span><span class="s2"> lacks 3-value &#39;rot_damping&#39; attribute&quot;</span><span class="p">)</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">)))</span>
+                <span class="n">particles</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">g</span><span class="p">]</span>
+
+                <span class="k">def</span><span class="w"> </span><span class="nf">chunks</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
+<span class="w">                    </span><span class="sd">&quot;&quot;&quot;Yield successive n-sized chunks from l.&quot;&quot;&quot;</span>
+                    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">l</span><span class="p">),</span> <span class="n">n</span><span class="p">):</span>
+                        <span class="k">yield</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span> <span class="o">+</span> <span class="n">n</span><span class="p">]</span>
+
+                <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">chunks</span><span class="p">(</span><span class="n">particles</span><span class="p">,</span><span class="mi">8</span><span class="p">):</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">c</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_potential_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">directory</span> <span class="o">=</span> <span class="s2">&quot;potentials&quot;</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">try</span><span class="p">:</span> 
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
+        <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
+                <span class="k">raise</span>
+
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+
+        <span class="n">path_prefix</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/</span><span class="si">{}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory</span><span class="p">,</span><span class="n">prefix</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_nonbonded_parameter_files</span><span class="p">(</span> <span class="n">model</span><span class="p">,</span> <span class="n">path_prefix</span> <span class="o">+</span> <span class="s2">&quot;-nb&quot;</span><span class="p">,</span> <span class="n">configuration</span> <span class="p">)</span>
+                
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_nonbonded_parameter_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+
+        <span class="n">model</span><span class="o">.</span><span class="n">_nonbonded_interaction_files</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># clear old nb files</span>
+
+        <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">configuration</span><span class="o">.</span><span class="n">cutoff</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">_particleTypePairIter</span><span class="p">():</span>
+            <span class="n">interaction</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">_get_nonbonded_interaction</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">interaction</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">interaction</span> <span class="o">=</span> <span class="n">NullPotential</span><span class="p">()</span>
+            <span class="k">try</span><span class="p">:</span>
+                <span class="n">f</span> <span class="o">=</span> <span class="n">interaction</span><span class="o">.</span><span class="n">filename</span><span class="p">(</span><span class="n">types</span><span class="o">=</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">))</span>
+            <span class="k">except</span><span class="p">:</span>
+                <span class="n">f</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">.dat&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">t1</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">t2</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;_write_nonbonded_parameter_files could not find filename for </span><span class="si">{</span><span class="n">interaction</span><span class="si">}</span><span class="s1">; using default </span><span class="si">{</span><span class="n">f</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+
+            <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;_write_nonbonded_parameter_files: </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1">, </span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s1">, </span><span class="si">{</span><span class="n">t1</span><span class="si">}</span><span class="s1">, </span><span class="si">{</span><span class="n">t2</span><span class="si">}</span><span class="s1">, </span><span class="si">{</span><span class="n">interaction</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+            <span class="n">old_range</span> <span class="o">=</span> <span class="n">interaction</span><span class="o">.</span><span class="n">range_</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">interaction</span><span class="p">,</span><span class="n">NullPotential</span><span class="p">):</span>
+                <span class="n">interaction</span><span class="o">.</span><span class="n">range_</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">configuration</span><span class="o">.</span><span class="n">cutoff</span><span class="p">]</span>
+            <span class="n">interaction</span><span class="o">.</span><span class="n">write_file</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">))</span>
+            <span class="n">interaction</span><span class="o">.</span><span class="n">range_</span> <span class="o">=</span> <span class="n">old_range</span> 
+
+            <span class="n">model</span><span class="o">.</span><span class="n">_nonbonded_interaction_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;model._nonbonded_interaction_files: </span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="n">_nonbonded_interaction_files</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_restraint_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_restraint_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_restraint_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">restraint</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_restraints</span><span class="p">():</span>
+                <span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">idx</span><span class="p">]</span>
+                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">restraint</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
+                    <span class="n">item</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">restraint</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+                    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">GroupSite</span><span class="p">):</span>
+                        <span class="n">item</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">get_center</span><span class="p">())</span>
+                    <span class="k">else</span><span class="p">:</span>
+                        <span class="n">item</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">())</span>
+                <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">restraint</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+                    <span class="n">item</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">restraint</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+                    <span class="n">item</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">restraint</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
+                <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">restraint</span><span class="p">)</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
+                    <span class="n">item</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">restraint</span><span class="p">)</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;RESTRAINT </span><span class="si">%d</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="s2"> </span><span class="si">%f</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_bond_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_bond_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span> <span class="nb">set</span><span class="p">(</span> <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">ex</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">()]</span> <span class="p">)</span> <span class="p">):</span>
+            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">Path</span><span class="p">):</span>
+                <span class="n">b</span><span class="o">.</span><span class="n">write_file</span><span class="p">()</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_bond_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">ex</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">():</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                <span class="n">item</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span> <span class="n">j</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span> <span class="n">bfile</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">ex</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;BOND REPLACE </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;BOND ADD </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_angle_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_angle_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span> <span class="nb">set</span><span class="p">(</span> <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_angles</span><span class="p">()]</span> <span class="p">)</span> <span class="p">):</span>
+            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">Path</span><span class="p">):</span>
+                <span class="n">b</span><span class="o">.</span><span class="n">write_file</span><span class="p">()</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_angle_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_angles</span><span class="p">():</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
+                <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">b</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">+</span> <span class="p">[</span><span class="n">bfile</span><span class="p">])</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;ANGLE </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_dihedral_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_dihedral_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span> <span class="nb">set</span><span class="p">(</span> <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_dihedrals</span><span class="p">()]</span> <span class="p">)</span> <span class="p">):</span>
+            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">Path</span><span class="p">):</span>
+                <span class="n">b</span><span class="o">.</span><span class="n">write_file</span><span class="p">()</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_dihedral_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_dihedrals</span><span class="p">():</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
+                <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">b</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">+</span> <span class="p">[</span><span class="n">bfile</span><span class="p">])</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;DIHEDRAL </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_vector_angle_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_vector_angle_filename</span> <span class="o">=</span> <span class="n">filename</span>
+
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span> <span class="nb">set</span><span class="p">(</span> <span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_vector_angles</span><span class="p">()]</span> <span class="p">)</span> <span class="p">):</span>
+            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">Path</span><span class="p">):</span>
+                <span class="n">b</span><span class="o">.</span><span class="n">write_file</span><span class="p">()</span>
+
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">vector_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_vector_angle_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_vector_angles</span><span class="p">():</span>
+                    <span class="n">p</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+                    <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">b</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">+</span> <span class="p">[</span><span class="n">bfile</span><span class="p">])</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;VECANGLE </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_exclusion_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_exclusion_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_exclusion_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">ex</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_exclusions</span><span class="p">():</span>
+                <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">ex</span><span class="p">)</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;EXCLUDE </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_bond_angle_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_bond_angle_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">bond_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_bond_angle_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_bond_angles</span><span class="p">():</span>
+                    <span class="n">bfiles</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">b</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
+                        <span class="k">try</span><span class="p">:</span>
+                            <span class="n">bfile</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                        <span class="k">except</span><span class="p">:</span>
+                            <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+                        <span class="n">bfiles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">bfile</span><span class="p">)</span>
+                    <span class="n">item</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">([</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">b</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">+</span> <span class="n">bfiles</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;BONDANGLE </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%d</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="s2"> </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">item</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_product_potential_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_product_potential_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">product_potentials</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_product_potential_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">pot</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">get_product_potentials</span><span class="p">():</span>
+                    <span class="n">line</span> <span class="o">=</span> <span class="s2">&quot;PRODUCTPOTENTIAL &quot;</span>
+                    <span class="k">for</span> <span class="n">ijk_tb</span> <span class="ow">in</span> <span class="n">pot</span><span class="p">:</span>
+                        <span class="n">ijk</span> <span class="o">=</span> <span class="n">ijk_tb</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+                        <span class="n">tb</span> <span class="o">=</span> <span class="n">ijk_tb</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+                        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">tb</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">tuple</span> <span class="ow">or</span> <span class="nb">type</span><span class="p">(</span><span class="n">tb</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">list</span><span class="p">:</span>
+                            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">tb</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Invalid product potential&quot;</span><span class="p">)</span>
+                            <span class="n">type_</span><span class="p">,</span><span class="n">b</span> <span class="o">=</span> <span class="n">tb</span>
+                            <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">type_</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Invalid product potential: unrecognized specification of potential type&quot;</span><span class="p">)</span>
+                        <span class="k">else</span><span class="p">:</span>
+                            <span class="n">type_</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+                            <span class="n">b</span> <span class="o">=</span> <span class="n">tb</span>
+                        <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">Path</span><span class="p">):</span>
+                            <span class="n">b</span><span class="o">.</span><span class="n">write_file</span><span class="p">()</span>
+                        <span class="k">try</span><span class="p">:</span>
+                            <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                        <span class="k">except</span><span class="p">:</span>
+                            <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                        <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">+</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">idx</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ijk</span><span class="p">])</span><span class="o">+</span><span class="s2">&quot; &quot;</span>
+                        <span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">+</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="n">type_</span><span class="p">,</span><span class="n">bfile</span><span class="p">]</span> <span class="k">if</span> <span class="n">x</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">])</span><span class="o">+</span><span class="s2">&quot; &quot;</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_group_sites_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_group_sites_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">group_sites</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_group_sites_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">g</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">group_sites</span><span class="p">):</span>
+                    <span class="k">assert</span><span class="p">(</span> <span class="n">i</span><span class="o">+</span><span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">particles</span><span class="p">)</span> <span class="o">==</span> <span class="n">g</span><span class="o">.</span><span class="n">idx</span> <span class="p">)</span>
+                    <span class="n">ids</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">idx</span><span class="p">))</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">g</span><span class="o">.</span><span class="n">particles</span><span class="p">])</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;GROUP </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">ids</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_rb_coordinate_file</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">configuration</span><span class="p">,</span> <span class="n">filename</span> <span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_rb_coordinate_filename</span> <span class="o">=</span> <span class="n">filename</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">rb_integrator</span> <span class="o">=</span> <span class="n">configuration</span><span class="o">.</span><span class="n">rigid_body_integrator</span>
+            <span class="k">if</span> <span class="n">rb_integrator</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">rb_integrator</span> <span class="o">=</span> <span class="n">configuration</span><span class="o">.</span><span class="n">integrator</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_rb_coordinate_filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">rb</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">:</span>
+                    <span class="n">o</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">rb</span><span class="o">.</span><span class="n">applyOrientation</span><span class="p">(</span><span class="n">rb</span><span class="o">.</span><span class="n">orientation</span><span class="p">)</span><span class="o">.</span><span class="n">flatten</span><span class="p">())</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">9</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Rigid body orientation should be a 3x3 matrix&#39;</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="nb">list</span><span class="p">(</span><span class="n">rb</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">())</span> <span class="o">+</span> <span class="n">o</span><span class="p">)))</span>
+                    <span class="k">if</span> <span class="n">rb_integrator</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;MD&#39;</span><span class="p">,</span><span class="s1">&#39;Langevin&#39;</span><span class="p">):</span>
+                        <span class="k">try</span><span class="p">:</span> <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">rb</span><span class="o">.</span><span class="n">momentum</span><span class="p">])</span> <span class="p">)</span>
+                        <span class="k">except</span><span class="p">:</span>  <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s1">&#39; 0&#39;</span><span class="o">*</span><span class="mi">3</span> <span class="p">)</span>
+                        <span class="k">try</span><span class="p">:</span> <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">rb</span><span class="o">.</span><span class="n">rotational_momentum</span><span class="p">])</span> <span class="p">)</span>
+                        <span class="k">except</span><span class="p">:</span>  <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s1">&#39; 0&#39;</span><span class="o">*</span><span class="mi">3</span> <span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_write_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">prefix</span><span class="p">,</span> <span class="n">configuration</span><span class="p">):</span>
+        <span class="c1"># num_steps=100000000, output_period=10000, restart_file=None,</span>
+        <span class="c1">## TODO: raise exception if _write_potential_files has not yet been called</span>
+        <span class="n">filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}</span><span class="s1">.bd&#39;</span>
+
+        <span class="c1">## Create helper function</span>
+        <span class="k">def</span><span class="w"> </span><span class="nf">_fix_path</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">rb_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+            <span class="k">if</span> <span class="n">rb_type</span> <span class="ow">and</span> <span class="n">rb_type</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rb_type_dirs</span><span class="p">:</span>
+                <span class="c1"># First, check if this is an existing file within the RB directory</span>
+                <span class="n">rb_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rb_type_dirs</span><span class="p">[</span><span class="n">rb_type</span><span class="p">]</span>
+                <span class="n">basename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">filename</span><span class="p">))</span>
+                <span class="n">rb_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">rb_dir</span><span class="p">,</span> <span class="n">basename</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">rb_path</span><span class="p">):</span>
+                    <span class="k">return</span> <span class="n">rb_path</span>
+                
+                <span class="c1"># Check if this might be a resource we want to place in the RB directory</span>
+                <span class="k">if</span> <span class="n">basename</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">rb_type</span><span class="p">)</span> <span class="ow">or</span> <span class="n">rb_type</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
+                    <span class="k">return</span> <span class="n">rb_path</span>
+            
+            <span class="n">abspath</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span> <span class="k">else</span> <span class="n">Path</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">_d_orig</span><span class="p">)</span> <span class="o">/</span> <span class="n">filename</span>
+            <span class="n">ret</span> <span class="o">=</span> <span class="kc">None</span>
+            <span class="k">try</span><span class="p">:</span> 
+                <span class="n">ret</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">relpath</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">abspath</span><span class="p">))</span>
+            <span class="k">except</span><span class="p">:</span>
+                <span class="n">devlogger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Relative path for </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s1"> not found... using </span><span class="si">{</span><span class="n">abspath</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                <span class="n">ret</span> <span class="o">=</span> <span class="n">abspath</span>
+            <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
+        
+        <span class="c1">## Build dictionary of parameters</span>
+        <span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">configuration</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="n">params</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+
+        <span class="k">if</span> <span class="n">configuration</span><span class="o">.</span><span class="n">seed</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;seed&#39;</span><span class="p">]</span>     <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;seed </span><span class="si">{</span><span class="nb">int</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">default_rng</span><span class="p">()</span><span class="o">.</span><span class="n">integers</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">99999</span><span class="p">,</span><span class="mi">1</span><span class="p">))</span><span class="si">}</span><span class="s1">&#39;</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;seed&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;seed </span><span class="si">{:d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">configuration</span><span class="o">.</span><span class="n">seed</span><span class="p">)</span>
+        <span class="n">params</span><span class="p">[</span><span class="s1">&#39;num_steps&#39;</span><span class="p">]</span>       <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">configuration</span><span class="o">.</span><span class="n">num_steps</span><span class="p">)</span>
+
+        <span class="c1"># params[&#39;coordinateFile&#39;] = &quot;%s.coord.txt&quot; % prefix</span>
+        <span class="n">params</span><span class="p">[</span><span class="s1">&#39;particle_file&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">.particles.txt&quot;</span> <span class="o">%</span> <span class="n">prefix</span>
+        <span class="k">if</span> <span class="n">configuration</span><span class="o">.</span><span class="n">restart_file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;restart_coordinates&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;restart_coordinates&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;restartCoordinates </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">configuration</span><span class="o">.</span><span class="n">restart_file</span>
+
+        <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="s1">&#39;XYZ&#39;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">dimensions</span><span class="p">):</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;dim&#39;</span><span class="o">+</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+
+        <span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">origin</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="s1">&#39;XYZ&#39;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">dimensions</span><span class="p">):</span>
+                <span class="n">params</span><span class="p">[</span><span class="s1">&#39;origin&#39;</span><span class="o">+</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">v</span><span class="o">*</span><span class="mf">0.5</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="s1">&#39;XYZ&#39;</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">origin</span><span class="p">):</span>
+                <span class="n">params</span><span class="p">[</span><span class="s1">&#39;origin&#39;</span><span class="o">+</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+             
+        <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pairlist_distance&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pairlist_distance&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">10</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;pairlist_distance&#39;</span><span class="p">]</span> <span class="o">-=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;cutoff&#39;</span><span class="p">]</span> 
+
+        <span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;integrator&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;MD&#39;</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;integrator&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;Langevin&#39;</span>
+
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">rb_integrator</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;rigid_body_integrator&#39;</span><span class="p">]</span> 
+            <span class="k">if</span> <span class="n">rb_integrator</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">rb_integrator</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;integrator&quot;</span><span class="p">]</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;rigid_body_integrator&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">RigidBodyDynamicType </span><span class="si">{</span><span class="n">rb_integrator</span><span class="si">}</span><span class="s1">&#39;</span>
+            <span class="n">_rbggp</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="s2">&quot;rigid_body_grid_grid_period&quot;</span><span class="p">]</span>
+            <span class="k">if</span> <span class="n">_rbggp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">_rbggp</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+                <span class="n">params</span><span class="p">[</span><span class="s1">&#39;rigid_body_integrator&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">rigidBodyGridGridPeriod </span><span class="si">{</span><span class="n">_rbggp</span><span class="si">}</span><span class="s1">&#39;</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">params</span><span class="p">[</span><span class="s1">&#39;rigid_body_integrator&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+            
+        <span class="c1">## Actually write the file</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span><span class="si">{seed}</span>
+<span class="s2">timestep </span><span class="si">{timestep}</span>
+<span class="s2">steps </span><span class="si">{num_steps}</span>
+<span class="s2">numberFluct 0                   # deprecated</span>
+
+<span class="s2">interparticleForce 1            # other values deprecated</span>
+<span class="s2">fullLongRange 0                 # deprecated</span>
+<span class="s2">temperature </span><span class="si">{temperature}</span>
+<span class="s2">ParticleDynamicType </span><span class="si">{integrator}{rigid_body_integrator}</span>
+
+<span class="s2">outputPeriod </span><span class="si">{output_period}</span>
+<span class="s2">## Energy doesn&#39;t actually get printed!</span>
+<span class="s2">outputEnergyPeriod </span><span class="si">{output_period}</span>
+<span class="s2">outputFormat dcd</span>
+
+<span class="s2">## Infrequent domain decomposition because this kernel is still very slow</span>
+<span class="s2">decompPeriod </span><span class="si">{decomp_period}</span>
+<span class="s2">cutoff </span><span class="si">{cutoff}</span>
+<span class="s2">pairlistDistance </span><span class="si">{pairlist_distance}</span>
+
+<span class="s2">origin </span><span class="si">{originX}</span><span class="s2"> </span><span class="si">{originY}</span><span class="s2"> </span><span class="si">{originZ}</span>
+<span class="s2">systemSize </span><span class="si">{dimX}</span><span class="s2"> </span><span class="si">{dimY}</span><span class="s2"> </span><span class="si">{dimZ}</span>
+
+<span class="si">{extra_bd_file_lines}</span>
+<span class="se">\n</span><span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">extra_bd_file_lines</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">extra_bd_file_lines</span><span class="p">,</span> <span class="o">**</span><span class="n">params</span><span class="p">))</span>
+            
+            <span class="c1">## Write entries for each type of particle</span>
+            <span class="k">for</span> <span class="n">pt</span><span class="p">,(</span><span class="n">num</span><span class="p">,</span><span class="n">num_rigid</span><span class="p">)</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">getParticleTypesAndCounts</span><span class="p">():</span>
+                <span class="k">if</span> <span class="n">num</span><span class="o">+</span><span class="n">num_rigid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span>
+                <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Writing configuration for particle type </span><span class="si">{</span><span class="n">pt</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                <span class="c1">## TODO create new particle types if existing has grid</span>
+                <span class="n">particleParams</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+                <span class="n">particleParams</span><span class="p">[</span><span class="s1">&#39;num&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">num</span>
+                <span class="k">if</span> <span class="n">configuration</span><span class="o">.</span><span class="n">integrator</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;Brown&#39;</span><span class="p">,</span> <span class="s1">&#39;Brownian&#39;</span><span class="p">,</span> <span class="s1">&#39;BD&#39;</span><span class="p">):</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">D</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">diffusivity</span>
+                    <span class="k">except</span><span class="p">:</span>
+<span class="w">                        </span><span class="sd">&quot;&quot;&quot; units &quot;k K/(amu/ns)&quot; &quot;AA**2/ns&quot; &quot;&quot;&quot;</span>
+                        <span class="n">D</span> <span class="o">=</span> <span class="mf">831447.2</span> <span class="o">*</span> <span class="n">configuration</span><span class="o">.</span><span class="n">temperature</span> <span class="o">/</span> <span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">mass</span> <span class="o">*</span> <span class="n">pt</span><span class="o">.</span><span class="n">damping_coefficient</span><span class="p">)</span>
+                    <span class="n">particleParams</span><span class="p">[</span><span class="s1">&#39;dynamics&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;diffusion </span><span class="si">{D}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">D</span> <span class="o">=</span> <span class="n">D</span><span class="p">)</span>
+                <span class="k">elif</span> <span class="n">configuration</span><span class="o">.</span><span class="n">integrator</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;MD&#39;</span><span class="p">,</span><span class="s1">&#39;Langevin&#39;</span><span class="p">,</span><span class="s1">&#39;FusDynamic&#39;</span><span class="p">):</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">gamma</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">damping_coefficient</span>
+                        <span class="k">if</span> <span class="n">gamma</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">raise</span>
+                    <span class="k">except</span><span class="p">:</span>
+<span class="w">                        </span><span class="sd">&quot;&quot;&quot; units &quot;k K/(AA**2/ns)&quot; &quot;amu/ns&quot; &quot;&quot;&quot;</span>
+                        <span class="n">gamma</span> <span class="o">=</span> <span class="mf">831447.2</span> <span class="o">*</span> <span class="n">configuration</span><span class="o">.</span><span class="n">temperature</span> <span class="o">/</span> <span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">mass</span><span class="o">*</span><span class="n">pt</span><span class="o">.</span><span class="n">diffusivity</span><span class="p">)</span>
+                    <span class="n">particleParams</span><span class="p">[</span><span class="s1">&#39;dynamics&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;mass </span><span class="si">{mass}</span>
+<span class="s2">transDamping </span><span class="si">{g}</span><span class="s2"> </span><span class="si">{g}</span><span class="s2"> </span><span class="si">{g}</span><span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">mass</span><span class="o">=</span><span class="n">pt</span><span class="o">.</span><span class="n">mass</span><span class="p">,</span> <span class="n">g</span><span class="o">=</span><span class="n">gamma</span><span class="p">)</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unrecognized particle integrator &#39;</span><span class="si">{}</span><span class="s2">&#39;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">configuration</span><span class="o">.</span><span class="n">particle_integrator</span><span class="p">))</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">particle </span><span class="si">{name}</span>
+<span class="s2">num </span><span class="si">{num}</span>
+<span class="si">{dynamics}</span>
+<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">particleParams</span><span class="p">))</span>
+                <span class="k">if</span> <span class="s1">&#39;grid_potentials&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span><span class="p">:</span>
+                    <span class="n">grids</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="n">scales</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="n">boundary_conditions</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="k">for</span> <span class="n">vals</span> <span class="ow">in</span> <span class="n">pt</span><span class="o">.</span><span class="n">grid_potentials</span><span class="p">:</span>
+                        <span class="k">try</span><span class="p">:</span> <span class="n">g</span><span class="p">,</span><span class="n">s</span><span class="p">,</span><span class="n">bc</span> <span class="o">=</span> <span class="n">vals</span>
+                        <span class="k">except</span><span class="p">:</span>
+                            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Failed to unpack </span><span class="si">{</span><span class="n">pt</span><span class="si">}</span><span class="s1">.grid_potentials, presumably due to lack of specified boundary condition... using &quot;dirichlet&quot;&#39;</span><span class="p">)</span>
+                            <span class="n">g</span><span class="p">,</span><span class="n">s</span> <span class="o">=</span> <span class="n">vals</span>
+                            <span class="n">bc</span> <span class="o">=</span> <span class="s1">&#39;dirichlet&#39;</span>
+                        <span class="n">grids</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">_fix_path</span><span class="p">(</span><span class="n">g</span><span class="p">)</span> <span class="p">)</span>
+                        <span class="n">scales</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">s</span><span class="p">))</span>
+                        <span class="n">boundary_conditions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">bc</span><span class="p">)</span>
+
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;gridFile </span><span class="si">{}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">grids</span><span class="p">)))</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;gridFileScale </span><span class="si">{}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">scales</span><span class="p">)))</span>
+                    <span class="k">if</span> <span class="nb">any</span><span class="p">([</span><span class="n">bc</span> <span class="o">!=</span> <span class="s1">&#39;dirichlet&#39;</span> <span class="k">for</span> <span class="n">bc</span> <span class="ow">in</span> <span class="n">boundary_conditions</span><span class="p">]):</span>
+                        <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;gridFileBoundaryConditions </span><span class="si">{</span><span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">boundary_conditions</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;gridFile </span><span class="si">{}</span><span class="s2">/null.dx</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">potential_directory</span><span class="p">))</span>
+
+                <span class="k">if</span> <span class="s1">&#39;forceXGrid&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;forceXGridFile </span><span class="si">{</span><span class="n">_fix_path</span><span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">forceXGrid</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">if</span> <span class="s1">&#39;forceYGrid&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;forceYGridFile </span><span class="si">{</span><span class="n">_fix_path</span><span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">forceYGrid</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">if</span> <span class="s1">&#39;forceZGrid&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;forceZGridFile </span><span class="si">{</span><span class="n">_fix_path</span><span class="p">(</span><span class="n">pt</span><span class="o">.</span><span class="n">forceZGrid</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+                <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;force</span><span class="si">{</span><span class="n">x</span><span class="si">}</span><span class="s1">Grid&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;X&#39;</span><span class="p">,</span><span class="s1">&#39;Y&#39;</span><span class="p">,</span><span class="s1">&#39;Z&#39;</span><span class="p">))</span> <span class="ow">and</span> \
+                   <span class="s1">&#39;forceGridScale&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span><span class="p">:</span>
+                    <span class="n">_scale</span> <span class="o">=</span> <span class="kc">None</span>
+                    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span> <span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span><span class="p">,</span> <span class="nb">float</span> <span class="p">):</span>
+                        <span class="n">_scale</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="p">[</span><span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span><span class="p">]</span>
+                    <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span> <span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
+                        <span class="n">_scale</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="p">[</span><span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
+                    <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span> <span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span> <span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
+                        <span class="n">_scale</span> <span class="o">=</span> <span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span>
+                    <span class="k">else</span><span class="p">:</span>
+                        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Unrecognized format for ParticleType.forceGridScale: &quot;</span><span class="si">{</span><span class="n">pt</span><span class="o">.</span><span class="n">forceGridScale</span><span class="si">}</span><span class="s1">&quot;&#39;</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;forceGridScale </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">_scale</span><span class="p">))</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+                    
+                <span class="k">if</span> <span class="s1">&#39;rigid_body_potentials&#39;</span> <span class="ow">in</span> <span class="n">particleParams</span><span class="p">:</span>
+                    <span class="n">grids</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="n">scales</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">pt</span><span class="o">.</span><span class="n">rigid_body_potentials</span><span class="p">:</span>
+                        <span class="k">try</span><span class="p">:</span>    <span class="n">keyword</span><span class="p">,</span><span class="n">s</span> <span class="o">=</span> <span class="n">item</span>
+                        <span class="k">except</span><span class="p">:</span> <span class="n">keyword</span><span class="p">,</span><span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+                        <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;rigidBodyPotential </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                        <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">&#39;Instead scale rigid body potential&#39;</span><span class="p">)</span>
+
+            <span class="c1">## Write coordinates and interactions</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">## Input coordinates</span>
+<span class="s2">inputParticles </span><span class="si">{particle_file}</span>
+<span class="si">{restart_coordinates}</span>
+
+<span class="s2">## Interaction potentials</span>
+<span class="s2">tabulatedPotential  1</span>
+<span class="s2">## The i@j@file syntax means particle type i will have NB interactions with particle type j using the potential in file</span>
+<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">params</span><span class="p">))</span>
+            <span class="k">for</span> <span class="n">pair</span><span class="p">,</span><span class="n">f</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">_particleTypePairIter</span><span class="p">(),</span> <span class="n">model</span><span class="o">.</span><span class="n">_nonbonded_interaction_files</span><span class="p">):</span>
+                <span class="k">if</span> <span class="n">f</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                    <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span> <span class="o">=</span> <span class="n">pair</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;tabulatedFile </span><span class="si">%d</span><span class="s2">@</span><span class="si">%d</span><span class="s2">@</span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">f</span><span class="p">))</span>
+
+            <span class="c1">## Bonded interactions</span>
+            <span class="n">restraints</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_restraints</span><span class="p">()</span>
+            <span class="n">bonds</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">()</span>
+            <span class="n">angles</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_angles</span><span class="p">()</span>
+            <span class="n">dihedrals</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_dihedrals</span><span class="p">()</span>
+            <span class="n">vector_angles</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_vector_angles</span><span class="p">()</span>
+            <span class="n">exclusions</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_exclusions</span><span class="p">()</span>
+            <span class="n">bond_angles</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_bond_angles</span><span class="p">()</span>
+            <span class="n">prod_pots</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">get_product_potentials</span><span class="p">()</span>
+            <span class="c1"># group_sites = model.get_group_sites()</span>
+            <span class="n">group_sites</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">group_sites</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">bonds</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">_get_bond_potentials</span><span class="p">():</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;tabulatedBondFile </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bfile</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">_get_angle_potentials</span><span class="p">():</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;tabulatedAngleFile </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bfile</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">vector_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="n">vector_angles</span><span class="p">])):</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;tabulatedVecangleFile </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bfile</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">dihedrals</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="n">dihedrals</span><span class="p">])):</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;tabulatedDihedralFile </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bfile</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">vector_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">([</span><span class="n">b</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">l</span><span class="p">,</span><span class="n">b</span> <span class="ow">in</span> <span class="n">vector_angles</span><span class="p">])):</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">filename</span><span class="p">()</span>
+                    <span class="k">except</span><span class="p">:</span>
+                        <span class="n">bfile</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;tabulatedVecangleFile </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">bfile</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">restraints</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputRestraints </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_restraint_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">bonds</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputBonds </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bond_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputAngles </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_angle_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">dihedrals</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputDihedrals </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dihedral_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">vector_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputVecangles </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_vector_angle_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">exclusions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputExcludes </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exclusion_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">vector_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputVecangles </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_vector_angle_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">bond_angles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputBondAngles </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bond_angle_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">prod_pots</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputProductPotentials </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_product_potential_filename</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">group_sites</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;inputGroups </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_group_sites_filename</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">rbi</span><span class="p">,</span><span class="n">num</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">rigid_body_type_counts</span><span class="p">:</span>
+                    <span class="n">rbt</span><span class="o">=</span><span class="n">model</span><span class="o">.</span><span class="n">rigid_body_index</span><span class="p">[</span><span class="n">rbi</span><span class="p">]</span>
+                    <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span>
+                    <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Writing configuration for rigid body type </span><span class="si">{</span><span class="n">rbt</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                    <span class="c1">## For now, we always convert rigid body diffusivity into mass+damping</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">gamma</span> <span class="o">=</span> <span class="n">rbt</span><span class="o">.</span><span class="n">damping_coefficient</span>
+                    <span class="k">except</span><span class="p">:</span>
+<span class="w">                        </span><span class="sd">&quot;&quot;&quot; units &quot;k K/(AA**2/ns)&quot; &quot;dalton/ns&quot; &quot;&quot;&quot;</span>
+                        <span class="n">gamma</span> <span class="o">=</span> <span class="mf">831447.2</span> <span class="o">*</span> <span class="n">configuration</span><span class="o">.</span><span class="n">temperature</span> <span class="o">/</span> <span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">mass</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">diffusivity</span><span class="p">))</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">gamma</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
+                        <span class="n">logger</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Using single diffusion coefficient for all motions along all rigid body principal axes for </span><span class="si">{</span><span class="n">rbt</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                        <span class="n">gamma</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="p">[</span><span class="n">gamma</span><span class="p">]</span>
+
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">gamma_rot</span> <span class="o">=</span> <span class="n">rbt</span><span class="o">.</span><span class="n">rotational_damping_coefficient</span>
+                    <span class="k">except</span><span class="p">:</span>
+<span class="w">                        </span><span class="sd">&quot;&quot;&quot; units &quot;k K/(1/ns)&quot; &quot;AA**2 dalton/ns&quot; &quot;&quot;&quot;</span>
+                        <span class="n">gamma_rot</span> <span class="o">=</span> <span class="mf">831447.2</span> <span class="o">*</span> <span class="n">configuration</span><span class="o">.</span><span class="n">temperature</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">moment_of_inertia</span><span class="p">)</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">diffusivity</span><span class="p">))</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">gamma_rot</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
+                        <span class="n">logger</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Using single rotational diffusion coefficient for all motions along all rigid body principal axes for </span><span class="si">{</span><span class="n">pt</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                        <span class="n">gamma_rot</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="p">[</span><span class="n">gamma_rot</span><span class="p">]</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">gamma_rot</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Expected a three-element rotational diffusion coefficient for rigid bodies&#39;</span><span class="p">)</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">rigidBody </span><span class="si">{</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="si">}</span>
+<span class="s2">num </span><span class="si">{</span><span class="n">num</span><span class="si">}</span>
+<span class="s2">mass </span><span class="si">{</span><span class="n">rbt</span><span class="o">.</span><span class="n">mass</span><span class="si">}</span>
+<span class="s2">inertia </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">rbt</span><span class="o">.</span><span class="n">moment_of_inertia</span><span class="p">))</span><span class="si">}</span>
+<span class="s2">transDamping </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">gamma</span><span class="p">))</span><span class="si">}</span>
+<span class="s2">rotDamping </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span><span class="n">gamma_rot</span><span class="p">))</span><span class="si">}</span>
+<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>
+
+                    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">rbt</span><span class="o">.</span><span class="n">potential_grids</span><span class="p">:</span>
+                        <span class="k">try</span><span class="p">:</span>    <span class="n">keyword</span><span class="p">,</span><span class="n">g</span><span class="p">,</span><span class="n">s</span> <span class="o">=</span> <span class="n">item</span>
+                        <span class="k">except</span><span class="p">:</span> <span class="p">(</span><span class="n">keyword</span><span class="p">,</span><span class="n">g</span><span class="p">),</span><span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+
+                        <span class="n">g</span> <span class="o">=</span> <span class="n">_fix_path</span><span class="p">(</span><span class="n">g</span><span class="p">,</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+                        <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;potentialGrid </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">g</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                        <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;potentialGridScale </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">s</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+                    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">rbt</span><span class="o">.</span><span class="n">charge_grids</span><span class="p">:</span>
+                        <span class="k">try</span><span class="p">:</span>    <span class="n">keyword</span><span class="p">,</span><span class="n">g</span><span class="p">,</span><span class="n">s</span> <span class="o">=</span> <span class="n">item</span>
+                        <span class="k">except</span><span class="p">:</span> <span class="p">(</span><span class="n">keyword</span><span class="p">,</span><span class="n">g</span><span class="p">),</span><span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+                        <span class="n">g</span> <span class="o">=</span> <span class="n">_fix_path</span><span class="p">(</span><span class="n">g</span><span class="p">,</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+                        <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;densityGrid </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">g</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                        <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;densityGridScale </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">s</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">rbt</span><span class="o">.</span><span class="n">pmf_grids</span><span class="p">:</span>
+                        <span class="k">try</span><span class="p">:</span>    <span class="n">keyword</span><span class="p">,</span><span class="n">g</span><span class="p">,</span><span class="n">s</span> <span class="o">=</span> <span class="n">item</span>
+                        <span class="k">except</span><span class="p">:</span> <span class="p">(</span><span class="n">keyword</span><span class="p">,</span><span class="n">g</span><span class="p">),</span><span class="n">s</span> <span class="o">=</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+                        <span class="n">g</span> <span class="o">=</span> <span class="n">_fix_path</span><span class="p">(</span><span class="n">g</span><span class="p">,</span><span class="n">rbt</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+                        <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;gridFile </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">g</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                        <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;pmfScale </span><span class="si">{</span><span class="n">keyword</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">s</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+                    <span class="c1">## AttachedParticles</span>
+                    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">rbt</span><span class="o">.</span><span class="n">attached_particles</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                        <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;attachedParticles </span><span class="si">{</span><span class="n">rbt</span><span class="o">.</span><span class="n">_attached_particles_filename</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">inputRBCoordinates </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_rb_coordinate_filename</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+                <span class="o">...</span>
+                
+        <span class="n">write_null_dx</span> <span class="o">=</span> <span class="kc">False</span>
+        <span class="k">for</span> <span class="n">pt</span><span class="p">,(</span><span class="n">num</span><span class="p">,</span><span class="n">num_rb</span><span class="p">)</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">getParticleTypesAndCounts</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">num</span><span class="o">+</span><span class="n">num_rb</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span>
+            <span class="k">if</span> <span class="s2">&quot;grid_potentials&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">pt</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
+                <span class="n">gridfile</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{}</span><span class="s2">/null.dx&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">potential_directory</span><span class="p">)</span>
+                <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">gridfile</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;object 1 class gridpositions counts  2 2 2</span>
+<span class="s2">origin </span><span class="si">{originX}</span><span class="s2"> </span><span class="si">{originY}</span><span class="s2"> </span><span class="si">{originZ}</span>
+<span class="s2">delta  </span><span class="si">{dimX}</span><span class="s2"> 0.000000 0.000000</span>
+<span class="s2">delta  0.000000 </span><span class="si">{dimY}</span><span class="s2"> 0.000000</span>
+<span class="s2">delta  0.000000 0.000000 </span><span class="si">{dimZ}</span>
+<span class="s2">object 2 class gridconnections counts  2 2 2</span>
+<span class="s2">object 3 class array type float rank 0 items 8 data follows</span>
+<span class="s2">0.0	0.0	0.0	</span>
+<span class="s2">0.0	0.0	0.0	</span>
+<span class="s2">0.0	0.0	</span>
+<span class="s2">attribute &quot;dep&quot; string &quot;positions&quot;</span>
+<span class="s2">object &quot;density&quot; class field </span>
+<span class="s2">component &quot;positions&quot; value 1</span>
+<span class="s2">component &quot;connections&quot; value 2</span>
+<span class="s2">component &quot;data&quot; value 3</span>
+<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">params</span><span class="p">))</span>
+                    <span class="k">break</span></div>
+
+
+<div class="viewcode-block" id="NamdEngine">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">NamdEngine</span><span class="p">(</span><span class="n">SimEngine</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; Partial interface to NAMD simulation engine &quot;&quot;&quot;</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> 
+            <span class="n">configuration</span> <span class="o">=</span> <span class="n">SimConf</span><span class="p">(</span><span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        <span class="n">SimEngine</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">configuration</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_particles</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="p">[]</span>     <span class="c1"># TODO decide if this should belong here, or with model</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># TODO decide if this should belong here, or with model</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cacheUpToDate</span> <span class="o">=</span> <span class="kc">False</span>
+
+    <span class="nd">@property</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">default_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s1">&#39;namd2&#39;</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_generate_command_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">output_directory</span><span class="p">,</span> <span class="n">num_procs</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">gpu</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">replicas</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">binary</span><span class="p">]</span>
+        <span class="k">if</span> <span class="n">gpu</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">gpu</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">cmd</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s1">&#39;+devices&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="s1">&#39;,&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">g</span><span class="p">))</span> <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">gpu</span><span class="p">])])</span>
+        <span class="n">cmd</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="sa">f</span><span class="s1">&#39;+p</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">num_procs</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">])</span>    
+        <span class="k">if</span> <span class="n">replicas</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="n">cmd</span> <span class="o">+</span> <span class="p">[</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s1">.namd&#39;</span><span class="p">]</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">cmd</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">cmd</span>
+
+<div class="viewcode-block" id="NamdEngine.get_default_conf">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.get_default_conf">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_default_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">SimConf</span><span class="p">(</span><span class="n">num_steps</span><span class="o">=</span><span class="mf">1e5</span><span class="p">,</span> <span class="n">output_period</span><span class="o">=</span><span class="mf">1e3</span><span class="p">,</span>
+                 <span class="n">integrator</span><span class="o">=</span><span class="s1">&#39;MD&#39;</span><span class="p">,</span> <span class="n">timestep</span><span class="o">=</span><span class="mf">2e-6</span><span class="p">,</span> <span class="n">thermostat</span><span class="o">=</span><span class="s1">&#39;Langevin&#39;</span><span class="p">,</span> <span class="n">barostat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">temperature</span><span class="o">=</span><span class="mi">295</span><span class="p">,</span> <span class="n">pressure</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">cutoff</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="n">pairlist_distance</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">decomp_period</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span>
+                 <span class="n">seed</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">restart_file</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">conf</span></div>
+
+
+<div class="viewcode-block" id="NamdEngine.write_simulation_files">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.write_simulation_files">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_simulation_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">write_pqr</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">copy_ff_from</span><span class="o">=</span><span class="n">get_resource_path</span><span class="p">(</span><span class="s2">&quot;charmm36.nbfix&quot;</span><span class="p">),</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">configuration</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+
+        <span class="n">model</span><span class="o">.</span><span class="n">write_psf</span><span class="p">(</span> <span class="n">output_name</span><span class="o">+</span><span class="s1">&#39;.psf&#39;</span> <span class="p">)</span>
+        <span class="n">model</span><span class="o">.</span><span class="n">write_pdb</span><span class="p">(</span> <span class="n">output_name</span><span class="o">+</span><span class="s1">&#39;.pdb&#39;</span> <span class="p">)</span>
+        <span class="n">model</span><span class="o">.</span><span class="n">write_pdb</span><span class="p">(</span> <span class="n">output_name</span> <span class="o">+</span> <span class="s2">&quot;.fixed.pdb&quot;</span><span class="p">,</span> <span class="n">beta_from_fixed</span><span class="o">=</span><span class="kc">True</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="n">write_pqr</span><span class="p">:</span> <span class="n">model</span><span class="o">.</span><span class="n">write_pqr</span><span class="p">(</span> <span class="n">output_name</span> <span class="o">+</span> <span class="s2">&quot;.pqr&quot;</span> <span class="p">)</span>        
+
+        <span class="k">if</span> <span class="n">copy_ff_from</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">copy_ff_from</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+            <span class="k">try</span><span class="p">:</span>
+                <span class="n">shutil</span><span class="o">.</span><span class="n">copytree</span><span class="p">(</span> <span class="n">copy_ff_from</span><span class="p">,</span> <span class="n">Path</span><span class="p">(</span><span class="n">copy_ff_from</span><span class="p">)</span><span class="o">.</span><span class="n">stem</span> <span class="p">)</span>
+            <span class="k">except</span> <span class="ne">FileExistsError</span><span class="p">:</span>
+                <span class="k">pass</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_write_conf</span><span class="p">(</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="NamdEngine.write_conf">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.write_conf">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_conf</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span><span class="n">model</span><span class="p">,</span><span class="n">output_name</span><span class="p">,</span> <span class="n">minimization_steps</span><span class="o">=</span><span class="mi">4800</span><span class="p">,</span> <span class="n">num_steps</span> <span class="o">=</span> <span class="mf">1e6</span><span class="p">,</span>
+                    <span class="n">output_directory</span> <span class="o">=</span> <span class="s1">&#39;output&#39;</span><span class="p">,</span>
+                    <span class="n">update_dimensions</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">extrabonds</span><span class="o">=</span><span class="kc">True</span> <span class="p">):</span> 
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Write a NAMD configuration file (developed for the mrdna package) &quot;&quot;&quot;</span>
+        
+        <span class="n">num_steps</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">num_steps</span><span class="o">//</span><span class="mi">12</span><span class="p">)</span><span class="o">*</span><span class="mi">12</span>
+        <span class="n">minimization_steps</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">minimization_steps</span><span class="o">//</span><span class="mi">24</span><span class="p">)</span><span class="o">*</span><span class="mi">24</span>
+        <span class="k">if</span> <span class="n">num_steps</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Must run with at least 12  steps&quot;</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">minimization_steps</span> <span class="o">&lt;</span> <span class="mi">24</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Must run with at least 24 minimization steps&quot;</span><span class="p">)</span>
+
+        <span class="n">format_data</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span> <span class="c1"># get parameters from System object</span>
+
+        <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;extrabonds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;extraBonds on</span>
+<span class="s2">extraBondsFile $prefix.exb</span>
+<span class="s2">&quot;&quot;&quot;</span> <span class="k">if</span> <span class="n">extrabonds</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
+
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">useTclForces</span><span class="p">:</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;margin&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;tcl_forces&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;tclForces on</span>
+<span class="s2">tclForcesScript $prefix.forces.tcl</span>
+<span class="s2">&quot;&quot;&quot;</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;margin&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;margin              30</span>
+<span class="s2">&quot;&quot;&quot;</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;tcl_forces&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+
+        <span class="k">if</span> <span class="n">update_dimensions</span><span class="p">:</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;dimensions&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">dimensions_from_structure</span><span class="p">()</span>
+
+        <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="s1">&#39;XYZ&#39;</span><span class="p">,</span> <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;dimensions&#39;</span><span class="p">]):</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;origin&#39;</span><span class="o">+</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">v</span><span class="o">*</span><span class="mf">0.5</span>
+            <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;cell&#39;</span><span class="o">+</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+
+        <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;prefix&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">output_name</span>
+        <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;minimization_steps&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">minimization_steps</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span>
+        <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;num_steps&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">num_steps</span>
+        <span class="n">format_data</span><span class="p">[</span><span class="s1">&#39;output_directory&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">output_directory</span>
+        <span class="n">filename</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">.namd&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_name</span><span class="p">)</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
+<span class="s2">set prefix </span><span class="si">{prefix}</span>
+<span class="s2">set nLast 0;			# increment when continueing a simulation</span>
+<span class="s2">set n [expr $nLast+1]</span>
+<span class="s2">set out </span><span class="si">{output_directory}</span><span class="s2">/$prefix-$n</span>
+<span class="s2">set temperature </span><span class="si">{temperature}</span>
+
+<span class="s2">structure          $prefix.psf</span>
+<span class="s2">coordinates        $prefix.pdb</span>
+
+<span class="s2">outputName         $out</span>
+<span class="s2">XSTfile            $out.xst</span>
+<span class="s2">DCDfile            $out.dcd</span>
+
+<span class="s2">#############################################################</span>
+<span class="s2">## SIMULATION PARAMETERS                                   ##</span>
+<span class="s2">#############################################################</span>
+
+<span class="s2"># Input</span>
+<span class="s2">paraTypeCharmm	    on</span>
+<span class="s2">parameters          charmm36.nbfix/par_all36_na.prm</span>
+<span class="s2">parameters	    charmm36.nbfix/par_water_ions_na.prm</span>
+
+<span class="s2">wrapAll             off</span>
+
+<span class="s2"># Force-Field Parameters</span>
+<span class="s2">exclude             scaled1-4</span>
+<span class="s2">1-4scaling          1.0</span>
+<span class="s2">switching           on</span>
+<span class="s2">switchdist           8</span>
+<span class="s2">cutoff              10</span>
+<span class="s2">pairlistdist        12</span>
+<span class="si">{margin}</span>
+
+<span class="s2"># Integrator Parameters</span>
+<span class="s2">timestep            2.0  ;# 2fs/step</span>
+<span class="s2">rigidBonds          all  ;# needed for 2fs steps</span>
+<span class="s2">nonbondedFreq       1</span>
+<span class="s2">fullElectFrequency  3</span>
+<span class="s2">stepspercycle       12</span>
+
+<span class="s2"># PME (for full-system periodic electrostatics)</span>
+<span class="s2">PME                 no</span>
+<span class="s2">PMEGridSpacing      1.2</span>
+
+<span class="s2"># Constant Temperature Control</span>
+<span class="s2">langevin            on    ;# do langevin dynamics</span>
+<span class="s2"># langevinDamping     1   ;# damping coefficient (gamma); used in original study</span>
+<span class="s2">langevinDamping     0.1   ;# less friction for faster relaxation</span>
+<span class="s2">langevinTemp        $temperature</span>
+<span class="s2">langevinHydrogen    off    ;# don&#39;t couple langevin bath to hydrogens</span>
+
+<span class="s2"># output</span>
+<span class="s2">useGroupPressure    yes</span>
+<span class="s2">xstFreq             4800</span>
+<span class="s2">outputEnergies      4800</span>
+<span class="s2">dcdfreq             4800</span>
+<span class="s2">restartfreq         48000</span>
+
+<span class="s2">#############################################################</span>
+<span class="s2">## EXTRA FORCES                                            ##</span>
+<span class="s2">#############################################################</span>
+
+<span class="s2"># ENM and intrahelical extrabonds</span>
+<span class="si">{extrabonds}</span>
+<span class="si">{tcl_forces}</span>
+
+<span class="s2">#############################################################</span>
+<span class="s2">## RUN                                                     ##</span>
+<span class="s2">#############################################################</span>
+
+<span class="s2"># Continuing a job from the restart files</span>
+<span class="s2">cellBasisVector1 </span><span class="si">{cellX}</span><span class="s2"> 0 0</span>
+<span class="s2">cellBasisVector2 0 </span><span class="si">{cellY}</span><span class="s2"> 0</span>
+<span class="s2">cellBasisVector3 0 0 </span><span class="si">{cellZ}</span>
+
+<span class="s2">if {{$nLast == 0}} {{</span>
+<span class="s2">    temperature 300</span>
+<span class="s2">    fixedAtoms on</span>
+<span class="s2">    fixedAtomsForces on</span>
+<span class="s2">    fixedAtomsFile $prefix.fixed.pdb</span>
+<span class="s2">    fixedAtomsCol B</span>
+<span class="s2">    minimize </span><span class="si">{minimization_steps:d}</span>
+<span class="s2">    fixedAtoms off</span>
+<span class="s2">    minimize </span><span class="si">{minimization_steps:d}</span>
+<span class="s2">}} else {{</span>
+<span class="s2">    bincoordinates  </span><span class="si">{output_directory}</span><span class="s2">/$prefix-$nLast.restart.coor</span>
+<span class="s2">    binvelocities   </span><span class="si">{output_directory}</span><span class="s2">/$prefix-$nLast.restart.vel</span>
+<span class="s2">}}</span>
+
+<span class="s2">run </span><span class="si">{num_steps:d}</span>
+<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">format_data</span><span class="p">))</span></div>
+</div>
+
+
+<span class="sd">&quot;&quot;&quot; External Runners</span>
+<span class="sd">Integration with HydroPro and APBS for shape rigid body calculations.</span>
+<span class="sd">Original script by Chun Kit Chan, 2024</span>
+<span class="sd">HydroProRunner and APBSRunner module provides interfaces to external tools used in shape rigid body modeling:</span>
+<span class="sd">- HydroPro for hydrodynamic calculations</span>
+<span class="sd">- APBS for electrostatics calculations</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="HydroProRunner">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">HydroProRunner</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Interface to HydroPro for hydrodynamic calculations&quot;&quot;&quot;</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mass</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">structure_name</span><span class="o">=</span><span class="s2">&quot;hydrocal&quot;</span><span class="p">,</span> <span class="n">cal_type</span><span class="o">=</span><span class="s2">&quot;shape&quot;</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize HydroPro interface.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            mass: Mass in AMU</span>
+<span class="sd">            simconf: SimConf object with temperature, viscosity and solvent_density (optional)</span>
+<span class="sd">            structure_name: Base name of structure files</span>
+<span class="sd">            cal_type: shape or mesh, determined by program</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">DefaultSimConf</span>
+            <span class="n">simconf</span> <span class="o">=</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+            
+        <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">temperature</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">viscosity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">solvent_density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">binary</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;hydropro&#39;</span><span class="p">)</span>
+            
+        <span class="c1"># Check if binary exists</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="s2">&quot;HydroPro binary not found. Please configure in simconf.&quot;</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">binary</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;HydroPro binary not found at </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="c1"># Make binary executable if needed (Unix only)</span>
+        <span class="k">if</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;Windows&#39;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">access</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">X_OK</span><span class="p">):</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chmod</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">,</span> <span class="mo">0o755</span><span class="p">)</span>
+            
+        <span class="bp">self</span><span class="o">.</span><span class="n">structure_name</span> <span class="o">=</span> <span class="n">structure_name</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="n">mass</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cal_type</span> <span class="o">=</span> <span class="n">cal_type</span>
+        
+<div class="viewcode-block" id="HydroProRunner.write_config">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner.write_config">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_path</span><span class="o">=</span><span class="s2">&quot;hydropro.dat&quot;</span><span class="p">,</span>
+                     <span class="n">aer</span><span class="o">=</span><span class="mf">2.9</span><span class="p">,</span><span class="n">nsig</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span><span class="n">sig_min</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="n">sig_max</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="n">specific_volume</span><span class="o">=</span><span class="mf">0.702</span><span class="p">,):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Write HydroPro configuration file with explicit parameters.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            output_path: Path to write config file</span>
+<span class="sd">            cal_type: shape(0) or mesh(1)</span>
+<span class="sd">            structure_name: Name of the molecule/structure</span>
+<span class="sd">            mass: Molecular weight in Daltons (amu)</span>
+<span class="sd">            aer: Atomic Element Radius in Angstroms</span>
+<span class="sd">            nsig: Number of values of the shell thickness</span>
+<span class="sd">            sig_min: Minimum radius of beads in the shell (Angstroms)</span>
+<span class="sd">            sig_max: Maximum radius of beads in the shell (Angstroms)</span>
+<span class="sd">            specific_volume: Partial specific volume in cm³/g</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">temperature_c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">-</span> <span class="mf">273.15</span>  <span class="c1"># Convert K to C</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cal_type</span><span class="o">==</span><span class="s2">&quot;mesh&quot;</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">cal_type</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
+            <span class="n">aer</span><span class="o">=</span><span class="mi">10</span>
+            <span class="n">nsig</span><span class="o">=</span><span class="mi">4</span>
+            <span class="n">sig_min</span><span class="o">=</span><span class="mi">10</span>
+            <span class="n">sig_max</span><span class="o">=</span><span class="mi">20</span>
+            <span class="n">specific_volume</span><span class="o">=</span><span class="mi">1</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="c1"># Basic identification</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_name</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                  <span class="c1"># Name of molecule</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.hydro</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>           <span class="c1"># Base name for output files</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;hydro.pdb</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                         
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                                  <span class="c1"># Calculation type always 1 (bead surface model)</span>
+
+            <span class="c1"># Bead model parameters</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aer</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                            <span class="c1"># AER (radius in Angstroms)</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">nsig</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                           <span class="c1"># NSIG (values of shell thickness)</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">sig_min</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                        <span class="c1"># SIGMIN (min bead radius)</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">sig_max</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                        <span class="c1"># SIGMAX (max bead radius)</span>
+            
+            <span class="c1"># Physical parameters</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">temperature_c</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                  <span class="c1"># Temperature in Celsius</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                      <span class="c1"># Solvent viscosity in poise</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                           <span class="c1"># Molecular weight in Daltons</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">specific_volume</span><span class="si">}</span><span class="s2">,</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                <span class="c1"># Partial specific volume</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                 <span class="c1"># Solvent density</span>
+            
+            <span class="c1"># Calculation control parameters</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;-1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                       <span class="c1"># Number of Q values</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;-1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                      <span class="c1"># Number of intervals</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;0</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                      <span class="c1"># Monte Carlo trials</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>                                  <span class="c1"># IDIF=1 (yes) for full diffusion tensors</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">)</span>                                    <span class="c1"># End marker</span></div>
+
+
+
+<div class="viewcode-block" id="HydroProRunner.parse_output">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner.parse_output">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">parse_output</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="p">):</span>
+        <span class="n">mass</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Parse HydroPro output file to get damping coefficients.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            output_file: Path to HydroPro output file</span>
+<span class="sd">            mass: Mass in AMU used to normalize coefficients</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            tuple of (translation_damping, rotation_damping)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">lines</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
+        <span class="n">mass</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span>
+            
+        <span class="c1"># Skip header</span>
+        <span class="n">line_num</span> <span class="o">=</span> <span class="mi">48</span>
+        
+        <span class="c1"># Read translational coefficients</span>
+        <span class="n">Dx</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">line_num</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
+        <span class="n">Dy</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">line_num</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">1</span><span class="p">])</span>
+        <span class="n">Dz</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">line_num</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
+        
+        <span class="c1"># Skip two lines</span>
+        <span class="n">line_num</span> <span class="o">+=</span> <span class="mi">5</span>
+        
+        <span class="c1"># Read rotational coefficients</span>
+        <span class="n">Rx</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">line_num</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">3</span><span class="p">])</span>
+        <span class="n">Ry</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">line_num</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">4</span><span class="p">])</span>
+        <span class="n">Rz</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">line_num</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">5</span><span class="p">])</span>
+        
+        <span class="c1"># Convert units</span>
+        <span class="c1"># Translation: &quot;(295 k K) / (( cm^2/s) *  amu)&quot; &quot;1/ns&quot;</span>
+        <span class="n">trans_damp</span> <span class="o">=</span> <span class="p">[</span><span class="mf">24.527692</span><span class="o">/</span><span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">mass</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="n">Dx</span><span class="p">,</span> <span class="n">Dy</span><span class="p">,</span> <span class="n">Dz</span><span class="p">]]</span>
+        
+        <span class="c1"># Rotation: &quot;(295 k K) / ((1 /s) *  amu AA^2)&quot; &quot;1/ns&quot;</span>
+        <span class="n">rot_damp</span> <span class="o">=</span> <span class="p">[</span><span class="mf">2.4527692e+17</span> <span class="o">/</span> <span class="p">(</span><span class="n">x</span><span class="o">*</span><span class="n">mass</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="n">Rx</span><span class="p">,</span> <span class="n">Ry</span><span class="p">,</span> <span class="n">Rz</span><span class="p">]]</span>
+        
+        <span class="k">return</span> <span class="n">trans_damp</span><span class="p">,</span> <span class="n">rot_damp</span></div>
+
+                
+<div class="viewcode-block" id="HydroProRunner.run_calculation">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner.run_calculation">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">run_calculation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">work_dir</span><span class="o">=</span><span class="s2">&quot;.&quot;</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Run HydroPro calculation.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure_name: Base name of structure files</span>
+<span class="sd">            mass: Mass in AMU</span>
+<span class="sd">            work_dir: Working directory for calculation</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Dictionary containing:</span>
+<span class="sd">            - translation_damping: [Dx, Dy, Dz]</span>
+<span class="sd">            - rotation_damping: [Rx, Ry, Rz]</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">structure_name</span><span class="p">,</span> <span class="n">mass</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mass</span>
+        <span class="n">original_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+            
+            <span class="c1"># Write config</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">write_config</span><span class="p">()</span>
+            
+            <span class="c1"># Link structure file</span>
+            <span class="n">pdb_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.pdb&quot;</span><span class="p">)</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">pdb_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Structure file not found: </span><span class="si">{</span><span class="n">pdb_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">symlink</span><span class="p">(</span><span class="n">pdb_path</span><span class="p">,</span> <span class="s2">&quot;hydro.pdb&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Run HydroPro</span>
+            <span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">)],</span> 
+                                 <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> 
+                                 <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
+                                 <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+            
+            <span class="c1"># Parse results</span>
+            <span class="n">trans_damp</span><span class="p">,</span> <span class="n">rot_damp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_output</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.hydro-res.txt&quot;</span><span class="p">)</span>
+            
+            <span class="k">return</span> <span class="p">{</span>
+                <span class="s2">&quot;translation_damping&quot;</span><span class="p">:</span> <span class="n">trans_damp</span><span class="p">,</span>
+                <span class="s2">&quot;rotation_damping&quot;</span><span class="p">:</span> <span class="n">rot_damp</span>
+            <span class="p">}</span>
+            
+        <span class="k">finally</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">&quot;hydro.pdb&quot;</span><span class="p">):</span>
+                <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="s2">&quot;hydro.pdb&quot;</span><span class="p">)</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">original_dir</span><span class="p">)</span></div>
+</div>
+
+
+<div class="viewcode-block" id="APBSRunner">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.APBSRunner">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">APBSRunner</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Interface to APBS for electrostatics calculations&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">binary_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">psize_script</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize APBS interface.</span>
+<span class="sd">        Args:</span>
+<span class="sd">            binary_path: Path to APBS executable. If None, uses path from simconf</span>
+<span class="sd">            psize_script: Optional path to psize script</span>
+<span class="sd">            simconf: SimConf object (optional)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Get binary path from simconf if provided and no explicit binary_path</span>
+        <span class="k">if</span> <span class="n">binary_path</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">binary_path</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;apbs&#39;</span><span class="p">)</span>
+        
+        <span class="c1"># If still None, try binary_manager</span>
+        <span class="k">if</span> <span class="n">binary_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.sim_config</span><span class="w"> </span><span class="kn">import</span> <span class="n">binary_manager</span>
+            <span class="n">binary_path</span> <span class="o">=</span> <span class="n">binary_manager</span><span class="o">.</span><span class="n">get_binary_path</span><span class="p">(</span><span class="s1">&#39;apbs&#39;</span><span class="p">)</span>
+        
+        <span class="c1"># If still None, use &#39;apbs&#39; and rely on PATH</span>
+        <span class="k">if</span> <span class="n">binary_path</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">binary_path</span> <span class="o">=</span> <span class="s1">&#39;apbs&#39;</span>
+                
+        <span class="bp">self</span><span class="o">.</span><span class="n">binary</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">binary_path</span><span class="p">)</span>
+        <span class="c1"># Check if binary exists or is in PATH</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">shutil</span><span class="o">.</span><span class="n">which</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">)):</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;APBS binary not found at </span><span class="si">{</span><span class="n">binary_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="bp">self</span><span class="o">.</span><span class="n">psize</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">psize_script</span><span class="p">)</span> <span class="k">if</span> <span class="n">psize_script</span> <span class="k">else</span> <span class="kc">None</span>
+        
+<div class="viewcode-block" id="APBSRunner.write_config">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.APBSRunner.write_config">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">structure_name</span><span class="p">,</span> <span class="n">xyz_dims</span><span class="p">,</span> <span class="n">salt_conc</span><span class="o">=</span><span class="mf">0.15</span><span class="p">,</span> 
+                    <span class="n">temperature</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span> <span class="n">buffer</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">large_system</span><span class="o">=</span><span class="s1">&#39;Off&#39;</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Write APBS configuration file.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure_name: Base name of structure files</span>
+<span class="sd">            xyz_dims: [x, y, z] dimensions</span>
+<span class="sd">            salt_conc: Salt concentration in M</span>
+<span class="sd">            temperature: Temperature in K</span>
+<span class="sd">            buffer: Grid buffer size in Ã…</span>
+<span class="sd">            large_system: &#39;On&#39; or &#39;Off&#39; for large system mode</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Calculate grid dimensions</span>
+        <span class="n">xyz_cg</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">dim</span> <span class="o">+</span> <span class="n">buffer</span><span class="p">))</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">xyz_dims</span><span class="p">]</span>
+        
+        <span class="k">if</span> <span class="n">large_system</span> <span class="o">==</span> <span class="s1">&#39;Off&#39;</span><span class="p">:</span>
+            <span class="n">xyz_dime</span> <span class="o">=</span> <span class="n">xyz_cg</span>
+            <span class="n">center</span> <span class="o">=</span> <span class="s1">&#39;mol 1&#39;</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="c1"># For large systems, reduce grid density</span>
+            <span class="n">dividend</span> <span class="o">=</span> <span class="mi">2</span>
+            <span class="n">xyz_dime</span> <span class="o">=</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">((</span><span class="n">dim</span> <span class="o">+</span> <span class="n">buffer</span><span class="p">)</span> <span class="o">/</span> <span class="n">dividend</span><span class="p">))</span> <span class="k">for</span> <span class="n">dim</span> <span class="ow">in</span> <span class="n">xyz_dims</span><span class="p">]</span>
+            <span class="n">center</span> <span class="o">=</span> <span class="s1">&#39;mol 1&#39;</span>
+            
+        <span class="n">config</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;read</span>
+<span class="s2">mol pqr </span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.pqr</span>
+<span class="s2">end</span>
+<span class="s2">elec</span>
+<span class="s2">mg-auto</span>
+<span class="s2">dime </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">xyz_dime</span><span class="p">)</span><span class="si">}</span>
+<span class="s2">cglen </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">xyz_cg</span><span class="p">)</span><span class="si">}</span>
+<span class="s2">cgcent </span><span class="si">{</span><span class="n">center</span><span class="si">}</span>
+<span class="s2">fglen </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">xyz_cg</span><span class="p">)</span><span class="si">}</span>
+<span class="s2">fgcent </span><span class="si">{</span><span class="n">center</span><span class="si">}</span>
+<span class="s2">mol 1</span>
+<span class="s2">npbe</span>
+<span class="s2">bcfl sdh</span>
+<span class="s2">srfm smol</span>
+<span class="s2">chgm spl2</span>
+<span class="s2">ion 1 </span><span class="si">{</span><span class="n">salt_conc</span><span class="si">}</span><span class="s2"> 2.0</span>
+<span class="s2">ion -1 </span><span class="si">{</span><span class="n">salt_conc</span><span class="si">}</span><span class="s2"> 2.0</span>
+<span class="s2">pdie 12.0</span>
+<span class="s2">sdie 78.54</span>
+<span class="s2">sdens 10.0</span>
+<span class="s2">srad 1.4</span>
+<span class="s2">swin 0.3</span>
+<span class="s2">temp </span><span class="si">{</span><span class="n">temperature</span><span class="si">}</span>
+<span class="s2">gamma 0.105</span>
+<span class="s2">calcenergy no</span>
+<span class="s2">calcforce no</span>
+<span class="s2">write pot dx </span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.elec.tmp</span>
+<span class="s2">end</span>
+<span class="s2">quit&quot;&quot;&quot;</span>
+
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.apbs&quot;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">config</span><span class="p">)</span></div>
+
+            
+<div class="viewcode-block" id="APBSRunner.run_calculation">
+<a class="viewcode-back" href="../../api/simulation_engines/engine.html#arbdmodel.engine.APBSRunner.run_calculation">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">run_calculation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">structure_name</span><span class="p">,</span> <span class="n">xyz_dims</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> 
+                       <span class="n">salt_conc</span><span class="o">=</span><span class="mf">0.15</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mi">300</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Run APBS calculation.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure_name: Base name of structure files</span>
+<span class="sd">            xyz_dims: [x, y, z] dimensions</span>
+<span class="sd">            work_dir: Working directory</span>
+<span class="sd">            salt_conc: Salt concentration in M</span>
+<span class="sd">            temperature: Temperature in K</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Path to output potential file</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">original_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+            
+            <span class="c1"># Write config</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">write_config</span><span class="p">(</span><span class="n">structure_name</span><span class="p">,</span> <span class="n">xyz_dims</span><span class="p">,</span> <span class="n">salt_conc</span><span class="p">,</span> <span class="n">temperature</span><span class="p">)</span>
+            
+            <span class="c1"># Run APBS</span>
+            <span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">binary</span><span class="p">),</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.apbs&quot;</span><span class="p">],</span>
+                                 <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
+                                 <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> 
+                                 <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+            
+            <span class="n">output_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">structure_name</span><span class="si">}</span><span class="s2">.elec.tmp&quot;</span><span class="p">)</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">output_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;APBS failed to generate output file&quot;</span><span class="p">)</span>
+                
+            <span class="k">return</span> <span class="n">output_file</span>
+            
+        <span class="k">finally</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">original_dir</span><span class="p">)</span></div>
+</div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/logger.html b/_build/html/_modules/arbdmodel/logger.html
new file mode 100644
index 0000000000000000000000000000000000000000..f75f469f82f3456df6dace30d28470996dc94502
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/logger.html
@@ -0,0 +1,402 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.logger &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/logger';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.logger</h1><div class="highlight"><pre>
+<span></span>
+<span class="c1">## Set up loggers</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+
+<span class="k">def</span><span class="w"> </span><span class="nf">_get_username</span><span class="p">():</span>
+    <span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">sys</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;USER&#39;</span><span class="p">]</span>
+    <span class="k">except</span><span class="p">:</span>
+        <span class="k">return</span> <span class="kc">None</span>
+
+<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="nb">format</span><span class="o">=</span><span class="s1">&#39;</span><span class="si">%(name)s</span><span class="s1">: </span><span class="si">%(levelname)s</span><span class="s1">: </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
+<span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
+<span class="n">_ch</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
+<span class="n">_ch</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(name)s</span><span class="s1">: </span><span class="si">%(levelname)s</span><span class="s1">: </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">))</span>
+<span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">_ch</span><span class="p">)</span>
+<span class="n">logger</span><span class="o">.</span><span class="n">propagate</span> <span class="o">=</span> <span class="kc">False</span>
+
+<span class="n">devlogger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="o">+</span><span class="s1">&#39;.dev&#39;</span><span class="p">)</span>
+<span class="c1"># devlogger.setLevel(logging.DEBUG)</span>
+<span class="k">if</span> <span class="n">_get_username</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;cmaffeo2&#39;</span><span class="p">,):</span>
+    <span class="n">devlogger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">NullHandler</span><span class="p">())</span>
+
+<span class="n">_RESOURCE_DIR</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;resources&#39;</span>
+<div class="viewcode-block" id="get_resource_path">
+<a class="viewcode-back" href="../../api/utilities/logger.html#arbdmodel.logger.get_resource_path">[docs]</a>
+<span class="k">def</span><span class="w"> </span><span class="nf">get_resource_path</span><span class="p">(</span><span class="n">relative_path</span><span class="p">):</span>
+    <span class="k">return</span> <span class="n">_RESOURCE_DIR</span> <span class="o">/</span> <span class="n">relative_path</span></div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/mesh_process_surface.html b/_build/html/_modules/arbdmodel/mesh_process_surface.html
new file mode 100644
index 0000000000000000000000000000000000000000..82b7cfa934cc0049d9a7fa4f71d272dd8c0b5eed
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/mesh_process_surface.html
@@ -0,0 +1,923 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.mesh_process_surface &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/mesh_process_surface';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.mesh_process_surface</h1><div class="highlight"><pre>
+<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">gmsh</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">scipy.spatial</span><span class="w"> </span><span class="kn">import</span> <span class="n">KDTree</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.grid</span><span class="w"> </span><span class="kn">import</span> <span class="n">writeDx</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.engine</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydroProRunner</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Specialized surface mesh processor that handles triangle surface meshes </span>
+<span class="sd">&quot;&quot;&quot;</span> 
+    <span class="c1"># Conversion factors</span>
+<div class="viewcode-block" id="SurfaceMeshProcessor">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SurfaceMeshProcessor</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Process surface meshes to calculate inertia, hydrodynamics and generate potential fields&quot;&quot;&quot;</span>
+    
+    <span class="c1"># Conversion factors</span>
+    <span class="n">MICRON_TO_ANGSTROM</span> <span class="o">=</span> <span class="mi">10000</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mesh_file</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mf">19.3</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                 <span class="n">unit_scale</span><span class="o">=</span><span class="n">MICRON_TO_ANGSTROM</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Initialize processor with surface mesh file</span>
+<span class="sd">        Args:</span>
+<span class="sd">            mesh_file: Path to .msh file with surface triangles</span>
+<span class="sd">            density: Material density in g/cm^3</span>
+<span class="sd">            simconf: SimConf object containing configuration parameters</span>
+<span class="sd">            unit_scale: Conversion factor from input units to angstroms</span>
+<span class="sd">            work_dir: Directory to store output files (default: current directory)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">mesh_file</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">density</span> <span class="o">=</span> <span class="n">density</span><span class="o">*</span><span class="mf">0.6022</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span> <span class="o">=</span> <span class="n">unit_scale</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="o">.</span><span class="n">stem</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span> <span class="k">if</span> <span class="n">work_dir</span> <span class="k">else</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">DefaultSimConf</span>
+            <span class="n">simconf</span> <span class="o">=</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+            
+        <span class="c1"># Extract parameters from simconf</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">temperature</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">viscosity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">solvent_density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">binary_path</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;hydropro&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">attached_patricles</span><span class="o">=</span><span class="p">[]</span>
+        <span class="c1"># Initialize gmsh and read mesh</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">gmsh</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="p">))</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Successfully opened mesh file: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_surface_mesh</span><span class="p">()</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loaded </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">)</span><span class="si">}</span><span class="s2"> nodes and </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">)</span><span class="si">}</span><span class="s2"> elements from surface mesh&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Calculate basic properties before alignment</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_volume</span><span class="p">()</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">density</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">density_correction</span> <span class="o">=</span> <span class="mf">1.0</span>
+                
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculated volume: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ų&quot;</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculated mass: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> amu&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Align mesh to center of mass and principal axes</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_align_mesh</span><span class="p">()</span>
+            
+            <span class="c1"># Calculate final properties after alignment</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">inertia_tensor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_inertia_tensor</span><span class="p">()</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">principal_moments</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inertia_tensor</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Principal moments of inertia: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">principal_moments</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error processing mesh: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        <span class="k">finally</span><span class="p">:</span>
+            <span class="n">gmsh</span><span class="o">.</span><span class="n">finalize</span><span class="p">()</span>
+
+<div class="viewcode-block" id="SurfaceMeshProcessor.get_attached_particles">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_attached_particles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">ParticleType</span><span class="p">,</span> <span class="n">PointParticle</span>
+        <span class="n">rbp</span><span class="o">=</span><span class="n">ParticleType</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">_attached&quot;</span><span class="p">,</span> <span class="n">mass</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="n">diffusivity</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;attaching particles type </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">_attached using mesh nodes&quot;</span><span class="p">)</span>
+
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">):</span>
+            <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">node</span>
+            <span class="n">rbpi</span><span class="o">=</span><span class="n">arbdmodel</span><span class="o">.</span><span class="n">PointParticle</span><span class="p">(</span><span class="n">rbp</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span><span class="n">position</span><span class="o">=</span><span class="p">[</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">])</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">attached_patricles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rbpi</span><span class="p">)</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_load_surface_mesh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Load triangular surface mesh directly&quot;&quot;&quot;</span>
+        <span class="c1"># Get all 2D entities (surfaces)</span>
+        <span class="n">surface_entities</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">getEntities</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">surface_entities</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;No surface entities found in mesh&quot;</span><span class="p">)</span>
+            
+        <span class="c1"># Collect all triangular elements</span>
+        <span class="n">all_nodes</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+        <span class="n">all_elements</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="k">for</span> <span class="n">dim</span><span class="p">,</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">surface_entities</span><span class="p">:</span>
+            <span class="n">element_types</span><span class="p">,</span> <span class="n">element_tags</span><span class="p">,</span> <span class="n">node_tags</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">getElements</span><span class="p">(</span><span class="n">dim</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span>
+            
+            <span class="c1"># Find triangular elements (type 2 in gmsh)</span>
+            <span class="n">tri_idx</span> <span class="o">=</span> <span class="kc">None</span>
+            <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">type_num</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">element_types</span><span class="p">):</span>
+                <span class="k">if</span> <span class="n">type_num</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>  <span class="c1"># Triangle elements</span>
+                    <span class="n">tri_idx</span> <span class="o">=</span> <span class="n">i</span>
+                    <span class="k">break</span>
+                    
+            <span class="k">if</span> <span class="n">tri_idx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">element_node_tags</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">node_tags</span><span class="p">[</span><span class="n">tri_idx</span><span class="p">])</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>  <span class="c1"># Convert to 0-based</span>
+                <span class="n">all_elements</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">element_node_tags</span><span class="p">)</span>
+                <span class="n">all_nodes</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">element_node_tags</span><span class="o">.</span><span class="n">flatten</span><span class="p">())</span>
+        
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">all_elements</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;No triangular elements found in mesh&quot;</span><span class="p">)</span>
+            
+        <span class="c1"># Get coordinates of all nodes</span>
+        <span class="n">node_coords</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="k">for</span> <span class="n">node_idx</span> <span class="ow">in</span> <span class="n">all_nodes</span><span class="p">:</span>
+            <span class="n">coords</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">node_idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>  <span class="c1"># +1 because gmsh uses 1-based indexing</span>
+            <span class="n">node_coords</span><span class="p">[</span><span class="n">node_idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">coords</span>
+            
+        <span class="c1"># Create node array in sorted order</span>
+        <span class="n">sorted_node_indices</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">all_nodes</span><span class="p">)</span>
+        <span class="n">nodes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">node_coords</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">sorted_node_indices</span><span class="p">])</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span>  <span class="c1"># Apply unit conversion</span>
+        
+        <span class="c1"># Create mapping from old to new indices</span>
+        <span class="n">node_index_map</span> <span class="o">=</span> <span class="p">{</span><span class="n">old_idx</span><span class="p">:</span> <span class="n">new_idx</span> <span class="k">for</span> <span class="n">new_idx</span><span class="p">,</span> <span class="n">old_idx</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">sorted_node_indices</span><span class="p">)}</span>
+        
+        <span class="c1"># Remap element indices</span>
+        <span class="n">remapped_elements</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">all_elements</span><span class="p">:</span>
+            <span class="n">remapped_elements</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">node_index_map</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">element</span><span class="p">])</span>
+        
+        <span class="k">return</span> <span class="n">nodes</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">remapped_elements</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_volume</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate volume of the closed surface mesh using the divergence theorem&quot;&quot;&quot;</span>
+        <span class="n">total_volume</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="c1"># For a closed surface mesh, orientation is important for correct signing</span>
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">:</span>
+            <span class="c1"># Get vertices of triangle</span>
+            <span class="n">v0</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">[</span><span class="n">element</span><span class="p">]</span>
+            
+            <span class="c1"># Calculate signed volume of tetrahedron formed by triangle and origin</span>
+            <span class="c1"># V = (1/6) * ((v1-v0) × (v2-v0)) · v0</span>
+            <span class="n">v01</span> <span class="o">=</span> <span class="n">v1</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v02</span> <span class="o">=</span> <span class="n">v2</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">cross_product</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">v01</span><span class="p">,</span> <span class="n">v02</span><span class="p">)</span>
+            
+            <span class="c1"># For a properly oriented closed mesh, we use the signed volume</span>
+            <span class="c1"># This relies on triangle winding order being consistent</span>
+            <span class="n">volume</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">cross_product</span><span class="p">,</span> <span class="n">v0</span><span class="p">)</span> <span class="o">/</span> <span class="mf">6.0</span>
+            
+            <span class="c1"># Add the signed volume (will be negative for triangles facing inward)</span>
+            <span class="n">total_volume</span> <span class="o">+=</span> <span class="n">volume</span>
+        
+        <span class="c1"># Take absolute value of the final result to handle any mesh orientation issues</span>
+        <span class="k">return</span> <span class="nb">abs</span><span class="p">(</span><span class="n">total_volume</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_center_of_mass</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate center of mass of the surface mesh&quot;&quot;&quot;</span>
+        <span class="n">com</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+        <span class="n">total_weight</span> <span class="o">=</span> <span class="mi">0</span>
+        
+        <span class="c1"># For a surface mesh, weight each triangle by its area</span>
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">:</span>
+            <span class="c1"># Get vertices of triangle</span>
+            <span class="n">v0</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">[</span><span class="n">element</span><span class="p">]</span>
+            
+            <span class="c1"># Calculate area using cross product</span>
+            <span class="n">v01</span> <span class="o">=</span> <span class="n">v1</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v02</span> <span class="o">=</span> <span class="n">v2</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">area</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">v01</span><span class="p">,</span> <span class="n">v02</span><span class="p">))</span>
+            
+            <span class="c1"># Centroid of triangle</span>
+            <span class="n">centroid</span> <span class="o">=</span> <span class="p">(</span><span class="n">v0</span> <span class="o">+</span> <span class="n">v1</span> <span class="o">+</span> <span class="n">v2</span><span class="p">)</span> <span class="o">/</span> <span class="mf">3.0</span>
+            
+            <span class="c1"># Add weighted contribution</span>
+            <span class="n">com</span> <span class="o">+=</span> <span class="n">centroid</span> <span class="o">*</span> <span class="n">area</span>
+            <span class="n">total_weight</span> <span class="o">+=</span> <span class="n">area</span>
+            
+        <span class="k">return</span> <span class="n">com</span> <span class="o">/</span> <span class="n">total_weight</span> <span class="k">if</span> <span class="n">total_weight</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_inertia_tensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">inertia</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
+        
+        <span class="c1"># Compute total mass based on volume and density</span>
+        <span class="n">mass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">density</span> <span class="o">*</span> <span class="mf">0.6022</span>
+        
+        <span class="c1"># Get bounding box dimensions to estimate shape</span>
+        <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">dimensions</span> <span class="o">=</span> <span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span>
+        
+        <span class="c1"># Sort dimensions to identify major axes</span>
+        <span class="n">sorted_dims</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">dimensions</span><span class="p">)</span>
+        
+        <span class="c1"># For a rod-like object with aspect ratio AR</span>
+        <span class="c1"># Assuming AR is the ratio of length to diameter</span>
+        <span class="n">length</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">dimensions</span><span class="p">)</span>
+        <span class="n">diameter</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">dimensions</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">diameter</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">AR</span> <span class="o">=</span> <span class="n">length</span> <span class="o">/</span> <span class="n">diameter</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">AR</span> <span class="o">=</span> <span class="mf">1.0</span>
+            
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Detected dimensions: </span><span class="si">{</span><span class="n">dimensions</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Estimated aspect ratio: </span><span class="si">{</span><span class="n">AR</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Calculate moments of inertia for a cylindrical rod</span>
+        <span class="c1"># For a uniform rod of length L and radius R:</span>
+        <span class="c1"># I_axial = (1/2)MR²</span>
+        <span class="c1"># I_transverse = (1/12)ML² + (1/4)MR²</span>
+        <span class="n">radius</span> <span class="o">=</span> <span class="n">diameter</span> <span class="o">/</span> <span class="mf">2.0</span>
+        
+        <span class="c1"># Along major axis (assuming z is the major axis)</span>
+        <span class="n">I_axial</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">mass</span> <span class="o">*</span> <span class="n">radius</span><span class="o">**</span><span class="mi">2</span>
+        
+        <span class="c1"># Perpendicular to major axis</span>
+        <span class="n">I_transverse</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mf">12.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">mass</span> <span class="o">*</span> <span class="n">length</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mf">4.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">mass</span> <span class="o">*</span> <span class="n">radius</span><span class="o">**</span><span class="mi">2</span>
+        
+        <span class="c1"># Create a diagonal inertia tensor based on these analytic expressions</span>
+        <span class="c1"># Identify which axis is the major axis (longest dimension)</span>
+        <span class="n">major_axis_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">dimensions</span><span class="p">)</span>
+        
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
+            <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">major_axis_idx</span><span class="p">:</span>
+                <span class="n">inertia</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">I_axial</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">inertia</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">I_transverse</span>
+        
+        <span class="k">return</span> <span class="n">inertia</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_align_mesh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Align mesh to center of mass and principal axes with longest dimension along Z-axis&quot;&quot;&quot;</span>
+        <span class="c1"># First center the mesh</span>
+        <span class="n">com</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_center_of_mass</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">-=</span> <span class="n">com</span>
+        
+        <span class="c1"># Get bounding box dimensions to estimate shape</span>
+        <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">dimensions</span> <span class="o">=</span> <span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Pre-alignment dimensions: </span><span class="si">{</span><span class="n">dimensions</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Calculate and diagonalize inertia tensor</span>
+        <span class="n">inertia</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_inertia_tensor</span><span class="p">()</span>
+        <span class="n">eigenvalues</span><span class="p">,</span> <span class="n">eigenvectors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">eigh</span><span class="p">(</span><span class="n">inertia</span><span class="p">)</span>
+        
+        <span class="c1"># For a rod, smallest moment of inertia is along the rod axis</span>
+        <span class="c1"># We want this to be aligned with the Z-axis (axis 2)</span>
+        <span class="n">sort_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">eigenvalues</span><span class="p">)</span>
+        
+        <span class="c1"># Reorder to put smallest moment (rod axis) as Z</span>
+        <span class="c1"># Z should be axis 2, so we want the smallest moment to be last</span>
+        <span class="n">z_vec</span> <span class="o">=</span> <span class="n">eigenvectors</span><span class="p">[:,</span> <span class="n">sort_idx</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>  <span class="c1"># Vector of smallest moment (rod axis)</span>
+        <span class="n">x_vec</span> <span class="o">=</span> <span class="n">eigenvectors</span><span class="p">[:,</span> <span class="n">sort_idx</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
+        <span class="n">y_vec</span> <span class="o">=</span> <span class="n">eigenvectors</span><span class="p">[:,</span> <span class="n">sort_idx</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
+        
+        <span class="c1"># Create new eigenvector matrix with Z as the rod axis</span>
+        <span class="n">reordered_eigenvectors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">column_stack</span><span class="p">([</span><span class="n">x_vec</span><span class="p">,</span> <span class="n">y_vec</span><span class="p">,</span> <span class="n">z_vec</span><span class="p">])</span>
+        
+        <span class="c1"># Ensure right-handed coordinate system</span>
+        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">det</span><span class="p">(</span><span class="n">reordered_eigenvectors</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">reordered_eigenvectors</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span>
+            
+        <span class="c1"># Rotate mesh to align with principal axes with rod along Z</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">@</span> <span class="n">reordered_eigenvectors</span>
+        
+        <span class="c1"># Get post-alignment dimensions</span>
+        <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">dimensions</span> <span class="o">=</span> <span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Post-alignment dimensions: </span><span class="si">{</span><span class="n">dimensions</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Verify that Z is now the longest dimension</span>
+        <span class="k">if</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&lt;</span> <span class="nb">max</span><span class="p">(</span><span class="n">dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;WARNING: Z-axis is not the longest dimension after alignment!&quot;</span><span class="p">)</span>
+            
+        <span class="c1"># Calculate aspect ratio (using Z as length)</span>
+        <span class="n">length</span> <span class="o">=</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>  <span class="c1"># Z axis should be the rod length</span>
+        <span class="n">width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>  <span class="c1"># Use max of X or Y for width</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aspect_ratio</span> <span class="o">=</span> <span class="n">length</span> <span class="o">/</span> <span class="n">width</span> <span class="k">if</span> <span class="n">width</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mf">1.0</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculated aspect ratio: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">aspect_ratio</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Store transformation</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rotation_matrix</span> <span class="o">=</span> <span class="n">reordered_eigenvectors</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">translation</span> <span class="o">=</span> <span class="n">com</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Aligned mesh to principal axes with rod along Z-axis, COM: </span><span class="si">{</span><span class="n">com</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+
+<div class="viewcode-block" id="SurfaceMeshProcessor.calculate_damping">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">calculate_damping</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate hydrodynamic properties using HydroPro&quot;&quot;&quot;</span>
+        <span class="c1"># Create work directory if it doesn&#39;t exist</span>
+        <span class="k">if</span> <span class="n">work_dir</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">work_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+            
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+
+        <span class="n">base_path</span> <span class="o">=</span> <span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;hydrocal&quot;</span>
+        
+        <span class="c1"># Save the mesh in PDB format for HydroPro</span>
+        <span class="n">pdb_path</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">base_path</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;.pdb&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">save_as_pdb</span><span class="p">(</span><span class="n">pdb_path</span><span class="p">)</span>
+        
+        <span class="c1"># Run HydroPro to get hydrodynamic properties</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">runner</span> <span class="o">=</span> <span class="n">HydroProRunner</span><span class="p">(</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="p">,</span>
+            <span class="n">binary_path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">binary_path</span><span class="p">,</span>
+            <span class="n">temperature</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="p">,</span>
+            <span class="n">viscosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span><span class="p">,</span>
+            <span class="n">solvent_density</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span><span class="p">,</span>
+            <span class="n">structure_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span>
+        <span class="p">)</span>
+        
+        <span class="n">results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">runner</span><span class="o">.</span><span class="n">run_calculation</span><span class="p">(</span><span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="s1">&#39;translation_damping&#39;</span><span class="p">]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rotational_damping_coefficient</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="s1">&#39;rotation_damping&#39;</span><span class="p">]</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Translational damping: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Rotational damping: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rotational_damping_coefficient</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="k">return</span> <span class="n">pdb_path</span></div>
+
+
+<div class="viewcode-block" id="SurfaceMeshProcessor.generate_potential_grid">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">generate_potential_grid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spacing</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">buffer</span><span class="o">=</span><span class="mf">20.0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">cutoff</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span> <span class="n">max_potential</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate potential grid for ARBD&quot;&quot;&quot;</span>
+        <span class="c1"># Calculate grid bounds with buffer</span>
+        <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">-</span> <span class="n">buffer</span>
+        <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="n">buffer</span>
+        
+        <span class="c1"># Create grid points</span>
+        <span class="n">npts</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span><span class="p">)</span> <span class="o">/</span> <span class="n">spacing</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
+        <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">bounds_min</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">bounds_max</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">npts</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+        <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">bounds_min</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">bounds_max</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">npts</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
+        <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">bounds_min</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">bounds_max</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">npts</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
+        <span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">indexing</span><span class="o">=</span><span class="s1">&#39;ij&#39;</span><span class="p">)</span>
+        
+        <span class="c1"># Create KD-tree for fast distance calculations</span>
+        <span class="n">tree</span> <span class="o">=</span> <span class="n">KDTree</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">)</span>
+        
+        <span class="c1"># Calculate distances to nearest surface points</span>
+        <span class="n">grid_points</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span><span class="n">X</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">Y</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">Z</span><span class="o">.</span><span class="n">ravel</span><span class="p">()])</span><span class="o">.</span><span class="n">T</span>
+        <span class="n">distances</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">grid_points</span><span class="p">)</span>
+        <span class="n">distances</span> <span class="o">=</span> <span class="n">distances</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
+        
+        <span class="c1"># Generate potential</span>
+        <span class="n">potential</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">distances</span><span class="p">)</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">distances</span> <span class="o">&lt;=</span> <span class="n">cutoff</span>
+        <span class="n">potential</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">max_potential</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="mi">1</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">k</span> <span class="o">*</span> <span class="n">distances</span><span class="p">[</span><span class="n">mask</span><span class="p">])))</span>
+        
+        <span class="k">return</span> <span class="n">potential</span><span class="p">,</span> <span class="n">bounds_min</span><span class="p">,</span> <span class="n">spacing</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span></div>
+
+        
+<div class="viewcode-block" id="SurfaceMeshProcessor.write_no_enter_potential_dx">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_no_enter_potential_dx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">output_file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">outfile</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="o">+</span><span class="s2">&quot;.dx&quot;</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate and write potential field to DX file&quot;&quot;&quot;</span>
+        <span class="n">potential</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="n">delta</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_potential_grid</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+        <span class="n">writeDx</span><span class="p">(</span><span class="n">output_file</span><span class="p">,</span> <span class="n">potential</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="SurfaceMeshProcessor.save_aligned_mesh">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">save_aligned_mesh</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Save the aligned mesh to a new .msh file&quot;&quot;&quot;</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;aligned_mesh&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># For surface mesh</span>
+        <span class="n">entity_dim</span> <span class="o">=</span> <span class="mi">2</span>
+        <span class="n">element_type</span> <span class="o">=</span> <span class="mi">2</span>  <span class="c1"># Triangle in gmsh</span>
+            
+        <span class="c1"># Add a discrete entity</span>
+        <span class="n">entity_tag</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">addDiscreteEntity</span><span class="p">(</span><span class="n">entity_dim</span><span class="p">)</span>
+        
+        <span class="c1"># Add nodes</span>
+        <span class="n">node_tags</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">node_coords</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">):</span>
+            <span class="n">tag</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+            <span class="n">node_tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+            <span class="n">node_coords</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">node</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span><span class="p">)</span>  <span class="c1"># Convert back to mesh units</span>
+            
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">addNodes</span><span class="p">(</span><span class="n">entity_dim</span><span class="p">,</span> <span class="n">entity_tag</span><span class="p">,</span> <span class="n">node_tags</span><span class="p">,</span> <span class="n">node_coords</span><span class="p">)</span>
+        
+        <span class="c1"># Add elements</span>
+        <span class="n">element_tags</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">element_nodes</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">element</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">):</span>
+            <span class="n">tag</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+            <span class="n">element_tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+            <span class="n">element_nodes</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">element</span><span class="p">])</span>  <span class="c1"># Convert to 1-based indexing</span>
+            
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">addElements</span><span class="p">(</span><span class="n">entity_dim</span><span class="p">,</span> <span class="n">entity_tag</span><span class="p">,</span> <span class="p">[</span><span class="n">element_type</span><span class="p">],</span> <span class="p">[</span><span class="n">element_tags</span><span class="p">],</span> <span class="p">[</span><span class="n">element_nodes</span><span class="p">])</span>
+        
+        <span class="c1"># Write mesh</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">output_file</span><span class="p">))</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">finalize</span><span class="p">()</span></div>
+
+            
+<div class="viewcode-block" id="SurfaceMeshProcessor.save_as_pdb">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">save_as_pdb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="p">):</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Save the aligned mesh as a PDB file (coordinates in Ã…)&quot;&quot;&quot;</span>
+        <span class="c1"># PDB format specifications</span>
+        <span class="n">HEADER</span> <span class="o">=</span> <span class="s2">&quot;HEADER    ALIGNED SURFACE MESH                   &quot;</span>
+        <span class="n">ATOM_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;ATOM  </span><span class="si">{:5d}</span><span class="s2"> </span><span class="si">{:4s}</span><span class="s2"> </span><span class="si">{:3s}</span><span class="s2"> </span><span class="si">{:1s}{:4d}</span><span class="s2">    </span><span class="si">{:8.3f}{:8.3f}{:8.3f}{:6.2f}{:6.2f}</span><span class="s2">&quot;</span>
+        
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="c1"># Write header</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
+            <span class="n">date_str</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%d</span><span class="s2">-%b-%y&quot;</span><span class="p">)</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">HEADER</span><span class="si">}{</span><span class="n">date_str</span><span class="si">}</span><span class="s2">   XXXX</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Calculate box dimensions for CRYST record</span>
+            <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+            <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+            <span class="n">box_dimensions</span> <span class="o">=</span> <span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span>
+            
+            <span class="c1"># Write crystallographic information</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;CRYST1</span><span class="si">{</span><span class="n">box_dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">:</span><span class="s2">9.3f</span><span class="si">}{</span><span class="n">box_dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">:</span><span class="s2">9.3f</span><span class="si">}{</span><span class="n">box_dimensions</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="si">:</span><span class="s2">9.3f</span><span class="si">}</span><span class="s2">  90.00  90.00  90.00 P 1           1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Write atoms (nodes from the mesh)</span>
+            <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">):</span>
+                <span class="c1"># PDB uses 1-indexed atom numbers</span>
+                <span class="n">atom_num</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+                <span class="c1"># Use CA (alpha carbon) atom type for visibility in viewers</span>
+                <span class="n">atom_name</span> <span class="o">=</span> <span class="s2">&quot; CA &quot;</span>
+                <span class="c1"># Use residue name MES for mesh</span>
+                <span class="n">res_name</span> <span class="o">=</span> <span class="s2">&quot;MES&quot;</span>
+                <span class="c1"># Use chain ID A</span>
+                <span class="n">chain_id</span> <span class="o">=</span> <span class="s2">&quot;A&quot;</span>
+                <span class="c1"># Residue number = atom number for simplicity</span>
+                <span class="n">res_num</span> <span class="o">=</span> <span class="n">atom_num</span> <span class="o">%</span> <span class="mi">10000</span>  <span class="c1"># PDB format limits res numbers to 9999</span>
+                <span class="c1"># X, Y, Z coordinates in Ångströms (already in the correct units)</span>
+                <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">node</span>
+                <span class="c1"># Use 1.0 for occupancy and 0.0 for temperature factor</span>
+                <span class="n">occupancy</span> <span class="o">=</span> <span class="mf">1.0</span>
+                <span class="n">temp_factor</span> <span class="o">=</span> <span class="mf">0.0</span>
+                
+                <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ATOM_FORMAT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">atom_num</span><span class="p">,</span><span class="w"> </span><span class="n">atom_name</span><span class="p">,</span><span class="w"> </span><span class="n">res_name</span><span class="p">,</span><span class="w"> </span><span class="n">chain_id</span><span class="p">,</span><span class="w"> </span><span class="n">res_num</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">,</span><span class="w"> </span><span class="n">occupancy</span><span class="p">,</span><span class="w"> </span><span class="n">temp_factor</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Write connectivity (the mesh elements) as CONECT records</span>
+            <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">:</span>
+                <span class="c1"># PDB CONECT records use 1-indexed atom numbers</span>
+                <span class="n">atom_indices</span> <span class="o">=</span> <span class="p">[</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">element</span><span class="p">]</span>
+                
+                <span class="c1"># Create a CONECT record for each edge of the triangle</span>
+                <span class="n">edges</span> <span class="o">=</span> <span class="p">[(</span><span class="n">atom_indices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">atom_indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> 
+                         <span class="p">(</span><span class="n">atom_indices</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">atom_indices</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> 
+                         <span class="p">(</span><span class="n">atom_indices</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">atom_indices</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
+                
+                <span class="k">for</span> <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">:</span>
+                    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;CONECT</span><span class="si">{</span><span class="n">a1</span><span class="si">:</span><span class="s2">5d</span><span class="si">}{</span><span class="n">a2</span><span class="si">:</span><span class="s2">5d</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Write end of file</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;END</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved aligned mesh as PDB: </span><span class="si">{</span><span class="n">output_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="SurfaceMeshProcessor.save_aligned_mesh_both_formats">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">save_aligned_mesh_both_formats</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base_filename</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Save the aligned mesh in both MSH and PDB formats&quot;&quot;&quot;</span>
+        <span class="c1"># Save as MSH (in microns)</span>
+        <span class="n">msh_filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_filename</span><span class="si">}</span><span class="s2">.msh&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">save_aligned_mesh</span><span class="p">(</span><span class="n">msh_filename</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved aligned mesh as MSH: </span><span class="si">{</span><span class="n">msh_filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Save as PDB (in Ångströms)</span>
+        <span class="n">pdb_filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_filename</span><span class="si">}</span><span class="s2">.pdb&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">save_as_pdb</span><span class="p">(</span><span class="n">pdb_filename</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved aligned mesh as PDB: </span><span class="si">{</span><span class="n">pdb_filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+</div>
+
+
+
+<div class="viewcode-block" id="process_surface_mesh">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.process_surface_mesh">[docs]</a>
+<span class="k">def</span><span class="w"> </span><span class="nf">process_surface_mesh</span><span class="p">(</span><span class="n">mesh_file</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mf">19.3</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mi">303</span><span class="p">,</span> <span class="n">viscosity</span><span class="o">=</span><span class="mf">0.01</span><span class="p">,</span>
+                        <span class="n">solvent_density</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">output_dx</span><span class="o">=</span><span class="s2">&quot;surface_potential.dx&quot;</span><span class="p">,</span> 
+                        <span class="n">output_mesh</span><span class="o">=</span><span class="s2">&quot;aligned_surface.msh&quot;</span><span class="p">,</span> <span class="n">binary_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Process surface mesh file and calculate all properties</span>
+<span class="sd">    </span>
+<span class="sd">    Args:</span>
+<span class="sd">        mesh_file: Path to .msh file containing surface triangles</span>
+<span class="sd">        density: Material density in g/cm³</span>
+<span class="sd">        temperature: Temperature in Kelvin</span>
+<span class="sd">        viscosity: Solvent viscosity in poise</span>
+<span class="sd">        solvent_density: Solvent density in g/cm³</span>
+<span class="sd">        output_dx: Optional path to output potential DX file</span>
+<span class="sd">        output_mesh: Optional path to save aligned mesh</span>
+<span class="sd">        binary_path: Path to HydroPro executable</span>
+<span class="sd">        expected_mass: Optional expected mass in amu to calibrate calculations</span>
+<span class="sd">        expected_aspect_ratio: Optional expected aspect ratio to calibrate inertia</span>
+<span class="sd">        **kwargs: Additional arguments for potential generation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">processor</span> <span class="o">=</span> <span class="n">SurfaceMeshProcessor</span><span class="p">(</span>
+        <span class="n">mesh_file</span><span class="p">,</span>
+        <span class="n">density</span><span class="o">=</span><span class="n">density</span><span class="p">,</span>
+        <span class="n">temperature</span><span class="o">=</span><span class="n">temperature</span><span class="p">,</span>
+        <span class="n">viscosity</span><span class="o">=</span><span class="n">viscosity</span><span class="p">,</span>
+        <span class="n">solvent_density</span><span class="o">=</span><span class="n">solvent_density</span><span class="p">,</span>
+        <span class="n">binary_path</span><span class="o">=</span><span class="n">binary_path</span><span class="p">,</span>
+    <span class="p">)</span>
+    
+    <span class="c1"># Calculate hydrodynamic properties</span>
+    <span class="n">processor</span><span class="o">.</span><span class="n">calculate_damping</span><span class="p">()</span>
+    
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Mass: </span><span class="si">{</span><span class="n">processor</span><span class="o">.</span><span class="n">mass</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2"> amu&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Volume: </span><span class="si">{</span><span class="n">processor</span><span class="o">.</span><span class="n">volume</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2"> ų&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Principal moments of inertia:&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">processor</span><span class="o">.</span><span class="n">principal_moments</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Translational damping coefficients [1/ns]:&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">processor</span><span class="o">.</span><span class="n">transdamp</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Rotational damping coefficients [1/ns]:&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">processor</span><span class="o">.</span><span class="n">rotational_damping_coefficient</span><span class="p">)</span>
+    
+    <span class="k">if</span> <span class="n">output_dx</span><span class="p">:</span>
+        <span class="n">processor</span><span class="o">.</span><span class="n">write_no_enter_potential_dx</span><span class="p">()</span>
+        
+    <span class="k">if</span> <span class="n">output_mesh</span><span class="p">:</span>
+        <span class="n">processor</span><span class="o">.</span><span class="n">save_aligned_mesh</span><span class="p">(</span><span class="n">output_mesh</span><span class="p">)</span>
+        
+    <span class="k">return</span> <span class="n">processor</span></div>
+
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">process_surface_mesh</span><span class="p">(</span><span class="s2">&quot;surface_mesh.msh&quot;</span><span class="p">)</span>
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/mesh_process_volume.html b/_build/html/_modules/arbdmodel/mesh_process_volume.html
new file mode 100644
index 0000000000000000000000000000000000000000..cd1bf11b60a59beaab6655c32e52d61ebe29bd43
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/mesh_process_volume.html
@@ -0,0 +1,1016 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.mesh_process_volume &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/mesh_process_volume';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.mesh_process_volume</h1><div class="highlight"><pre>
+<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">gmsh</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">scipy.spatial</span><span class="w"> </span><span class="kn">import</span> <span class="n">KDTree</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.grid</span><span class="w"> </span><span class="kn">import</span> <span class="n">writeDx</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.engine</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydroProRunner</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Improved mesh processor with corrected inertia calculations based purely on mesh geometry</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="MeshProcessor">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">MeshProcessor</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Process gmsh files to calculate inertia, hydrodynamics and generate potential fields&quot;&quot;&quot;</span>    
+    <span class="c1"># Conversion factors</span>
+    <span class="n">MICRON_TO_ANGSTROM</span> <span class="o">=</span> <span class="mi">10000</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mesh_file</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mf">19.3</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unit_scale</span><span class="o">=</span><span class="n">MICRON_TO_ANGSTROM</span><span class="p">,</span> 
+                 <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">expected_mass</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Initialize processor with mesh file</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            mesh_file: Path to .msh file</span>
+<span class="sd">            density: Material density in g/cm^3</span>
+<span class="sd">            simconf: SimConf object containing configuration parameters</span>
+<span class="sd">            unit_scale: Conversion factor from input units to angstroms</span>
+<span class="sd">            work_dir: Working directory</span>
+<span class="sd">            expected_mass: Optional expected mass in amu to calibrate calculations</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">mesh_file</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">density</span> <span class="o">=</span> <span class="n">density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span> <span class="o">=</span> <span class="n">unit_scale</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">expected_mass</span> <span class="o">=</span> <span class="n">expected_mass</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span> <span class="k">if</span> <span class="n">work_dir</span> <span class="k">else</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">DefaultSimConf</span>
+            <span class="n">simconf</span><span class="o">=</span><span class="n">DefaultSimConf</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="o">=</span><span class="n">simconf</span>
+
+
+        <span class="c1"># Extract parameters from simconf</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">temperature</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">viscosity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">solvent_density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">binary_path</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;hydropro&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="o">.</span><span class="n">stem</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">attached_patricles</span><span class="o">=</span><span class="p">[]</span>
+        
+        <span class="c1"># Initialize gmsh and read mesh</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">gmsh</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="p">))</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Successfully opened mesh file: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># First, load the full volumetric mesh for physical calculations</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_nodes</span><span class="p">()</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">volume_elements</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_elements</span><span class="p">()</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Loaded </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span><span class="p">)</span><span class="si">}</span><span class="s2"> nodes and </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume_elements</span><span class="p">)</span><span class="si">}</span><span class="s2"> elements from volume mesh&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Then extract surface mesh for visualization and HydroPro</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_extract_surface_mesh</span><span class="p">()</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Extracted </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">)</span><span class="si">}</span><span class="s2"> nodes and </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">)</span><span class="si">}</span><span class="s2"> elements from surface mesh&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Calculate volume using volumetric mesh</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_volume</span><span class="p">()</span>
+            
+            <span class="c1"># Calculate mass with density correction if needed</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_mass</span><span class="p">:</span>
+                <span class="c1"># Use expected mass if provided</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_mass</span>
+                <span class="c1"># Update density to match expected mass</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">density_correction</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_mass</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">*</span> <span class="mf">0.6022</span><span class="p">)</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Using expected mass: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> amu (density correction: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">density_correction</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="c1"># Convert density from g/cm^3 to amu/Ã…^3</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">density</span> <span class="o">*</span> <span class="mf">0.6022</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">density_correction</span> <span class="o">=</span> <span class="mf">1.0</span>
+                
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculated volume: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> ų&quot;</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculated mass: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2"> amu&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Align both meshes to center of mass and principal axes</span>
+            <span class="c1"># Important: Center of mass calculation needs to be fixed to use the volumetric mesh</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_align_mesh</span><span class="p">()</span>
+            
+            <span class="c1"># Calculate inertia tensor using volumetric mesh with corrected method</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">inertia_tensor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_correct_inertia_tensor</span><span class="p">()</span>
+
+            <span class="bp">self</span><span class="o">.</span><span class="n">principal_moments</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">inertia_tensor</span><span class="p">)</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Principal moments of inertia: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">principal_moments</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error processing mesh: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            <span class="k">raise</span>
+        <span class="k">finally</span><span class="p">:</span>
+            <span class="n">gmsh</span><span class="o">.</span><span class="n">finalize</span><span class="p">()</span>
+
+<div class="viewcode-block" id="MeshProcessor.get_attached_particles">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_attached_particles</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">ParticleType</span><span class="p">,</span> <span class="n">PointParticle</span>
+        <span class="n">rbp</span><span class="o">=</span><span class="n">ParticleType</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">_attached&quot;</span><span class="p">,</span> <span class="n">mass</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="n">diffusivity</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;attaching particles type </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">_attached using mesh nodes&quot;</span><span class="p">)</span>
+
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">):</span>
+            <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">node</span>
+            <span class="n">rbpi</span><span class="o">=</span><span class="n">PointParticle</span><span class="p">(</span><span class="n">rbp</span><span class="p">,</span><span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span><span class="n">position</span><span class="o">=</span><span class="p">[</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">])</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">attached_patricles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rbpi</span><span class="p">)</span>
+
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">attached_patricles</span></div>
+
+            
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_nodes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Get all mesh nodes with unit conversion&quot;&quot;&quot;</span>
+        <span class="n">node_tags</span><span class="p">,</span> <span class="n">node_coords</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">getNodes</span><span class="p">()</span>
+        <span class="n">coords</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">node_coords</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">coords</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span>  <span class="c1"># Convert to angstroms</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_elements</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Get tetrahedral elements from the volume mesh&quot;&quot;&quot;</span>
+        <span class="n">element_types</span><span class="p">,</span> <span class="n">element_tags</span><span class="p">,</span> <span class="n">node_tags</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">getElements</span><span class="p">(</span><span class="n">dim</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">element_types</span><span class="p">:</span>  <span class="c1"># No volume elements found</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;No tetrahedral elements found in mesh&quot;</span><span class="p">)</span>
+            
+        <span class="c1"># Find tetrahedral elements (type 4 in gmsh)</span>
+        <span class="n">tet_idx</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">type_num</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">element_types</span><span class="p">):</span>
+            <span class="k">if</span> <span class="n">type_num</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>  <span class="c1"># Tetrahedral elements</span>
+                <span class="n">tet_idx</span> <span class="o">=</span> <span class="n">i</span>
+                <span class="k">break</span>
+                
+        <span class="k">if</span> <span class="n">tet_idx</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;No tetrahedral elements found in mesh&quot;</span><span class="p">)</span>
+        <span class="c1"># Convert to 0-based indexing and reshape to Nx4 array</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">elements</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">node_tags</span><span class="p">[</span><span class="n">tet_idx</span><span class="p">])</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;You are not using a volume mesh&quot;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">elements</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_extract_surface_mesh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Extract surface mesh from a 3D volumetric mesh&quot;&quot;&quot;</span>
+        <span class="c1"># Get 3D elements</span>
+        <span class="n">dim3_entities</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">getEntities</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">dim3_entities</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;No 3D volume elements found in mesh&quot;</span><span class="p">)</span>
+            
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Found 3D volumetric mesh, extracting surface...&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Create topology for boundary extraction</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">createTopology</span><span class="p">()</span>
+        
+        <span class="c1"># Get surface elements</span>
+        <span class="n">surface_dimtags</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">getBoundary</span><span class="p">([(</span><span class="mi">3</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span> <span class="k">for</span> <span class="n">dim</span><span class="p">,</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">dim3_entities</span><span class="p">],</span> 
+                                                <span class="n">combined</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">oriented</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+        
+        <span class="c1"># Create a new physical group for the surface</span>
+        <span class="n">surface_tag</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">addPhysicalGroup</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="p">[</span><span class="n">tag</span> <span class="k">for</span> <span class="n">dim</span><span class="p">,</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">surface_dimtags</span><span class="p">])</span>
+        
+        <span class="c1"># Get nodes associated with surface elements</span>
+        <span class="n">all_surface_nodes</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+        <span class="n">surface_elements</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="k">for</span> <span class="n">dim</span><span class="p">,</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">surface_dimtags</span><span class="p">:</span>
+            <span class="n">element_types</span><span class="p">,</span> <span class="n">element_tags</span><span class="p">,</span> <span class="n">node_tags</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">getElements</span><span class="p">(</span><span class="n">dim</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span>
+            
+            <span class="c1"># We only want triangular elements (type 2)</span>
+            <span class="n">tri_idx</span> <span class="o">=</span> <span class="kc">None</span>
+            <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">type_num</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">element_types</span><span class="p">):</span>
+                <span class="k">if</span> <span class="n">type_num</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>  <span class="c1"># Triangle elements</span>
+                    <span class="n">tri_idx</span> <span class="o">=</span> <span class="n">i</span>
+                    <span class="k">break</span>
+                    
+            <span class="k">if</span> <span class="n">tri_idx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">node_tags_array</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">node_tags</span><span class="p">[</span><span class="n">tri_idx</span><span class="p">])</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>  <span class="c1"># Convert to 0-based</span>
+                <span class="n">surface_elements</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">node_tags_array</span><span class="p">)</span>
+                <span class="n">all_surface_nodes</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">node_tags_array</span><span class="o">.</span><span class="n">flatten</span><span class="p">())</span>
+        
+        <span class="c1"># Get coordinates of surface nodes</span>
+        <span class="n">surface_nodes</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">node_index_map</span> <span class="o">=</span> <span class="p">{}</span>  <span class="c1"># Map old indices to new ones</span>
+        
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">old_idx</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">all_surface_nodes</span><span class="p">)):</span>
+            <span class="n">coords</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">getNode</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">old_idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>  <span class="c1"># +1 because gmsh uses 1-based indexing</span>
+            <span class="n">surface_nodes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coords</span><span class="p">)</span>
+            <span class="n">node_index_map</span><span class="p">[</span><span class="n">old_idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
+            
+        <span class="c1"># Remap element indices</span>
+        <span class="n">remapped_elements</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">surface_elements</span><span class="p">:</span>
+            <span class="n">remapped_elements</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">node_index_map</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">element</span><span class="p">])</span>
+            
+        <span class="c1"># Convert to numpy arrays and apply unit conversion</span>
+        <span class="n">nodes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">surface_nodes</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span>
+        <span class="n">elements</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">remapped_elements</span><span class="p">)</span>
+        
+        <span class="k">return</span> <span class="n">nodes</span><span class="p">,</span> <span class="n">elements</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_correct_inertia_tensor</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate inertia tensor correctly using tetrahedral elements from the volume mesh&quot;&quot;&quot;</span>
+        <span class="c1"># Initialize inertia tensor</span>
+        <span class="n">inertia</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
+        
+        <span class="c1"># Set density (including any correction factors)</span>
+        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;density_correction&#39;</span><span class="p">):</span>
+            <span class="n">effective_density</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">density</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">density_correction</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">effective_density</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">density</span>
+            
+        <span class="c1"># Conversion factor from g/cm^3 to amu/Ã…^3</span>
+        <span class="n">density_amu</span> <span class="o">=</span> <span class="n">effective_density</span> <span class="o">*</span> <span class="mf">0.6022</span>
+        
+        <span class="c1"># For each tetrahedral element</span>
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_elements</span><span class="p">:</span>
+            <span class="c1"># Get vertices of tetrahedron</span>
+            <span class="n">v0</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v3</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span><span class="p">[</span><span class="n">element</span><span class="p">]</span>
+            
+            <span class="c1"># Calculate volume of tetrahedron</span>
+            <span class="c1"># V = (1/6) * |((v1-v0) × (v2-v0)) · (v3-v0)|</span>
+            <span class="n">v01</span> <span class="o">=</span> <span class="n">v1</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v02</span> <span class="o">=</span> <span class="n">v2</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v03</span> <span class="o">=</span> <span class="n">v3</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">volume</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">v01</span><span class="p">,</span> <span class="n">v02</span><span class="p">),</span> <span class="n">v03</span><span class="p">))</span> <span class="o">/</span> <span class="mf">6.0</span>
+            
+            <span class="c1"># Mass of tetrahedron</span>
+            <span class="n">tetra_mass</span> <span class="o">=</span> <span class="n">volume</span> <span class="o">*</span> <span class="n">density_amu</span>
+            
+            <span class="c1"># Centroid of tetrahedron</span>
+            <span class="n">centroid</span> <span class="o">=</span> <span class="p">(</span><span class="n">v0</span> <span class="o">+</span> <span class="n">v1</span> <span class="o">+</span> <span class="n">v2</span> <span class="o">+</span> <span class="n">v3</span><span class="p">)</span> <span class="o">/</span> <span class="mf">4.0</span>
+            
+            <span class="c1"># Tetrahedron inertia tensor calculation</span>
+            <span class="c1"># For a tetrahedron, we need to integrate over the volume</span>
+            <span class="c1"># See: https://en.wikipedia.org/wiki/List_of_moments_of_inertia</span>
+            
+            <span class="c1"># Set up vertices relative to centroid</span>
+            <span class="n">vertices_centered</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span>
+                <span class="n">v0</span> <span class="o">-</span> <span class="n">centroid</span><span class="p">,</span>
+                <span class="n">v1</span> <span class="o">-</span> <span class="n">centroid</span><span class="p">,</span>
+                <span class="n">v2</span> <span class="o">-</span> <span class="n">centroid</span><span class="p">,</span>
+                <span class="n">v3</span> <span class="o">-</span> <span class="n">centroid</span>
+            <span class="p">])</span>
+            
+            <span class="c1"># Compute the inertia tensor for tetrahedron about its centroid</span>
+            <span class="c1"># We&#39;ll use the formula for a general tetrahedron</span>
+            <span class="n">local_inertia</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
+            
+            <span class="c1"># Set up a matrix with columns for each coordinate</span>
+            <span class="n">x</span> <span class="o">=</span> <span class="n">vertices_centered</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span>
+            <span class="n">y</span> <span class="o">=</span> <span class="n">vertices_centered</span><span class="p">[:,</span> <span class="mi">1</span><span class="p">]</span>
+            <span class="n">z</span> <span class="o">=</span> <span class="n">vertices_centered</span><span class="p">[:,</span> <span class="mi">2</span><span class="p">]</span>
+            
+            <span class="c1"># Calculate second moments</span>
+            <span class="n">xx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span>
+            <span class="n">yy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">y</span> <span class="o">*</span> <span class="n">y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span>
+            <span class="n">zz</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">z</span> <span class="o">*</span> <span class="n">z</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span>
+            
+            <span class="n">xy</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span>
+            <span class="n">xz</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">z</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span>
+            <span class="n">yz</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">y</span> <span class="o">*</span> <span class="n">z</span><span class="p">)</span> <span class="o">/</span> <span class="mf">10.0</span>
+            
+            <span class="c1"># Fill in the local inertia tensor</span>
+            <span class="n">local_inertia</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">yy</span> <span class="o">+</span> <span class="n">zz</span>
+            <span class="n">local_inertia</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">xx</span> <span class="o">+</span> <span class="n">zz</span>
+            <span class="n">local_inertia</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">xx</span> <span class="o">+</span> <span class="n">yy</span>
+            
+            <span class="n">local_inertia</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">local_inertia</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">xy</span>
+            <span class="n">local_inertia</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">local_inertia</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">xz</span>
+            <span class="n">local_inertia</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">local_inertia</span><span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">yz</span>
+            
+            <span class="c1"># Scale by mass</span>
+            <span class="n">local_inertia</span> <span class="o">*=</span> <span class="n">tetra_mass</span>
+            
+            <span class="c1"># Apply parallel axis theorem to get the inertia tensor about the origin</span>
+            <span class="c1"># I = I_cm + m * (d^2 * I_identity - d ⊗ d)</span>
+            <span class="c1"># where d is the distance vector from the origin to the centroid</span>
+            
+            <span class="c1"># Distance squared from origin to centroid</span>
+            <span class="n">d_squared</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">centroid</span> <span class="o">*</span> <span class="n">centroid</span><span class="p">)</span>
+            
+            <span class="c1"># Dyadic product of centroid vector with itself</span>
+            <span class="n">d_dyadic</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">outer</span><span class="p">(</span><span class="n">centroid</span><span class="p">,</span> <span class="n">centroid</span><span class="p">)</span>
+            
+            <span class="c1"># Parallel axis theorem</span>
+            <span class="n">parallel_axis_correction</span> <span class="o">=</span> <span class="n">tetra_mass</span> <span class="o">*</span> <span class="p">(</span><span class="n">d_squared</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">eye</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">-</span> <span class="n">d_dyadic</span><span class="p">)</span>
+            
+            <span class="c1"># Add to total inertia</span>
+            <span class="n">inertia</span> <span class="o">+=</span> <span class="n">local_inertia</span> <span class="o">+</span> <span class="n">parallel_axis_correction</span>
+            
+        <span class="c1"># Scale inertia tensor to match expected mass if provided</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_mass</span><span class="p">:</span>
+            <span class="n">mass_scale</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">expected_mass</span> <span class="o">/</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume</span> <span class="o">*</span> <span class="n">density_amu</span><span class="p">)</span>
+            <span class="n">inertia</span> <span class="o">*=</span> <span class="n">mass_scale</span>
+            
+        <span class="c1"># Verify that the inertia tensor is positive-definite</span>
+        <span class="n">eigenvalues</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">eigvalsh</span><span class="p">(</span><span class="n">inertia</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">eigenvalues</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">):</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;WARNING: Inertia tensor is not positive-definite! Eigenvalues:&quot;</span><span class="p">,</span> <span class="n">eigenvalues</span><span class="p">)</span>
+            <span class="c1"># Fix by making all eigenvalues positive</span>
+            <span class="n">inertia</span> <span class="o">+=</span> <span class="n">np</span><span class="o">.</span><span class="n">eye</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">eigenvalues</span><span class="p">)))</span> <span class="o">*</span> <span class="mf">1.01</span>
+            
+        <span class="k">return</span> <span class="n">inertia</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_volume</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate volume using the tetrahedral elements from volume mesh&quot;&quot;&quot;</span>
+        <span class="c1"># For tetrahedral mesh, calculate volume by summing volumes of all tetrahedra</span>
+        <span class="n">total_volume</span> <span class="o">=</span> <span class="mi">0</span>
+        
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_elements</span><span class="p">:</span>
+            <span class="c1"># Get vertices of tetrahedron</span>
+            <span class="n">v0</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v3</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span><span class="p">[</span><span class="n">element</span><span class="p">]</span>
+            
+            <span class="c1"># Calculate volume of tetrahedron</span>
+            <span class="c1"># V = (1/6) * |((v1-v0) × (v2-v0)) · (v3-v0)|</span>
+            <span class="n">v01</span> <span class="o">=</span> <span class="n">v1</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v02</span> <span class="o">=</span> <span class="n">v2</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v03</span> <span class="o">=</span> <span class="n">v3</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">volume</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">v01</span><span class="p">,</span> <span class="n">v02</span><span class="p">),</span> <span class="n">v03</span><span class="p">))</span> <span class="o">/</span> <span class="mf">6.0</span>
+            
+            <span class="n">total_volume</span> <span class="o">+=</span> <span class="n">volume</span>
+            
+        <span class="k">return</span> <span class="n">total_volume</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_calculate_center_of_mass_volume</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate center of mass using tetrahedral elements from volume mesh&quot;&quot;&quot;</span>
+        <span class="n">com</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+        <span class="n">total_mass</span> <span class="o">=</span> <span class="mi">0</span>
+        
+        <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_elements</span><span class="p">:</span>
+            <span class="c1"># Get vertices of tetrahedron</span>
+            <span class="n">v0</span><span class="p">,</span> <span class="n">v1</span><span class="p">,</span> <span class="n">v2</span><span class="p">,</span> <span class="n">v3</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span><span class="p">[</span><span class="n">element</span><span class="p">]</span>
+            
+            <span class="c1"># Calculate volume</span>
+            <span class="n">v01</span> <span class="o">=</span> <span class="n">v1</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v02</span> <span class="o">=</span> <span class="n">v2</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">v03</span> <span class="o">=</span> <span class="n">v3</span> <span class="o">-</span> <span class="n">v0</span>
+            <span class="n">volume</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">cross</span><span class="p">(</span><span class="n">v01</span><span class="p">,</span> <span class="n">v02</span><span class="p">),</span> <span class="n">v03</span><span class="p">))</span> <span class="o">/</span> <span class="mf">6.0</span>
+            
+            <span class="c1"># Mass of tetrahedron</span>
+            <span class="n">tetra_mass</span> <span class="o">=</span> <span class="n">volume</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">density</span> <span class="o">*</span> <span class="mf">0.6022</span>  <span class="c1"># Convert to amu</span>
+            
+            <span class="c1"># Centroid of tetrahedron</span>
+            <span class="n">centroid</span> <span class="o">=</span> <span class="p">(</span><span class="n">v0</span> <span class="o">+</span> <span class="n">v1</span> <span class="o">+</span> <span class="n">v2</span> <span class="o">+</span> <span class="n">v3</span><span class="p">)</span> <span class="o">/</span> <span class="mf">4.0</span>
+            
+            <span class="c1"># Add weighted contribution</span>
+            <span class="n">com</span> <span class="o">+=</span> <span class="n">centroid</span> <span class="o">*</span> <span class="n">tetra_mass</span>
+            <span class="n">total_mass</span> <span class="o">+=</span> <span class="n">tetra_mass</span>
+        
+        <span class="k">return</span> <span class="n">com</span> <span class="o">/</span> <span class="n">total_mass</span> <span class="k">if</span> <span class="n">total_mass</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_align_mesh</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Align mesh to center of mass and principal axes with rod along Z-axis&quot;&quot;&quot;</span>
+        <span class="c1"># First center the mesh using volume-based COM calculation</span>
+        <span class="n">com</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_center_of_mass_volume</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span> <span class="o">-=</span> <span class="n">com</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">-=</span> <span class="n">com</span>
+        
+        <span class="c1"># Calculate inertia tensor for initial alignment</span>
+        <span class="n">inertia</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_calculate_correct_inertia_tensor</span><span class="p">()</span>
+        
+        <span class="c1"># Diagonalize to find principal axes</span>
+        <span class="n">eigenvalues</span><span class="p">,</span> <span class="n">eigenvectors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">eigh</span><span class="p">(</span><span class="n">inertia</span><span class="p">)</span>
+        
+        <span class="c1"># Sort by eigenvalues</span>
+        <span class="n">sort_idx</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">eigenvalues</span><span class="p">)</span>
+        <span class="n">eigenvalues</span> <span class="o">=</span> <span class="n">eigenvalues</span><span class="p">[</span><span class="n">sort_idx</span><span class="p">]</span>
+        
+        <span class="c1"># For a rod-like object:</span>
+        <span class="c1"># The smallest moment of inertia is along the rod axis</span>
+        <span class="c1"># We want this to be aligned with the Z-axis (index 2)</span>
+        
+        <span class="c1"># Reordering eigenvectors: </span>
+        <span class="c1"># - smallest moment (rod axis) should be last (Z-axis)</span>
+        <span class="n">z_vec</span> <span class="o">=</span> <span class="n">eigenvectors</span><span class="p">[:,</span> <span class="n">sort_idx</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>  <span class="c1"># Vector with smallest moment -&gt; Z axis</span>
+        <span class="n">x_vec</span> <span class="o">=</span> <span class="n">eigenvectors</span><span class="p">[:,</span> <span class="n">sort_idx</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span>
+        <span class="n">y_vec</span> <span class="o">=</span> <span class="n">eigenvectors</span><span class="p">[:,</span> <span class="n">sort_idx</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>  <span class="c1"># Vector with largest moment -&gt; Y axis</span>
+        
+        <span class="c1"># Create new rotation matrix with correctly ordered eigenvectors</span>
+        <span class="n">rotation_matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">column_stack</span><span class="p">([</span><span class="n">x_vec</span><span class="p">,</span> <span class="n">y_vec</span><span class="p">,</span> <span class="n">z_vec</span><span class="p">])</span>
+        
+        <span class="c1"># Ensure right-handed coordinate system</span>
+        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">det</span><span class="p">(</span><span class="n">rotation_matrix</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">rotation_matrix</span><span class="p">[:,</span> <span class="mi">0</span><span class="p">]</span> <span class="o">*=</span> <span class="o">-</span><span class="mi">1</span>  <span class="c1"># Flip X-axis</span>
+            
+        <span class="c1"># Apply rotation to both meshes</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span> <span class="o">@</span> <span class="n">rotation_matrix</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nodes</span> <span class="o">@</span> <span class="n">rotation_matrix</span>
+        
+        <span class="c1"># Store transformation</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rotation_matrix</span> <span class="o">=</span> <span class="n">rotation_matrix</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">translation</span> <span class="o">=</span> <span class="n">com</span>
+        
+        <span class="c1"># Verify dimensions after alignment</span>
+        <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">volume_nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">dimensions</span> <span class="o">=</span> <span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Aligned mesh to principal axes, COM: </span><span class="si">{</span><span class="n">com</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Dimensions after alignment (X,Y,Z): </span><span class="si">{</span><span class="n">dimensions</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Calculate aspect ratio after alignment</span>
+        <span class="n">length</span> <span class="o">=</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>  <span class="c1"># Z dimension (rod axis)</span>
+        <span class="n">width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>  <span class="c1"># Larger of X,Y (transverse)</span>
+        <span class="n">aspect_ratio</span> <span class="o">=</span> <span class="n">length</span> <span class="o">/</span> <span class="n">width</span> <span class="k">if</span> <span class="n">width</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mf">1.0</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Calculated aspect ratio after alignment: </span><span class="si">{</span><span class="n">aspect_ratio</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+
+<div class="viewcode-block" id="MeshProcessor.calculate_damping">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">calculate_damping</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate hydrodynamic properties using HydroPro&quot;&quot;&quot;</span>
+        <span class="c1"># Create work directory if it doesn&#39;t exist</span>
+        <span class="n">work_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+
+        <span class="n">base_path</span> <span class="o">=</span> <span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;hydrocal&quot;</span>
+        
+        <span class="c1"># Save the mesh in PDB format for HydroPro</span>
+        <span class="n">pdb_path</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">base_path</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;.pdb&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">save_as_pdb</span><span class="p">(</span><span class="n">pdb_path</span><span class="p">)</span>
+        
+        <span class="c1"># Run HydroPro to get hydrodynamic properties</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">runner</span> <span class="o">=</span> <span class="n">HydroProRunner</span><span class="p">(</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+            <span class="n">structure_name</span><span class="o">=</span><span class="s2">&quot;hydrocal&quot;</span><span class="p">,</span><span class="n">cal_type</span><span class="o">=</span><span class="s2">&quot;mesh&quot;</span>
+        <span class="p">)</span>
+        
+        <span class="n">results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">runner</span><span class="o">.</span><span class="n">run_calculation</span><span class="p">(</span><span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="s1">&#39;translation_damping&#39;</span><span class="p">]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="s1">&#39;rotation_damping&#39;</span><span class="p">]</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Translational damping: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Rotational damping: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="k">return</span> <span class="n">pdb_path</span></div>
+
+
+<div class="viewcode-block" id="MeshProcessor.generate_potential_grid">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">generate_potential_grid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">spacing</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">buffer</span><span class="o">=</span><span class="mf">20.0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">cutoff</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span> <span class="n">max_potential</span><span class="o">=</span><span class="mf">1000.0</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate potential grid for ARBD&quot;&quot;&quot;</span>
+        <span class="c1"># Calculate grid bounds with buffer</span>
+        <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">-</span> <span class="n">buffer</span>
+        <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="n">buffer</span>
+        
+        <span class="c1"># Create grid points</span>
+        <span class="n">npts</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span><span class="p">)</span> <span class="o">/</span> <span class="n">spacing</span><span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
+        <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">bounds_min</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">bounds_max</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">npts</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+        <span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">bounds_min</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">bounds_max</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">npts</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
+        <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">bounds_min</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">bounds_max</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">npts</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
+        <span class="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">,</span> <span class="n">Z</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">,</span> <span class="n">indexing</span><span class="o">=</span><span class="s1">&#39;ij&#39;</span><span class="p">)</span>
+        
+        <span class="c1"># Create KD-tree for fast distance calculations</span>
+        <span class="n">tree</span> <span class="o">=</span> <span class="n">KDTree</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">)</span>
+        
+        <span class="c1"># Calculate distances to nearest surface points</span>
+        <span class="n">grid_points</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vstack</span><span class="p">([</span><span class="n">X</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">Y</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">Z</span><span class="o">.</span><span class="n">ravel</span><span class="p">()])</span><span class="o">.</span><span class="n">T</span>
+        <span class="n">distances</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">grid_points</span><span class="p">)</span>
+        <span class="n">distances</span> <span class="o">=</span> <span class="n">distances</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">X</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
+        
+        <span class="c1"># Generate potential</span>
+        <span class="n">potential</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">distances</span><span class="p">)</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">distances</span> <span class="o">&lt;=</span> <span class="n">cutoff</span>
+        <span class="n">potential</span><span class="p">[</span><span class="n">mask</span><span class="p">]</span> <span class="o">=</span> <span class="n">max_potential</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="mi">1</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">k</span> <span class="o">*</span> <span class="n">distances</span><span class="p">[</span><span class="n">mask</span><span class="p">])))</span>
+        
+        <span class="k">return</span> <span class="n">potential</span><span class="p">,</span> <span class="n">bounds_min</span><span class="p">,</span> <span class="n">spacing</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span></div>
+
+        
+<div class="viewcode-block" id="MeshProcessor.write_no_enter_potential">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_no_enter_potential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate and write potential field to DX file so particles do not fall inside rigidbody.&quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">output_file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">output_file</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="o">/</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">-no-enter.dx&quot;</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">output_file</span><span class="p">):</span>
+                <span class="n">output_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="n">output_file</span>
+
+        <span class="n">potential</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="n">delta</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_potential_grid</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+        <span class="n">writeDx</span><span class="p">(</span><span class="n">output_file</span><span class="p">,</span> <span class="n">potential</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">output_file</span></div>
+
+
+<div class="viewcode-block" id="MeshProcessor.save_aligned_mesh">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">save_aligned_mesh</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="p">):</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">output_file</span><span class="p">):</span>
+            <span class="n">output_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="n">output_file</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Save the aligned mesh to a new .msh file&quot;&quot;&quot;</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">initialize</span><span class="p">()</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">&quot;aligned_mesh&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># For surface mesh</span>
+        <span class="n">entity_dim</span> <span class="o">=</span> <span class="mi">2</span>
+        <span class="n">element_type</span> <span class="o">=</span> <span class="mi">2</span>  <span class="c1"># Triangle in gmsh</span>
+            
+        <span class="c1"># Add a discrete entity</span>
+        <span class="n">entity_tag</span> <span class="o">=</span> <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">addDiscreteEntity</span><span class="p">(</span><span class="n">entity_dim</span><span class="p">)</span>
+        
+        <span class="c1"># Add nodes</span>
+        <span class="n">node_tags</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">node_coords</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">):</span>
+            <span class="n">tag</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+            <span class="n">node_tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+            <span class="n">node_coords</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">node</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit_scale</span><span class="p">)</span>  <span class="c1"># Convert back to mesh units</span>
+            
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">addNodes</span><span class="p">(</span><span class="n">entity_dim</span><span class="p">,</span> <span class="n">entity_tag</span><span class="p">,</span> <span class="n">node_tags</span><span class="p">,</span> <span class="n">node_coords</span><span class="p">)</span>
+        
+        <span class="c1"># Add elements</span>
+        <span class="n">element_tags</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">element_nodes</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">element</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">):</span>
+            <span class="n">tag</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+            <span class="n">element_tags</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span>
+            <span class="n">element_nodes</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">element</span><span class="p">])</span>  <span class="c1"># Convert to 1-based indexing</span>
+            
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">mesh</span><span class="o">.</span><span class="n">addElements</span><span class="p">(</span><span class="n">entity_dim</span><span class="p">,</span> <span class="n">entity_tag</span><span class="p">,</span> <span class="p">[</span><span class="n">element_type</span><span class="p">],</span> <span class="p">[</span><span class="n">element_tags</span><span class="p">],</span> <span class="p">[</span><span class="n">element_nodes</span><span class="p">])</span>
+        
+        <span class="c1"># Write mesh</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">output_file</span><span class="p">))</span>
+        <span class="n">gmsh</span><span class="o">.</span><span class="n">finalize</span><span class="p">()</span></div>
+
+            
+<div class="viewcode-block" id="MeshProcessor.save_as_pdb">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">save_as_pdb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_file</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Save the aligned mesh as a PDB file (coordinates in Ã…)&quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">output_file</span><span class="p">):</span>
+            <span class="n">output_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="n">output_file</span>
+        <span class="c1"># PDB format specifications</span>
+        <span class="n">HEADER</span> <span class="o">=</span> <span class="s2">&quot;HEADER    ALIGNED MESH                           &quot;</span>
+        <span class="n">ATOM_FORMAT</span> <span class="o">=</span> <span class="s2">&quot;ATOM  </span><span class="si">{:5d}</span><span class="s2"> </span><span class="si">{:4s}</span><span class="s2"> </span><span class="si">{:3s}</span><span class="s2"> </span><span class="si">{:1s}{:4d}</span><span class="s2">    </span><span class="si">{:8.3f}{:8.3f}{:8.3f}{:6.2f}{:6.2f}</span><span class="s2">&quot;</span>
+        
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">output_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="c1"># Write header</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
+            <span class="n">date_str</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%d</span><span class="s2">-%b-%y&quot;</span><span class="p">)</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">HEADER</span><span class="si">}{</span><span class="n">date_str</span><span class="si">}</span><span class="s2">   XXXX</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Calculate box dimensions for CRYST record</span>
+            <span class="n">bounds_min</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+            <span class="n">bounds_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+            <span class="n">box_dimensions</span> <span class="o">=</span> <span class="n">bounds_max</span> <span class="o">-</span> <span class="n">bounds_min</span>
+            
+            <span class="c1"># Write crystallographic information</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;CRYST1</span><span class="si">{</span><span class="n">box_dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">:</span><span class="s2">9.3f</span><span class="si">}{</span><span class="n">box_dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">:</span><span class="s2">9.3f</span><span class="si">}{</span><span class="n">box_dimensions</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="si">:</span><span class="s2">9.3f</span><span class="si">}</span><span class="s2">  90.00  90.00  90.00 P 1           1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Write atoms (nodes from the mesh)</span>
+            <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">node</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nodes</span><span class="p">):</span>
+                <span class="c1"># PDB uses 1-indexed atom numbers</span>
+                <span class="n">atom_num</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+                <span class="c1"># Use CA (alpha carbon) atom type for visibility in viewers</span>
+                <span class="n">atom_name</span> <span class="o">=</span> <span class="s2">&quot; CA &quot;</span>
+                <span class="c1"># Use residue name MES for mesh</span>
+                <span class="n">res_name</span> <span class="o">=</span> <span class="s2">&quot;MES&quot;</span>
+                <span class="c1"># Use chain ID A</span>
+                <span class="n">chain_id</span> <span class="o">=</span> <span class="s2">&quot;A&quot;</span>
+                <span class="c1"># Residue number = atom number for simplicity</span>
+                <span class="n">res_num</span> <span class="o">=</span> <span class="n">atom_num</span> <span class="o">%</span> <span class="mi">10000</span>  <span class="c1"># PDB format limits res numbers to 9999</span>
+                <span class="c1"># X, Y, Z coordinates in Ångströms (already in the correct units)</span>
+                <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span> <span class="o">=</span> <span class="n">node</span>
+                <span class="c1"># Use 1.0 for occupancy and 0.0 for temperature factor</span>
+                <span class="n">occupancy</span> <span class="o">=</span> <span class="mf">1.0</span>
+                <span class="n">temp_factor</span> <span class="o">=</span> <span class="mf">0.0</span>
+                
+                <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ATOM_FORMAT</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">atom_num</span><span class="p">,</span><span class="w"> </span><span class="n">atom_name</span><span class="p">,</span><span class="w"> </span><span class="n">res_name</span><span class="p">,</span><span class="w"> </span><span class="n">chain_id</span><span class="p">,</span><span class="w"> </span><span class="n">res_num</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="p">,</span><span class="w"> </span><span class="n">occupancy</span><span class="p">,</span><span class="w"> </span><span class="n">temp_factor</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Write connectivity (the mesh elements) as CONECT records</span>
+            <span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">elements</span><span class="p">:</span>
+                <span class="c1"># PDB CONECT records use 1-indexed atom numbers</span>
+                <span class="n">atom_indices</span> <span class="o">=</span> <span class="p">[</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">element</span><span class="p">]</span>
+                
+                <span class="c1"># Create a CONECT record for each edge of the triangle</span>
+                <span class="n">edges</span> <span class="o">=</span> <span class="p">[(</span><span class="n">atom_indices</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">atom_indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> 
+                         <span class="p">(</span><span class="n">atom_indices</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">atom_indices</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> 
+                         <span class="p">(</span><span class="n">atom_indices</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">atom_indices</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
+                
+                <span class="k">for</span> <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">edges</span><span class="p">:</span>
+                    <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;CONECT</span><span class="si">{</span><span class="n">a1</span><span class="si">:</span><span class="s2">5d</span><span class="si">}{</span><span class="n">a2</span><span class="si">:</span><span class="s2">5d</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Write end of file</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;END</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved aligned mesh as PDB: </span><span class="si">{</span><span class="n">output_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_save_aligned_mesh_both_formats</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base_filename</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Save the aligned mesh in both MSH and PDB formats&quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isabs</span><span class="p">(</span><span class="n">base_filename</span><span class="p">):</span>
+            <span class="n">base_filename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="n">base_filename</span>
+        <span class="c1"># Save as MSH (in microns)</span>
+        <span class="n">msh_filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_filename</span><span class="si">}</span><span class="s2">.msh&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">save_aligned_mesh</span><span class="p">(</span><span class="n">msh_filename</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved aligned mesh as MSH: </span><span class="si">{</span><span class="n">msh_filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Save as PDB (in Ångströms)</span>
+        <span class="n">pdb_filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_filename</span><span class="si">}</span><span class="s2">.pdb&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">save_as_pdb</span><span class="p">(</span><span class="n">pdb_filename</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved aligned mesh as PDB: </span><span class="si">{</span><span class="n">pdb_filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+
+<div class="viewcode-block" id="process_mesh_file">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.process_mesh_file">[docs]</a>
+<span class="k">def</span><span class="w"> </span><span class="nf">process_mesh_file</span><span class="p">(</span><span class="n">mesh_file</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mf">19.3</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Process mesh file and calculate all properties</span>
+<span class="sd">    </span>
+<span class="sd">    Args:</span>
+<span class="sd">        mesh_file: Path to .msh file</span>
+<span class="sd">        density: Material density in g/cm³</span>
+<span class="sd">        temperature: Temperature in Kelvin</span>
+<span class="sd">        viscosity: Solvent viscosity in poise</span>
+<span class="sd">        solvent_density: Solvent density in g/cm³</span>
+<span class="sd">        output_dx: Optional path to output potential DX file</span>
+<span class="sd">        output_mesh: Optional path to save aligned mesh</span>
+<span class="sd">        binary_path: Path to HydroPro executable</span>
+<span class="sd">        expected_mass: Optional expected mass in amu to calibrate calculations</span>
+<span class="sd">        expected_aspect_ratio: Optional expected aspect ratio to calibrate inertia</span>
+<span class="sd">        **kwargs: Additional arguments for potential generation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">processor</span> <span class="o">=</span> <span class="n">MeshProcessor</span><span class="p">(</span>
+        <span class="n">mesh_file</span><span class="p">,</span>
+        <span class="n">density</span><span class="o">=</span><span class="n">density</span><span class="p">,)</span>
+    
+    <span class="c1"># Calculate hydrodynamic properties</span>
+    <span class="n">processor</span><span class="o">.</span><span class="n">calculate_damping</span><span class="p">()</span>
+    
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Translational damping coefficients [1/ns]:&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">processor</span><span class="o">.</span><span class="n">transdamp</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Rotational damping coefficients [1/ns]:&quot;</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">processor</span><span class="o">.</span><span class="n">rotdamp</span><span class="p">)</span>
+        
+    <span class="k">return</span> <span class="n">processor</span></div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/mesh_rigidbody.html b/_build/html/_modules/arbdmodel/mesh_rigidbody.html
new file mode 100644
index 0000000000000000000000000000000000000000..3b3cb20f8aacbb54aad5e8de8e2b4f00684a02d3
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/mesh_rigidbody.html
@@ -0,0 +1,447 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.mesh_rigidbody &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/mesh_rigidbody';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.mesh_rigidbody</h1><div class="highlight"><pre>
+<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+
+<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.core_objects</span><span class="w"> </span><span class="kn">import</span> <span class="n">RigidBodyType</span>
+
+
+<span class="sd">&quot;&quot;&quot;Rigid body shape modeling module for arbdmodel package.</span>
+<span class="sd">This module provides classes for simple rigid body shape mesh objects into ARBD model.</span>
+<span class="sd">Input: .msh file, or other gmsh supported file</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="MeshRigidBodyType">
+<a class="viewcode-back" href="../../api/rigidbody_models/mesh_rigidbody.html#arbdmodel.mesh_rigidbody.MeshRigidBodyType">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">MeshRigidBodyType</span><span class="p">(</span><span class="n">RigidBodyType</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;RigidBodyType subclass for shape rigid body objects&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">mesh_file</span><span class="p">,</span> <span class="n">density</span><span class="o">=</span><span class="mf">19.3</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unit_scale</span><span class="o">=</span><span class="mf">1e4</span><span class="p">,</span> 
+                 <span class="n">use_surface</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize shape type.</span>
+<span class="sd">        Args:</span>
+<span class="sd">            name: Name identifier for this type</span>
+<span class="sd">            mesh_file: Path to structure file (.psf/.pdb)</span>
+<span class="sd">            density: Material density in g/cm^3</span>
+<span class="sd">            simconf: SimConf object containing configuration parameters</span>
+<span class="sd">            unit_scale: Conversion factor from input units to angstroms</span>
+<span class="sd">            use_surface: Whether to use surface mesh instead of volume mesh</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="n">name</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not create directory </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">mesh_file</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">DefaultSimConf</span>
+            <span class="n">simconf</span> <span class="o">=</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+
+        <span class="k">if</span> <span class="n">use_surface</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;The moment of inertia using surface mesh is still inaccurate. consider use volume mesh&#39;</span><span class="p">)</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.mesh_process_surface</span><span class="w"> </span><span class="kn">import</span> <span class="n">SurfaceMeshProcessor</span>
+            <span class="n">rbprocess</span> <span class="o">=</span> <span class="n">SurfaceMeshProcessor</span><span class="p">(</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="p">,</span> 
+                <span class="n">density</span><span class="o">=</span><span class="n">density</span><span class="p">,</span> 
+                <span class="n">simconf</span><span class="o">=</span><span class="n">simconf</span><span class="p">,</span>
+                <span class="n">unit_scale</span><span class="o">=</span><span class="n">unit_scale</span><span class="p">,</span>
+                <span class="n">work_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.mesh_process_volume</span><span class="w"> </span><span class="kn">import</span> <span class="n">MeshProcessor</span>
+            <span class="n">rbprocess</span> <span class="o">=</span> <span class="n">MeshProcessor</span><span class="p">(</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">mesh_file</span><span class="p">,</span>
+                <span class="n">density</span><span class="o">=</span><span class="n">density</span><span class="p">,</span> 
+                <span class="n">simconf</span><span class="o">=</span><span class="n">simconf</span><span class="p">,</span> 
+                <span class="n">unit_scale</span><span class="o">=</span><span class="n">unit_scale</span><span class="p">,</span>
+                <span class="n">work_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span><span class="p">)</span>
+                
+        <span class="n">rbprocess</span><span class="o">.</span><span class="n">calculate_damping</span><span class="p">()</span>
+        <span class="n">potential_dx</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">_potential.dx&quot;</span><span class="p">)</span>
+        <span class="n">potential_grid</span> <span class="o">=</span> <span class="n">rbprocess</span><span class="o">.</span><span class="n">write_no_enter_potential</span><span class="p">(</span><span class="n">output_file</span><span class="o">=</span><span class="n">potential_dx</span><span class="p">)</span>
+        <span class="n">potential_grids</span> <span class="o">=</span> <span class="p">[(</span><span class="n">potential_grid</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)]</span>
+        <span class="n">attached_particles</span><span class="o">=</span> <span class="n">rbprocess</span><span class="o">.</span><span class="n">get_attached_particles</span><span class="p">()</span>
+
+        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
+            <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
+            <span class="n">mass</span><span class="o">=</span><span class="n">rbprocess</span><span class="o">.</span><span class="n">mass</span><span class="p">,</span>
+            <span class="n">moment_of_inertia</span><span class="o">=</span><span class="n">rbprocess</span><span class="o">.</span><span class="n">principal_moments</span><span class="p">,</span>
+            <span class="n">damping_coefficient</span><span class="o">=</span><span class="n">rbprocess</span><span class="o">.</span><span class="n">transdamp</span><span class="p">,</span>
+            <span class="n">rotational_damping_coefficient</span><span class="o">=</span><span class="n">rbprocess</span><span class="o">.</span><span class="n">rotdamp</span><span class="p">,</span>
+            <span class="n">potential_grids</span><span class="o">=</span><span class="n">potential_grids</span><span class="p">,</span> 
+            <span class="n">attached_particles</span><span class="o">=</span><span class="n">attached_particles</span><span class="p">,</span>
+            <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/model.html b/_build/html/_modules/arbdmodel/model.html
new file mode 100644
index 0000000000000000000000000000000000000000..6e89ccb5434c29f023dbe42d7522dc9e3947926e
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/model.html
@@ -0,0 +1,1095 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.model &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/model';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.model</h1><div class="highlight"><pre>
+<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">copy</span><span class="w"> </span><span class="kn">import</span> <span class="n">copy</span><span class="p">,</span> <span class="n">deepcopy</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">glob</span><span class="w"> </span><span class="kn">import</span> <span class="n">glob</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">MDAnalysis</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">mda</span>
+
+<span class="kn">from</span><span class="w"> </span><span class="nn">tqdm</span><span class="w"> </span><span class="kn">import</span> <span class="n">tqdm</span><span class="p">,</span> <span class="n">trange</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">tqdm.contrib.logging</span><span class="w"> </span><span class="kn">import</span> <span class="n">logging_redirect_tqdm</span>
+
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">devlogger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="n">get_resource_path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.interactions</span><span class="w"> </span><span class="kn">import</span> <span class="n">NullPotential</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">Transformable</span><span class="p">,</span> <span class="n">Parent</span><span class="p">,</span> <span class="n">Group</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.sim_config</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimConf</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.core_objects</span><span class="w"> </span><span class="kn">import</span> <span class="n">GroupSite</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.engine</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArbdEngine</span><span class="p">,</span> <span class="n">NamdEngine</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.coords</span><span class="w"> </span><span class="kn">import</span> <span class="n">calculate_dimensions_from_cell_vectors</span>
+
+
+<div class="viewcode-block" id="PdbModel">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.PdbModel">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">PdbModel</span><span class="p">(</span><span class="n">Transformable</span><span class="p">,</span> <span class="n">Parent</span><span class="p">):</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">children</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dimensions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">remove_duplicate_bonded_terms</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="n">Transformable</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
+        <span class="n">Parent</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">children</span><span class="p">,</span> <span class="n">remove_duplicate_bonded_terms</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span> <span class="o">=</span> <span class="n">dimensions</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">rigid</span><span class="p">]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_bodies</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">rigid</span><span class="p">]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cacheInvalid</span> <span class="o">=</span> <span class="kc">True</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_updateParticleOrder</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">pass</span>
+
+<div class="viewcode-block" id="PdbModel.write_pdb">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.PdbModel.write_pdb">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_pdb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">beta_from_fixed</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cacheInvalid</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_updateParticleOrder</span><span class="p">()</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="c1">## Write header</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;CRYST1</span><span class="si">{:&gt;9.3f}{:&gt;9.3f}{:&gt;9.3f}</span><span class="s2">  90.00  90.00  90.00 P 1           1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span> <span class="p">))</span>
+
+            <span class="c1">## Write coordinates</span>
+            <span class="n">formatString</span> <span class="o">=</span> <span class="s2">&quot;ATOM </span><span class="si">{idx:&gt;6.6s}</span><span class="s2"> </span><span class="si">{name:^4.4s}</span><span class="s2"> </span><span class="si">{resname:3.3s}</span><span class="s2"> </span><span class="si">{chain:1.1s}{resid:&gt;5.5s}</span><span class="s2">   </span><span class="si">{x:8.8s}{y:8.8s}{z:8.8s}{occupancy:6.2f}{beta:6.2f}</span><span class="s2">  </span><span class="si">{charge:2d}{segname:&gt;6s}</span><span class="se">\n</span><span class="s2">&quot;</span>
+            <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+                <span class="c1">## http://www.wwpdb.org/documentation/file-format-content/format33/sect9.html#ATOM</span>
+                <span class="n">data</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">_get_psfpdb_dictionary</span><span class="p">()</span>
+                <span class="n">idx</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s1">&#39;idx&#39;</span><span class="p">]</span>
+
+                <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">5</span><span class="p">:</span>
+                    <span class="n">idx</span> <span class="o">=</span> <span class="s2">&quot; *****&quot;</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">idx</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{:&gt;6d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;idx&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">idx</span>
+
+                <span class="k">if</span> <span class="n">beta_from_fixed</span><span class="p">:</span>
+                    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;beta&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="s1">&#39;fixed&#39;</span> <span class="ow">in</span> <span class="n">p</span><span class="o">.</span><span class="vm">__dict__</span> <span class="k">else</span> <span class="mi">0</span>
+
+                <span class="n">pos</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()</span>
+                <span class="n">dig</span> <span class="o">=</span> <span class="p">[</span><span class="nb">max</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">+</span><span class="mf">1e-6</span><span class="p">)</span><span class="o">//</span><span class="mi">1</span><span class="p">),</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">pos</span><span class="p">]</span>
+                <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dig</span><span class="p">:</span> <span class="k">assert</span><span class="p">(</span> <span class="n">d</span> <span class="o">&lt;=</span> <span class="mi">7</span> <span class="p">)</span>
+                <span class="c1"># assert( np.all(dig &lt;= 7) )</span>
+                <span class="n">fs</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;{: </span><span class="si">%d</span><span class="s2">.</span><span class="si">%d</span><span class="s2">f}&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">7</span><span class="o">-</span><span class="n">d</span><span class="p">)</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dig</span><span class="p">]</span>
+                <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span><span class="p">,</span><span class="n">x</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">fs</span><span class="p">,</span><span class="n">pos</span><span class="p">)]</span> 
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;x&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;y&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">y</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;z&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span>
+                <span class="k">assert</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mf">1e5</span><span class="p">)</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;charge&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;charge&#39;</span><span class="p">])</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{:&lt;4d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">])</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="n">formatString</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span> <span class="p">)</span>
+
+        <span class="k">return</span></div>
+
+
+<div class="viewcode-block" id="PdbModel.write_pqr">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.PdbModel.write_pqr">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_pqr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cacheInvalid</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_updateParticleOrder</span><span class="p">()</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="c1">## Write header</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;CRYST1</span><span class="si">{:&gt;9.3f}{:&gt;9.3f}{:&gt;9.3f}</span><span class="s2">  90.00  90.00  90.00 P 1           1</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span> <span class="p">))</span>
+
+            <span class="c1">## Write coordinates</span>
+            <span class="n">formatString</span> <span class="o">=</span> <span class="s2">&quot;ATOM </span><span class="si">{idx:&gt;6.6s}</span><span class="s2"> </span><span class="si">{name:^4.4s}</span><span class="s2"> </span><span class="si">{resname:3.3s}</span><span class="s2"> </span><span class="si">{chain:1.1s}</span><span class="s2"> </span><span class="si">{resid:&gt;5.5s}</span><span class="s2">   </span><span class="si">{x:.6f}</span><span class="s2"> </span><span class="si">{y:.6f}</span><span class="s2"> </span><span class="si">{z:.6f}</span><span class="s2"> </span><span class="si">{charge}</span><span class="s2"> </span><span class="si">{radius}</span><span class="se">\n</span><span class="s2">&quot;</span>
+            <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+                <span class="n">data</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">_get_psfpdb_dictionary</span><span class="p">()</span>
+
+                <span class="n">idx</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="s1">&#39;idx&#39;</span><span class="p">]</span>
+                <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">log10</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">5</span><span class="p">:</span>
+                    <span class="n">idx</span> <span class="o">=</span> <span class="s2">&quot; *****&quot;</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">idx</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{:&gt;6d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;idx&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">idx</span>
+
+                <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">get_collapsed_position</span><span class="p">()</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;x&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;y&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">y</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;z&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span>
+                <span class="k">assert</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mf">1e5</span><span class="p">)</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{:&lt;4d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">])</span>
+                <span class="k">if</span> <span class="s1">&#39;radius&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
+                    <span class="n">data</span><span class="p">[</span><span class="s1">&#39;radius&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;mass&#39;</span><span class="p">]</span><span class="o">/</span><span class="mi">16</span><span class="p">)</span><span class="o">**</span><span class="mf">0.333333</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="n">formatString</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span> <span class="p">)</span>
+        <span class="k">return</span></div>
+
+        
+<div class="viewcode-block" id="PdbModel.write_psf">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.PdbModel.write_psf">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_psf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">cacheUpToDate</span> <span class="o">==</span> <span class="kc">False</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_updateParticleOrder</span><span class="p">()</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="c1">## Write header</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;PSF NAMD</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span> <span class="c1"># create NAMD formatted psf</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{:&gt;8d}</span><span class="s2"> !NTITLE</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
+            
+            <span class="c1">## ATOMS section</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{:&gt;8d}</span><span class="s2"> !NATOM</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">)))</span>
+
+            <span class="c1">## From vmd/plugins/molfile_plugin/src/psfplugin.c</span>
+            <span class="c1">## &quot;%d %7s %10s %7s %7s %7s %f %f&quot;</span>
+            <span class="n">formatString</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{idx:&gt;8d}</span><span class="s2"> </span><span class="si">{segname:7.7s}</span><span class="s2"> </span><span class="si">{resid:&lt;10.10s}</span><span class="s2"> </span><span class="si">{resname:7.7s}</span><span class="s2">&quot;</span> <span class="o">+</span> \
+                           <span class="s2">&quot; </span><span class="si">{name:7.7s}</span><span class="s2"> </span><span class="si">{type:7.7s}</span><span class="s2"> </span><span class="si">{charge:f}</span><span class="s2"> </span><span class="si">{mass:f}</span><span class="se">\n</span><span class="s2">&quot;</span>
+            <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+                <span class="n">data</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">_get_psfpdb_dictionary</span><span class="p">()</span>
+                <span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%d%c%c</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;resid&#39;</span><span class="p">],</span><span class="s2">&quot; &quot;</span><span class="p">,</span><span class="s2">&quot; &quot;</span><span class="p">)</span> <span class="c1"># TODO: work with large indices</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="n">formatString</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">data</span><span class="p">)</span> <span class="p">)</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+            <span class="c1">## Write out bonds</span>
+            <span class="n">bonds</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">()</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{:&gt;8d}</span><span class="s2"> !NBOND</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bonds</span><span class="p">)))</span>
+            <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+            <span class="k">for</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">ex</span> <span class="ow">in</span> <span class="n">bonds</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s2">&quot;</span><span class="si">{:&gt;8d}{:&gt;8d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p2</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
+                <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
+                <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                    <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+            <span class="c1">## Write out angles</span>
+            <span class="n">angles</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_angles</span><span class="p">()</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{:&gt;8d}</span><span class="s2"> !NTHETA</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">angles</span><span class="p">)))</span>
+            <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+            <span class="k">for</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">p3</span><span class="p">,</span><span class="n">a</span> <span class="ow">in</span> <span class="n">angles</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s2">&quot;</span><span class="si">{:&gt;8d}{:&gt;8d}{:&gt;8d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p2</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p3</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
+                <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
+                <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                    <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+            <span class="c1">## Write out dihedrals</span>
+            <span class="n">dihedrals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_dihedrals</span><span class="p">()</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{:&gt;8d}</span><span class="s2"> !NPHI</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">dihedrals</span><span class="p">)))</span>
+            <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+            <span class="k">for</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">p3</span><span class="p">,</span><span class="n">p4</span><span class="p">,</span><span class="n">a</span> <span class="ow">in</span> <span class="n">dihedrals</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s2">&quot;</span><span class="si">{:&gt;8d}{:&gt;8d}{:&gt;8d}{:&gt;8d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p2</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p3</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p4</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
+                <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
+                <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                    <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span> 
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+            <span class="c1">## Write out impropers</span>
+            <span class="n">impropers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_impropers</span><span class="p">()</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{:&gt;8d}</span><span class="s2"> !NIMPHI</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">impropers</span><span class="p">)))</span>
+            <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+            <span class="k">for</span> <span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">,</span><span class="n">p3</span><span class="p">,</span><span class="n">p4</span><span class="p">,</span><span class="n">a</span> <span class="ow">in</span> <span class="n">impropers</span><span class="p">:</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span> <span class="s2">&quot;</span><span class="si">{:&gt;8d}{:&gt;8d}{:&gt;8d}{:&gt;8d}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p2</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p3</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">p4</span><span class="o">.</span><span class="n">idx</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
+                <span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
+                <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                    <span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">counter</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
+
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{:&gt;8d}</span><span class="s2"> !NDON: donors</span><span class="se">\n\n\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="si">{:&gt;8d}</span><span class="s2"> !NACC: acceptors</span><span class="se">\n\n\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">       0 !NNB</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            <span class="n">natoms</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">)</span>
+            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">natoms</span><span class="o">//</span><span class="mi">8</span><span class="p">):</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;      0       0       0       0       0       0       0       0</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">natoms</span><span class="o">-</span><span class="mi">8</span><span class="o">*</span><span class="p">(</span><span class="n">natoms</span><span class="o">//</span><span class="mi">8</span><span class="p">)):</span>
+                <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;      0&quot;</span><span class="p">)</span>
+            <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">       1       0 !NGRP</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="p">)</span></div>
+</div>
+
+
+
+<div class="viewcode-block" id="ArbdModel">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">ArbdModel</span><span class="p">(</span><span class="n">PdbModel</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Advanced model class for ARBD simulations with improved cell vector handling.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">children</span><span class="p">,</span> <span class="n">cell_vectors</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">cell_origin</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dimensions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">remove_duplicate_bonded_terms</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">buffer_factor</span><span class="o">=</span><span class="mf">1.2</span><span class="p">,</span>
+                 <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dummy_types</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(),</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Initialize ArbdModel with improved cell vector and dimension handling.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            children: Child objects for the model</span>
+<span class="sd">            cell_vectors: List of 3 cell basis vectors [[x1,y1,z1], [x2,y2,z2], [x3,y3,z3]]</span>
+<span class="sd">            cell_origin: Cell origin coordinates [x,y,z]</span>
+<span class="sd">            dimensions: Explicit dimensions for the simulation box (overrides cell_vectors)</span>
+<span class="sd">            remove_duplicate_bonded_terms: Whether to remove duplicate bonded terms</span>
+<span class="sd">            buffer_factor: Factor to scale dimensions derived from cell vectors</span>
+<span class="sd">            configuration: SimConf object with configuration parameters</span>
+<span class="sd">            dummy_types: Deprecated parameter, kept for backward compatibility</span>
+<span class="sd">            **conf_params: Additional configuration parameters</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Calculate dimensions from cell vectors if provided and dimensions not explicitly set</span>
+        <span class="k">if</span> <span class="n">dimensions</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">cell_vectors</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">dimensions</span> <span class="o">=</span> <span class="n">calculate_dimensions_from_cell_vectors</span><span class="p">(</span>
+                <span class="n">cell_vectors</span><span class="p">,</span> <span class="n">cell_origin</span><span class="p">,</span> <span class="n">buffer_factor</span><span class="p">)</span>
+        
+        <span class="c1"># Default dimensions if neither dimensions nor cell vectors provided</span>
+        <span class="k">if</span> <span class="n">dimensions</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">dimensions</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
+            
+        <span class="c1"># Set default cell vectors if not provided</span>
+        <span class="k">if</span> <span class="n">cell_vectors</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">cell_vectors</span> <span class="o">=</span> <span class="p">[</span>
+                <span class="p">[</span><span class="n">dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
+                <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">0</span><span class="p">],</span>
+                <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dimensions</span><span class="p">[</span><span class="mi">2</span><span class="p">]]</span>
+            <span class="p">]</span>
+            
+        <span class="c1"># Set default cell origin if not provided</span>
+        <span class="k">if</span> <span class="n">cell_origin</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">cell_origin</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
+            
+        <span class="c1"># Initialize parent class</span>
+        <span class="n">PdbModel</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">children</span><span class="p">,</span> <span class="n">dimensions</span><span class="p">,</span> <span class="n">remove_duplicate_bonded_terms</span><span class="p">,</span>
+                         <span class="n">cell_vectors</span><span class="p">,</span> <span class="n">cell_origin</span><span class="p">)</span>
+        
+        
+        <span class="c1"># Store origin which might be different from cell_origin</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">origin</span> <span class="o">=</span> <span class="n">cell_origin</span>
+
+        <span class="c1"># Set up configuration</span>
+        <span class="k">if</span> <span class="n">configuration</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> 
+            <span class="n">configuration</span> <span class="o">=</span> <span class="n">SimConf</span><span class="p">(</span><span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">configuration</span> <span class="o">=</span> <span class="n">configuration</span>
+
+        <span class="c1"># Initialize model properties</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_particles</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="p">[]</span>  
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span> <span class="o">=</span> <span class="kc">None</span> 
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">dummy_types</span> <span class="o">=</span> <span class="n">dummy_types</span>  <span class="c1"># TODO, determine whether these are really needed</span>
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dummy_types</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">raise</span><span class="p">(</span><span class="s2">&quot;Dummy types have been deprecated&quot;</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_interactions</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_nonbonded_interaction_files</span> <span class="o">=</span> <span class="p">[]</span>  <span class="c1"># This could be made more robust</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">cacheUpToDate</span> <span class="o">=</span> <span class="kc">False</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span> <span class="o">=</span> <span class="p">[]</span>
+
+<div class="viewcode-block" id="ArbdModel.add">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.add">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_clear_types</span><span class="p">()</span>     <span class="c1"># TODO: call upon (potentially nested) `child.add(add)`</span>
+        <span class="k">return</span> <span class="n">Parent</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.add_group_site">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.add_group_site">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_group_site</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">particles</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="n">g</span> <span class="o">=</span> <span class="n">GroupSite</span><span class="p">(</span><span class="n">particles</span><span class="p">,</span> <span class="n">weights</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">g</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_clear_types</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s1">: Clearing types&#39;</span><span class="p">)</span> 
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span> <span class="o">=</span> <span class="kc">None</span>
+        
+    
+<div class="viewcode-block" id="ArbdModel.clear_all">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.clear_all">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">clear_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keep_children</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="n">Parent</span><span class="o">.</span><span class="n">clear_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keep_children</span><span class="o">=</span><span class="n">keep_children</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_particles</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_clear_types</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_nonbonded_interaction_files</span> <span class="o">=</span> <span class="p">[]</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.extend">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.extend">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_model</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+
+        <span class="k">if</span> <span class="nb">any</span><span class="p">(</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">rigid</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">]</span> <span class="o">+</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">rigid</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">other_model</span><span class="p">]</span> <span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">&#39;Models containing rigid bodies cannot yet be extended&#39;</span><span class="p">)</span>
+        
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other_model</span><span class="p">,</span> <span class="n">ArbdModel</span><span class="p">)</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="n">copy</span> <span class="o">==</span> <span class="kc">True</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Forcing </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s1">.extend(other_model,copy=False)&#39;</span><span class="p">)</span>
+            <span class="n">copy</span> <span class="o">=</span> <span class="kc">False</span>
+
+        <span class="c1">## Combine particle types, taking care to handle name clashes</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_countParticleTypes</span><span class="p">()</span>
+        <span class="n">other_model</span><span class="o">.</span><span class="n">_countParticleTypes</span><span class="p">()</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">getParticleTypesAndCounts</span><span class="p">()</span>
+        <span class="n">other_model</span><span class="o">.</span><span class="n">getParticleTypesAndCounts</span><span class="p">()</span>
+
+        <span class="n">names</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">t</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span><span class="o">.</span><span class="n">keys</span><span class="p">()])</span>
+
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Combining types </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span><span class="si">}</span><span class="s1"> and </span><span class="si">{</span><span class="n">other_model</span><span class="o">.</span><span class="n">type_counts</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">t1</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+            <span class="k">for</span> <span class="n">t2</span> <span class="ow">in</span> <span class="n">other_model</span><span class="o">.</span><span class="n">type_counts</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
+                <span class="k">if</span> <span class="n">t1</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">t2</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">t1</span><span class="o">.</span><span class="fm">__eq__</span><span class="p">(</span><span class="n">t2</span><span class="p">,</span> <span class="n">check_equal</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+                    <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>
+                    <span class="n">new_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">t2</span><span class="o">.</span><span class="n">name</span><span class="si">}{</span><span class="n">i</span><span class="si">}</span><span class="s1">&#39;</span>
+                    <span class="k">while</span> <span class="n">new_name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
+                        <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
+                        <span class="n">new_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">t2</span><span class="o">.</span><span class="n">name</span><span class="si">}{</span><span class="n">i</span><span class="si">}</span><span class="s1">&#39;</span>
+                    <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Updating </span><span class="si">{</span><span class="n">t2</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1"> to </span><span class="si">{</span><span class="n">new_name</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                    <span class="n">t2</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">new_name</span>
+                    <span class="n">names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">new_name</span><span class="p">)</span>
+                    
+        <span class="c1">## Combine interactions</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">tA</span><span class="p">,</span> <span class="n">tB</span> <span class="ow">in</span> <span class="n">other_model</span><span class="o">.</span><span class="n">nonbonded_interactions</span><span class="p">:</span>
+            <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Combining model interactions </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">tA</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">tB</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">add_nonbonded_interaction</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">tA</span><span class="p">,</span><span class="n">tB</span><span class="p">)</span>
+                    
+        <span class="c1"># for g in other_model.children:</span>
+        <span class="c1">#     self.update(g, copy=copy)</span>
+        <span class="n">g</span> <span class="o">=</span> <span class="n">Group</span><span class="p">()</span>
+        <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="s1">&#39;children position orientation bonds angles dihedrals impropers exclusions vector_angles bond_angles product_potentials group_sites&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
+            <span class="n">g</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">other_model</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">attr</span><span class="p">))</span>
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Updating </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s1"> with </span><span class="si">{</span><span class="n">g</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="n">copy</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">_clear_types</span><span class="p">()</span>
+        
+        <span class="c1">## Combine configurations</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">configuration</span> <span class="o">=</span> <span class="n">other_model</span><span class="o">.</span><span class="n">configuration</span><span class="o">.</span><span class="n">combine</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">configuration</span><span class="p">,</span> <span class="n">policy</span><span class="o">=</span><span class="s1">&#39;best&#39;</span><span class="p">,</span> <span class="n">warn</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.assign_IBI_degrees_of_freedom">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">assign_IBI_degrees_of_freedom</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Convenience routine that adds degrees of freedom to</span>
+<span class="sd">        corresponding IBI potentials &quot;&quot;&quot;</span>
+
+        <span class="kn">from</span><span class="w"> </span><span class="nn">.ibi</span><span class="w"> </span><span class="kn">import</span> <span class="n">BondDof</span><span class="p">,</span> <span class="n">AngleDof</span><span class="p">,</span> <span class="n">DihedralDof</span><span class="p">,</span> <span class="n">PairDistributionDof</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">bonded_ibi_potentials</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_ibi_potentials</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+
+        <span class="k">for</span> <span class="n">get_fn</span><span class="p">,</span> <span class="n">parts_pot_fn</span><span class="p">,</span> <span class="bp">cls</span> <span class="ow">in</span> <span class="p">(</span>
+                <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_bonds</span><span class="p">,</span>     <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="p">(</span><span class="n">x</span><span class="p">[:</span><span class="mi">2</span><span class="p">],</span><span class="n">x</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="n">BondDof</span><span class="p">),</span>
+                <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_angles</span><span class="p">,</span>    <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="p">(</span><span class="n">x</span><span class="p">[:</span><span class="mi">3</span><span class="p">],</span><span class="n">x</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span> <span class="n">AngleDof</span><span class="p">),</span>
+                <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_dihedrals</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="p">(</span><span class="n">x</span><span class="p">[:</span><span class="mi">4</span><span class="p">],</span><span class="n">x</span><span class="p">[</span><span class="mi">4</span><span class="p">]),</span> <span class="n">DihedralDof</span><span class="p">)</span>
+        <span class="p">):</span>
+            <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">get_fn</span><span class="p">():</span>
+                <span class="n">parts</span><span class="p">,</span> <span class="n">pot</span> <span class="o">=</span> <span class="n">parts_pot_fn</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+                <span class="k">try</span><span class="p">:</span> <span class="n">pot</span><span class="o">.</span><span class="n">degrees_of_freedom</span>
+                <span class="k">except</span><span class="p">:</span> <span class="k">continue</span>
+                <span class="n">pot</span><span class="o">.</span><span class="n">degrees_of_freedom</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="bp">cls</span><span class="p">(</span><span class="o">*</span><span class="n">parts</span><span class="p">)</span> <span class="p">)</span>
+                <span class="k">if</span> <span class="n">pot</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">bonded_ibi_potentials</span><span class="p">:</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="n">bonded_ibi_potentials</span><span class="o">.</span><span class="n">add</span><span class="p">(</span> <span class="n">pot</span> <span class="p">)</span>
+
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Gathering nonbonded IBI degrees of freedom&#39;</span><span class="p">)</span>
+        <span class="n">all_exclusions</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_exclusions</span><span class="p">()</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">raise</span>               <span class="c1"># particle.idx wasn&#39;t set without this</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">getParticleTypesAndCounts</span><span class="p">()</span>
+
+        <span class="n">type_to_particles</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">type_</span>
+            <span class="k">if</span> <span class="n">t</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">type_to_particles</span><span class="p">:</span> <span class="n">type_to_particles</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+            <span class="n">type_to_particles</span><span class="p">[</span><span class="n">t</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+        <span class="n">type_to_particles</span><span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">]</span>
+
+        <span class="n">already_handled</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+        <span class="k">for</span> <span class="n">pot</span><span class="p">,</span> <span class="n">tA</span><span class="p">,</span> <span class="n">tB</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_interactions</span><span class="p">:</span>
+            <span class="c1">## Avoid including particle type pairs that don&#39;t apply</span>
+            <span class="k">if</span> <span class="p">(</span><span class="n">tA</span><span class="p">,</span><span class="n">tB</span><span class="p">)</span> <span class="ow">in</span> <span class="n">already_handled</span><span class="p">:</span> <span class="k">continue</span>
+            <span class="n">already_handled</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">tA</span><span class="p">,</span><span class="n">tB</span><span class="p">))</span>
+            <span class="n">already_handled</span><span class="o">.</span><span class="n">add</span><span class="p">((</span><span class="n">tB</span><span class="p">,</span><span class="n">tA</span><span class="p">))</span>
+
+            <span class="k">try</span><span class="p">:</span>
+                <span class="n">pot</span><span class="o">.</span><span class="n">degrees_of_freedom</span>
+            <span class="k">except</span><span class="p">:</span>
+                <span class="k">continue</span>
+
+            <span class="k">def</span><span class="w"> </span><span class="nf">_cond</span><span class="p">(</span><span class="n">pair</span><span class="p">):</span>
+                <span class="n">b1</span> <span class="o">=</span> <span class="p">(</span><span class="n">tA</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">type_</span> <span class="o">==</span> <span class="n">tA</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">tB</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">type_</span> <span class="o">==</span> <span class="n">tB</span><span class="p">)</span>
+                <span class="n">b2</span> <span class="o">=</span> <span class="p">(</span><span class="n">tB</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">pair</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">type_</span> <span class="o">==</span> <span class="n">tB</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">tA</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">type_</span> <span class="o">==</span> <span class="n">tA</span><span class="p">)</span>
+                <span class="k">return</span> <span class="p">(</span><span class="n">b1</span> <span class="ow">or</span> <span class="n">b2</span><span class="p">)</span>
+
+            <span class="n">ex</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="n">_cond</span><span class="p">,</span> <span class="n">all_exclusions</span><span class="p">))</span>
+            <span class="n">dof</span> <span class="o">=</span> <span class="n">PairDistributionDof</span><span class="p">(</span> <span class="n">type_to_particles</span><span class="p">[</span><span class="n">tA</span><span class="p">],</span> <span class="n">type_to_particles</span><span class="p">[</span><span class="n">tB</span><span class="p">],</span> <span class="n">exclusions</span><span class="o">=</span><span class="n">ex</span><span class="p">,</span>
+                                       <span class="n">range_</span><span class="o">=</span><span class="n">pot</span><span class="o">.</span><span class="n">range_</span><span class="p">,</span> <span class="n">resolution</span><span class="o">=</span><span class="n">pot</span><span class="o">.</span><span class="n">resolution</span><span class="p">)</span>
+
+            <span class="n">pot</span><span class="o">.</span><span class="n">degrees_of_freedom</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">dof</span> <span class="p">)</span>
+
+            <span class="k">if</span> <span class="n">pot</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_ibi_potentials</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_ibi_potentials</span><span class="o">.</span><span class="n">add</span><span class="p">(</span> <span class="n">pot</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.load_target_IBI_distributions">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.load_target_IBI_distributions">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">load_target_IBI_distributions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">NotImplementedError</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.run_IBI">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.run_IBI">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">run_IBI</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iterations</span><span class="p">,</span> <span class="n">directory</span> <span class="o">=</span> <span class="s1">&#39;./&#39;</span><span class="p">,</span> <span class="n">engine</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">replicas</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">run_minimization</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span> <span class="n">first_iteration</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">target_universe</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">target_trajectory</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Run Iterative Boltzmann Inversion (IBI) to optimize coarse-grained potentials.</span>
+<span class="sd">        </span>
+<span class="sd">        This method performs IBI iterations to match target distributions. For each iteration,</span>
+<span class="sd">        it writes CG potentials, runs simulations, and extracts distributions from the resulting</span>
+<span class="sd">        trajectories to update the potentials for the next iteration.</span>
+<span class="sd">        </span>
+<span class="sd">        Parameters</span>
+<span class="sd">        ----------</span>
+<span class="sd">        iterations : int</span>
+<span class="sd">            Number of IBI iterations to run</span>
+<span class="sd">        directory : str, optional</span>
+<span class="sd">            Directory to store output files, defaults to current directory</span>
+<span class="sd">        engine : ArbdEngine, optional</span>
+<span class="sd">            Simulation engine to use. If None, creates a default engine with 5e6 steps</span>
+<span class="sd">            and 1e4 output period</span>
+<span class="sd">        replicas : int, optional</span>
+<span class="sd">            Number of replica simulations to run per iteration, defaults to 1</span>
+<span class="sd">        run_minimization : bool, optional</span>
+<span class="sd">            Whether to run a brief minimization before the first iteration, defaults to True</span>
+<span class="sd">        first_iteration : int, optional</span>
+<span class="sd">            Starting iteration number, useful for continuing previous IBI runs, defaults to 1</span>
+<span class="sd">        target_universe : MDAnalysis.Universe, optional</span>
+<span class="sd">            Universe object containing target structure and trajectory</span>
+<span class="sd">        target_trajectory : str or list, optional</span>
+<span class="sd">            Target trajectory file(s) to use if target_universe is provided</span>
+<span class="sd">            </span>
+<span class="sd">        Raises</span>
+<span class="sd">        ------</span>
+<span class="sd">        ValueError</span>
+<span class="sd">            If the model does not have any IBI potentials assigned</span>
+<span class="sd">        NotImplementedError</span>
+<span class="sd">            If the system does not have an orthorhombic unit cell</span>
+<span class="sd">            </span>
+<span class="sd">        Notes</span>
+<span class="sd">        -----</span>
+<span class="sd">        The method requires bonded_ibi_potentials and nonbonded_ibi_potentials to be </span>
+<span class="sd">        defined in the model. Use assign_IBI_degrees_of_freedom() before calling this method.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="k">assert</span><span class="p">(</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bonded_ibi_potentials</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_ibi_potentials</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">)</span>
+        <span class="k">except</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Model does not appear to contain IBI potentials; perhaps you forgot to run self.assign_IBI_degrees_of_freedom()&#39;</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Running </span><span class="si">{</span><span class="n">iterations</span><span class="si">}</span><span class="s1"> IBI iterations with </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bonded_ibi_potentials</span><span class="p">)</span><span class="si">}</span><span class="s1"> bonded and </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_ibi_potentials</span><span class="p">)</span><span class="si">}</span><span class="s1"> nonbonded IBI potentials&#39;</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">engine</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">engine</span> <span class="o">=</span> <span class="n">ArbdEngine</span><span class="p">(</span>
+                <span class="n">num_steps</span> <span class="o">=</span> <span class="mf">5e6</span><span class="p">,</span>
+                <span class="n">output_period</span> <span class="o">=</span> <span class="mf">1e4</span><span class="p">,</span>
+            <span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span><span class="p">)</span><span class="o">.</span><span class="n">size</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">&#39;IBI only implemented for systems with orthorhombic unit cells&#39;</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">box</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span><span class="p">[:</span><span class="mi">3</span><span class="p">])</span> <span class="o">+</span> <span class="p">([</span><span class="mi">90</span><span class="p">]</span><span class="o">*</span><span class="mi">3</span><span class="p">))</span>
+
+        <span class="n">restart_file</span> <span class="o">=</span> <span class="kc">None</span>
+
+        <span class="k">if</span> <span class="n">target_universe</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">_potentials</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bonded_ibi_potentials</span><span class="p">)</span><span class="o">+</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_ibi_potentials</span><span class="p">)</span>
+            <span class="k">with</span> <span class="n">logging_redirect_tqdm</span><span class="p">(</span><span class="n">loggers</span><span class="o">=</span><span class="p">[</span><span class="n">logger</span><span class="p">,</span><span class="n">devlogger</span><span class="p">]):</span>
+                <span class="k">for</span> <span class="n">potential</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="n">_potentials</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s1">&#39;Calculating target distributions&#39;</span><span class="p">):</span>
+                    <span class="n">potential</span><span class="o">.</span><span class="n">get_target_distribution</span><span class="p">(</span><span class="n">target_universe</span><span class="p">,</span> <span class="n">trajectory</span><span class="o">=</span><span class="n">target_trajectory</span><span class="p">)</span>
+
+        <span class="k">def</span><span class="w"> </span><span class="nf">_load_cg_u</span><span class="p">(</span><span class="n">iteration</span><span class="p">):</span>
+            <span class="n">name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;ibi-</span><span class="si">{</span><span class="n">iteration</span><span class="si">:</span><span class="s1">03d</span><span class="si">}</span><span class="s1">&#39;</span>
+            <span class="n">psf</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">/</span><span class="si">{}</span><span class="s1">.psf&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">directory</span><span class="p">,</span><span class="n">name</span><span class="p">)</span>
+            <span class="n">globstring</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">directory</span><span class="si">}</span><span class="s1">/output/</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s1">.*dcd&#39;</span>
+            <span class="n">dcds</span> <span class="o">=</span> <span class="p">[</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">glob</span><span class="p">(</span><span class="n">globstring</span><span class="p">)</span> <span class="k">if</span> <span class="s1">&#39;momentum&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">f</span><span class="p">]</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">dcds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Expected to find dcds at </span><span class="si">{</span><span class="n">globstring</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+            <span class="n">cg_u</span> <span class="o">=</span> <span class="n">mda</span><span class="o">.</span><span class="n">Universe</span><span class="p">(</span><span class="n">psf</span><span class="p">,</span><span class="o">*</span><span class="n">dcds</span><span class="p">)</span>
+            <span class="k">return</span> <span class="n">cg_u</span>
+
+        <span class="n">cg_u</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">if</span> <span class="n">first_iteration</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+            <span class="n">cg_u</span> <span class="o">=</span> <span class="n">_load_cg_u</span><span class="p">(</span><span class="n">first_iteration</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+            <span class="k">with</span> <span class="n">logging_redirect_tqdm</span><span class="p">(</span><span class="n">loggers</span><span class="o">=</span><span class="p">[</span><span class="n">logger</span><span class="p">,</span><span class="n">devlogger</span><span class="p">]):</span>
+                <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="n">_potentials</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s1">&#39;Calculating initial CG distributions&#39;</span><span class="p">):</span>
+                    <span class="n">p</span><span class="o">.</span><span class="n">get_cg_distribution</span><span class="p">(</span><span class="n">cg_u</span><span class="p">,</span> <span class="n">box</span><span class="o">=</span><span class="n">box</span><span class="p">,</span> <span class="n">recalculate</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">_potentials</span><span class="p">:</span>
+            <span class="n">p</span><span class="o">.</span><span class="n">iteration</span> <span class="o">=</span> <span class="n">first_iteration</span>
+
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">first_iteration</span><span class="p">,</span> <span class="n">iterations</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Working on IBI iteration </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1">/</span><span class="si">{</span><span class="n">iterations</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+
+            <span class="k">with</span> <span class="n">logging_redirect_tqdm</span><span class="p">(</span><span class="n">loggers</span><span class="o">=</span><span class="p">[</span><span class="n">logger</span><span class="p">,</span><span class="n">devlogger</span><span class="p">]):</span>
+                <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="n">_potentials</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s1">&#39;Writing CG potentials&#39;</span><span class="p">):</span>
+                    <span class="c1"># if &#39;IBIPotentials/intrabond-1&#39; in p.filename(): import ipdb; ipdb.set_trace()</span>
+                    <span class="k">try</span><span class="p">:</span>    <span class="n">p</span><span class="o">.</span><span class="n">write_cg_potential</span><span class="p">(</span><span class="n">cg_u</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">tol</span><span class="p">,</span> <span class="n">box</span><span class="o">=</span><span class="n">box</span><span class="p">)</span>
+                    <span class="k">except</span><span class="p">:</span> <span class="n">p</span><span class="o">.</span><span class="n">write_cg_potential</span><span class="p">(</span><span class="n">cg_u</span><span class="p">,</span> <span class="n">box</span><span class="o">=</span><span class="n">box</span><span class="p">)</span>
+
+            <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">run_minimization</span><span class="p">:</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Running brief simulation with small timestep&#39;</span><span class="p">)</span>
+                <span class="n">ts0</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">_get_combined_conf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">timestep</span>
+                <span class="n">engine</span><span class="o">.</span><span class="n">simulate</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span>
+                                 <span class="n">output_name</span> <span class="o">=</span> <span class="s1">&#39;ibi-min&#39;</span><span class="p">,</span> <span class="n">directory</span> <span class="o">=</span> <span class="n">directory</span><span class="p">,</span>
+                                 <span class="n">timestep</span> <span class="o">=</span> <span class="n">ts0</span><span class="o">/</span><span class="mi">100</span><span class="p">,</span>
+                                 <span class="n">num_steps</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">,</span> <span class="n">output_period</span><span class="o">=</span><span class="mi">1000</span> <span class="p">)</span>
+
+                <span class="n">restart_file</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">directory</span><span class="si">}</span><span class="s1">/output/ibi-min.restart&#39;</span>
+
+            <span class="n">name</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;ibi-</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s1">03d</span><span class="si">}</span><span class="s1">&#39;</span>
+            <span class="n">engine</span><span class="o">.</span><span class="n">simulate</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span>
+                             <span class="n">output_name</span> <span class="o">=</span> <span class="n">name</span><span class="p">,</span> <span class="n">directory</span> <span class="o">=</span> <span class="n">directory</span><span class="p">,</span>
+                             <span class="n">restart_file</span> <span class="o">=</span> <span class="n">restart_file</span><span class="p">,</span>
+                             <span class="n">replicas</span> <span class="o">=</span> <span class="n">replicas</span> <span class="p">)</span>
+
+            <span class="n">restart_file</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">directory</span><span class="si">}</span><span class="s1">/output/</span><span class="si">{</span><span class="n">name</span><span class="si">}{</span><span class="s2">&quot;.0&quot;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">replicas</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s2">&quot;&quot;</span><span class="si">}</span><span class="s1">.restart&#39;</span>
+            <span class="n">cg_u</span> <span class="o">=</span> <span class="n">_load_cg_u</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
+
+            <span class="k">with</span> <span class="n">logging_redirect_tqdm</span><span class="p">(</span><span class="n">loggers</span><span class="o">=</span><span class="p">[</span><span class="n">logger</span><span class="p">,</span><span class="n">devlogger</span><span class="p">]):</span>
+                <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="n">_potentials</span><span class="p">,</span> <span class="n">desc</span><span class="o">=</span><span class="s1">&#39;Extracting CG distributions&#39;</span><span class="p">):</span>
+                    <span class="n">p</span><span class="o">.</span><span class="n">get_cg_distribution</span><span class="p">(</span><span class="n">cg_u</span><span class="p">,</span> <span class="n">box</span><span class="o">=</span><span class="n">box</span><span class="p">,</span> <span class="n">recalculate</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+                    <span class="n">p</span><span class="o">.</span><span class="n">iteration</span> <span class="o">+=</span> <span class="mi">1</span></div>
+
+        
+<div class="viewcode-block" id="ArbdModel.update">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.update">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">group</span> <span class="p">,</span> <span class="n">copy</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+        <span class="k">assert</span><span class="p">(</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">group</span><span class="p">,</span> <span class="n">Group</span><span class="p">)</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="n">copy</span><span class="p">:</span>
+            <span class="n">group</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
+        <span class="n">group</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">group</span><span class="p">)</span></div>
+
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_get_nonbonded_interaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">typeA</span><span class="p">,</span> <span class="n">typeB</span><span class="p">):</span>
+        <span class="k">for</span> <span class="n">cp</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">False</span><span class="p">,</span><span class="kc">True</span><span class="p">):</span>
+            <span class="k">for</span> <span class="n">s</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="n">B</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_interactions</span><span class="p">:</span>
+                <span class="k">if</span> <span class="n">A</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">B</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                    <span class="k">if</span> <span class="n">A</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">B</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                        <span class="k">return</span> <span class="n">s</span>
+                    <span class="k">elif</span> <span class="n">A</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">typeB</span><span class="o">.</span><span class="n">is_same_type</span><span class="p">(</span><span class="n">B</span><span class="p">,</span> <span class="n">consider_parents</span><span class="o">=</span><span class="n">cp</span><span class="p">):</span>
+                        <span class="k">return</span> <span class="n">s</span>
+                    <span class="k">elif</span> <span class="n">B</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">typeA</span><span class="o">.</span><span class="n">is_same_type</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">consider_parents</span><span class="o">=</span><span class="n">cp</span><span class="p">):</span>
+                        <span class="k">return</span> <span class="n">s</span>
+                <span class="k">elif</span> <span class="n">typeA</span><span class="o">.</span><span class="n">is_same_type</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="n">consider_parents</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="ow">and</span> <span class="n">typeB</span><span class="o">.</span><span class="n">is_same_type</span><span class="p">(</span><span class="n">B</span><span class="p">,</span><span class="n">consider_parents</span><span class="o">=</span><span class="n">cp</span><span class="p">):</span>
+                    <span class="k">return</span> <span class="n">s</span>
+        
+        <span class="c1"># raise Exception(&quot;No nonbonded scheme found for %s and %s&quot; % (typeA.name, typeB.name))</span>
+        <span class="c1"># print(&quot;WARNING: No nonbonded scheme found for %s and %s&quot; % (typeA.name, typeB.name))</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_countParticleTypes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">## TODO: check for modifications to particle that require</span>
+        <span class="c1">## automatic generation of new particle type</span>
+        <span class="n">type_counts</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>    <span class="c1"># type is key, value is 2-element list of regular particle counts and attached particles</span>
+
+        <span class="n">parts</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rigid_bodies</span> <span class="o">=</span> <span class="p">[],[]</span>
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">rigid</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
+
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">type_</span>
+            <span class="k">if</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">type_counts</span><span class="p">:</span>
+                <span class="n">type_counts</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">type_counts</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span>
+
+        <span class="n">parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">rb</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="n">rb</span><span class="o">.</span><span class="n">rigid</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">rb</span><span class="o">.</span><span class="n">attached_particles</span><span class="p">]</span>
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">type_</span>
+            <span class="k">if</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">type_counts</span><span class="p">:</span>
+                <span class="n">type_counts</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">type_counts</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span>
+        
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dummy_types</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">raise</span><span class="p">(</span><span class="s2">&quot;Dummy types have been deprecated&quot;</span><span class="p">)</span>
+        <span class="c1"># for t in self.dummy_types:</span>
+        <span class="c1">#     if t not in type_counts:</span>
+        <span class="c1">#         type_counts[t] = 0</span>
+
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">tA</span><span class="p">,</span><span class="n">tB</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_interactions</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">tA</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">tA</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">type_counts</span><span class="p">:</span>
+                <span class="n">type_counts</span><span class="p">[</span><span class="n">tA</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span>
+            <span class="k">if</span> <span class="n">tB</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">tB</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">type_counts</span><span class="p">:</span>
+                <span class="n">type_counts</span><span class="p">[</span><span class="n">tB</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span>
+
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span> <span class="o">=</span> <span class="n">type_counts</span>
+
+        <span class="n">rbtc</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        <span class="n">rbti</span><span class="o">=</span><span class="p">{}</span>
+        <span class="k">for</span> <span class="n">rb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">:</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">rb</span><span class="o">.</span><span class="n">type_</span><span class="o">.</span><span class="n">name</span>
+            <span class="k">if</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">rbtc</span><span class="p">:</span> <span class="n">rbtc</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">rbti</span><span class="p">[</span><span class="n">t</span><span class="p">]</span><span class="o">=</span><span class="n">rb</span><span class="o">.</span><span class="n">type_</span>  
+                <span class="n">rbtc</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_body_type_counts</span> <span class="o">=</span> <span class="p">[(</span><span class="n">k</span><span class="p">,</span><span class="n">rbtc</span><span class="p">[</span><span class="n">k</span><span class="p">])</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">rbtc</span><span class="o">.</span><span class="n">keys</span><span class="p">())]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_body_index</span><span class="o">=</span><span class="n">rbti</span>
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s1">: Counting types: </span><span class="si">{</span><span class="n">type_counts</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+        <span class="n">devlogger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s1">: Counting rb types: </span><span class="si">{</span><span class="n">rbtc</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_updateParticleOrder</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1">## Create ordered list</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">particles</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">rigid</span><span class="p">]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_bodies</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">sorted</span><span class="p">([</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">rigid</span><span class="p">],</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">type_</span><span class="p">))</span>
+        <span class="c1"># self.particles = sorted(particles, key=lambda p: (p.type_, p.idx))</span>
+        
+        <span class="c1">## Update particle indices</span>
+        <span class="n">idx</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">particles</span><span class="p">:</span>
+            <span class="n">p</span><span class="o">.</span><span class="n">idx</span> <span class="o">=</span> <span class="n">idx</span>
+            <span class="n">idx</span> <span class="o">=</span> <span class="n">idx</span><span class="o">+</span><span class="mi">1</span>
+
+        <span class="c1">## Add attached particle indices</span>
+        <span class="c1"># attach particles</span>
+        <span class="k">for</span> <span class="n">j</span><span class="p">,</span><span class="n">rb</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rigid_bodies</span><span class="p">):</span>
+            <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">rb</span><span class="o">.</span><span class="n">attached_particles</span><span class="p">:</span>
+                <span class="n">p</span><span class="o">.</span><span class="n">idx</span> <span class="o">=</span> <span class="n">idx</span>
+                <span class="n">idx</span> <span class="o">=</span> <span class="n">idx</span><span class="o">+</span><span class="mi">1</span>
+        
+        <span class="c1">## TODO recurse through childrens&#39; group_sites</span>
+        <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">group_sites</span><span class="p">:</span>
+            <span class="n">g</span><span class="o">.</span><span class="n">idx</span> <span class="o">=</span> <span class="n">idx</span>
+            <span class="n">idx</span> <span class="o">=</span> <span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span>
+            
+        <span class="c1"># self.initialCoords = np.array([p.initialPosition for p in self.particles])</span>
+
+<div class="viewcode-block" id="ArbdModel.useNonbondedScheme">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.useNonbondedScheme">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">useNonbondedScheme</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nbScheme</span><span class="p">,</span> <span class="n">typeA</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">typeB</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; deprecated &quot;&quot;&quot;</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;useNonbondedScheme is deprecated! Please update your code to use `add_nonbonded_interaction`&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">add_nonbonded_interaction</span><span class="p">(</span><span class="n">nbScheme</span><span class="p">,</span> <span class="n">typeA</span><span class="p">,</span> <span class="n">typeB</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.add_nonbonded_interaction">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.add_nonbonded_interaction">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_nonbonded_interaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nonbonded_potential</span><span class="p">,</span> <span class="n">typeA</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">typeB</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_interactions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">[</span><span class="n">nonbonded_potential</span><span class="p">,</span> <span class="n">typeA</span><span class="p">,</span> <span class="n">typeB</span><span class="p">]</span> <span class="p">)</span>
+        <span class="k">if</span> <span class="n">typeA</span> <span class="o">!=</span> <span class="n">typeB</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">nonbonded_interactions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="p">[</span><span class="n">nonbonded_potential</span><span class="p">,</span> <span class="n">typeB</span><span class="p">,</span> <span class="n">typeA</span><span class="p">]</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.prepare_for_simulation">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.prepare_for_simulation">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">prepare_for_simulation</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="o">...</span></div>
+
+    
+<div class="viewcode-block" id="ArbdModel.getParticleTypesAndCounts">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.getParticleTypesAndCounts">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">getParticleTypesAndCounts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Includes rigid body-attached particles &quot;&quot;&quot;</span>
+        <span class="c1">## TODO: remove(?)</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_countParticleTypes</span><span class="p">()</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_updateParticleOrder</span><span class="p">()</span>
+
+        <span class="k">return</span> <span class="nb">sorted</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">type_counts</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">)</span></div>
+
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_particleTypePairIter</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="n">typesAndCounts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getParticleTypesAndCounts</span><span class="p">()</span>
+        <span class="n">i_skipped</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">typesAndCounts</span><span class="p">)):</span>
+            <span class="n">t1</span><span class="p">,(</span><span class="n">n1</span><span class="p">,</span><span class="n">rb1</span><span class="p">)</span> <span class="o">=</span> <span class="n">typesAndCounts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+            <span class="k">if</span> <span class="n">n1</span><span class="o">+</span><span class="n">rb1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">i_skipped</span> <span class="o">+=</span> <span class="mi">1</span>
+                <span class="k">continue</span>
+            <span class="n">j_skipped</span> <span class="o">=</span> <span class="mi">0</span>
+            <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">typesAndCounts</span><span class="p">)):</span>
+                <span class="n">t2</span><span class="p">,(</span><span class="n">n2</span><span class="p">,</span><span class="n">rb2</span><span class="p">)</span> <span class="o">=</span> <span class="n">typesAndCounts</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
+                <span class="k">if</span> <span class="n">n2</span><span class="o">+</span><span class="n">rb2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+                    <span class="n">j_skipped</span> <span class="o">+=</span> <span class="mi">1</span>
+                    <span class="k">continue</span>
+                <span class="k">if</span> <span class="n">n2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span>
+                <span class="k">yield</span><span class="p">(</span> <span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="n">i_skipped</span><span class="p">,</span><span class="n">j</span><span class="o">-</span><span class="n">i_skipped</span><span class="o">-</span><span class="n">j_skipped</span><span class="p">,</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">]</span> <span class="p">)</span>
+
+<div class="viewcode-block" id="ArbdModel.dimensions_from_structure">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.dimensions_from_structure">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">dimensions_from_structure</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">padding_factor</span><span class="o">=</span><span class="mf">1.5</span><span class="p">,</span> <span class="n">isotropic</span><span class="o">=</span><span class="kc">False</span> <span class="p">):</span>
+        <span class="k">raise</span><span class="p">(</span><span class="ne">NotImplementedError</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ArbdModel.simulate">
+<a class="viewcode-back" href="../../api/core/model.html#arbdmodel.model.ArbdModel.simulate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">simulate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+        <span class="c1">## split kwargs</span>
+        <span class="n">sim_kws</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;output_directory&#39;</span><span class="p">,</span> <span class="s1">&#39;directory&#39;</span><span class="p">,</span> <span class="s1">&#39;log_file&#39;</span><span class="p">,</span> <span class="s1">&#39;binary&#39;</span><span class="p">,</span> <span class="s1">&#39;num_procs&#39;</span><span class="p">,</span> <span class="s1">&#39;dry_run&#39;</span><span class="p">,</span> <span class="s1">&#39;configuration&#39;</span><span class="p">,</span> <span class="s1">&#39;replicas&#39;</span><span class="p">]</span>
+        <span class="n">sim_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="n">kw</span><span class="p">:</span><span class="n">kwargs</span><span class="p">[</span><span class="n">kw</span><span class="p">]</span> <span class="k">for</span> <span class="n">kw</span> <span class="ow">in</span> <span class="n">sim_kws</span> <span class="k">if</span> <span class="n">kw</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">}</span>
+        <span class="n">engine_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span><span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">sim_kws</span><span class="p">}</span>
+        <span class="n">engine</span> <span class="o">=</span> <span class="n">ArbdEngine</span><span class="p">(</span><span class="o">**</span><span class="n">engine_kwargs</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">engine</span><span class="o">.</span><span class="n">simulate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="o">**</span><span class="n">sim_kwargs</span><span class="p">)</span></div>
+</div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/parmed_bd.html b/_build/html/_modules/arbdmodel/parmed_bd.html
new file mode 100644
index 0000000000000000000000000000000000000000..078a3934901fc053dec12f37d4b4ed9af5b124db
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/parmed_bd.html
@@ -0,0 +1,1238 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.parmed_bd &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/parmed_bd';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.parmed_bd</h1><div class="highlight"><pre>
+<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">parmed</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">scipy.spatial</span><span class="w"> </span><span class="kn">import</span> <span class="n">distance_matrix</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.model</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArbdModel</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.core_objects</span><span class="w"> </span><span class="kn">import</span> <span class="n">Group</span><span class="p">,</span> <span class="n">ParticleType</span><span class="p">,</span> <span class="n">PointParticle</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.interactions</span><span class="w"> </span><span class="kn">import</span> <span class="n">HarmonicBond</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+
+
+<div class="viewcode-block" id="ParmedArbd">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">ParmedArbd</span><span class="p">(</span><span class="n">ArbdModel</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Class for converting ParmEd structures to ARBD models for simulation.</span>
+<span class="sd">    </span>
+<span class="sd">    This class facilitates the conversion of molecular structures loaded with ParmEd</span>
+<span class="sd">    into ARBD simulation models, preserving bonded and non-bonded interactions.</span>
+<span class="sd">    It also supports creating dual topology models for free energy calculations.</span>
+<span class="sd">    </span>
+<span class="sd">    Attributes:</span>
+<span class="sd">        parmed_structure: The original ParmEd structure</span>
+<span class="sd">        atom_types: Dictionary mapping atom type names to ParticleType objects</span>
+<span class="sd">        atoms_map: Mapping from ParmEd atoms to ARBD atoms</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parmed_structure</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">psf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pdb</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">parameter_files</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                 <span class="n">system_type</span><span class="o">=</span><span class="s1">&#39;charmm&#39;</span><span class="p">,</span> <span class="n">integrator</span><span class="o">=</span><span class="s1">&#39;MD&#39;</span><span class="p">,</span> <span class="n">cutoff</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Initialize ParmedArbd model from a ParmEd structure or PSF/PDB files.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            parmed_structure: Existing ParmEd structure object (optional)</span>
+<span class="sd">            psf: Path to PSF file (optional if parmed_structure is provided)</span>
+<span class="sd">            pdb: Path to PDB file (optional if parmed_structure is provided)</span>
+<span class="sd">            parameter_files: List of parameter files for force field (optional)</span>
+<span class="sd">            system_type: Type of system (&#39;charmm&#39;, etc.)</span>
+<span class="sd">            integrator: Simulation integrator type</span>
+<span class="sd">            cutoff: Non-bonded interaction cutoff distance</span>
+<span class="sd">            **kwargs: Additional arguments for ArbdModel</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Initialize empty model first</span>
+        <span class="n">ArbdModel</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[],</span> <span class="n">integrator</span><span class="o">=</span><span class="n">integrator</span><span class="p">,</span> <span class="n">cutoff</span><span class="o">=</span><span class="n">cutoff</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">atom_types</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">atoms_map</span> <span class="o">=</span> <span class="p">{}</span>
+        
+        <span class="c1"># Load structure if provided</span>
+        <span class="k">if</span> <span class="n">parmed_structure</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span> <span class="o">=</span> <span class="n">parmed_structure</span>
+        <span class="k">elif</span> <span class="n">psf</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">pdb</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_files</span><span class="p">(</span><span class="n">psf</span><span class="p">,</span> <span class="n">pdb</span><span class="p">,</span> <span class="n">parameter_files</span><span class="p">,</span> <span class="n">system_type</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span> <span class="o">=</span> <span class="kc">None</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;No structure provided; use load_structure() to load one&quot;</span><span class="p">)</span>
+            <span class="k">return</span>
+            
+        <span class="c1"># Convert the structure to ARBD model</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_build_model_from_structure</span><span class="p">()</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_read_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">psf</span><span class="p">,</span> <span class="n">pdb</span><span class="p">,</span> <span class="n">parameter_files</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">system_type</span><span class="o">=</span><span class="s1">&#39;charmm&#39;</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Read PSF and PDB files into a ParmEd structure.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            psf: Path to PSF file</span>
+<span class="sd">            pdb: Path to PDB file</span>
+<span class="sd">            parameter_files: List of parameter files</span>
+<span class="sd">            system_type: Type of system (&#39;charmm&#39;, etc.)</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            ParmEd structure object</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">system_type</span> <span class="o">==</span> <span class="s1">&#39;charmm&#39;</span><span class="p">:</span>
+            <span class="n">p1</span> <span class="o">=</span> <span class="n">parmed</span><span class="o">.</span><span class="n">charmm</span><span class="o">.</span><span class="n">CharmmPsfFile</span><span class="p">(</span><span class="n">psf</span><span class="p">)</span>
+            <span class="n">c1</span> <span class="o">=</span> <span class="n">parmed</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="n">pdb</span><span class="p">)</span>
+            <span class="k">for</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">atoms</span><span class="p">,</span> <span class="n">c1</span><span class="o">.</span><span class="n">atoms</span><span class="p">):</span>
+                <span class="n">a</span><span class="o">.</span><span class="n">xx</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">xx</span> 
+                <span class="n">a</span><span class="o">.</span><span class="n">xy</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">xy</span>
+                <span class="n">a</span><span class="o">.</span><span class="n">xz</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">xz</span>
+                <span class="n">a</span><span class="o">.</span><span class="n">bfactor</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">bfactor</span>
+                
+            <span class="k">if</span> <span class="n">parameter_files</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parameter_files</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+                    <span class="n">parameter_files</span> <span class="o">=</span> <span class="p">[</span><span class="n">parameter_files</span><span class="p">]</span>
+                <span class="n">params</span> <span class="o">=</span> <span class="n">parmed</span><span class="o">.</span><span class="n">charmm</span><span class="o">.</span><span class="n">CharmmParameterSet</span><span class="p">(</span><span class="o">*</span><span class="n">parameter_files</span><span class="p">)</span>
+                <span class="n">p1</span><span class="o">.</span><span class="n">load_parameters</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
+                
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Cannot import a &quot;</span><span class="si">{</span><span class="n">system_type</span><span class="si">}</span><span class="s1">&quot; model&#39;</span><span class="p">)</span>
+            
+        <span class="k">return</span> <span class="n">p1</span>
+        
+<div class="viewcode-block" id="ParmedArbd.load_structure">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.load_structure">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">load_structure</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parmed_structure</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">psf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pdb</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                       <span class="n">parameter_files</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">system_type</span><span class="o">=</span><span class="s1">&#39;charmm&#39;</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Load a ParmEd structure or read from PSF/PDB files.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            parmed_structure: Existing ParmEd structure object (optional)</span>
+<span class="sd">            psf: Path to PSF file (optional if parmed_structure is provided)</span>
+<span class="sd">            pdb: Path to PDB file (optional if parmed_structure is provided)</span>
+<span class="sd">            parameter_files: List of parameter files (optional)</span>
+<span class="sd">            system_type: Type of system (&#39;charmm&#39;, etc.)</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            self for method chaining</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">parmed_structure</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span> <span class="o">=</span> <span class="n">parmed_structure</span>
+        <span class="k">elif</span> <span class="n">psf</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">pdb</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_files</span><span class="p">(</span><span class="n">psf</span><span class="p">,</span> <span class="n">pdb</span><span class="p">,</span> <span class="n">parameter_files</span><span class="p">,</span> <span class="n">system_type</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Either parmed_structure or both psf and pdb must be provided&quot;</span><span class="p">)</span>
+            
+        <span class="c1"># Clear existing model and rebuild</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">clear_all</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_build_model_from_structure</span><span class="p">()</span>
+        
+        <span class="k">return</span> <span class="bp">self</span></div>
+
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_validate_atom</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">atom</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Validate that atom properties are compatible with ARBD model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            atom: ParmEd atom object to validate</span>
+<span class="sd">            </span>
+<span class="sd">        Raises:</span>
+<span class="sd">            NotImplementedError: If atom has unsupported properties</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">atom</span><span class="o">.</span><span class="n">multipoles</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Atom </span><span class="si">{</span><span class="n">atom</span><span class="si">}</span><span class="s1"> uses multipoles attribute for AMEOBA&#39;</span><span class="p">)</span>
+        <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+            <span class="k">pass</span>
+
+        <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s1">&#39;tortors other_locations anisou hybridization irotat tree screen solvent_radius join altloc marked cmaps children aromatic formal_charge&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
+            <span class="n">_a</span> <span class="o">=</span> <span class="n">atom</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">_a</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">_isnum</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_a</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">_a</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
+                <span class="k">if</span> <span class="p">(</span><span class="n">_isnum</span> <span class="ow">and</span> <span class="p">(</span><span class="n">_a</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">))</span> <span class="ow">or</span> <span class="p">((</span><span class="ow">not</span> <span class="n">_isnum</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">_a</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">):</span>
+                    <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Atom </span><span class="si">{</span><span class="n">atom</span><span class="o">.</span><span class="n">idx</span><span class="si">}</span><span class="s1"> &quot;</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s1">&quot; is non-null (</span><span class="si">{</span><span class="n">_a</span><span class="si">}</span><span class="s1">)&#39;</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+        
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">atom</span><span class="o">.</span><span class="n">other_locations</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Atom </span><span class="si">{</span><span class="n">atom</span><span class="o">.</span><span class="n">idx</span><span class="si">}</span><span class="s1"> has other locations which is not supported&#39;</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_validate_topology</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Validate that the topology is compatible with ARBD model.</span>
+<span class="sd">        </span>
+<span class="sd">        Raises:</span>
+<span class="sd">            NotImplementedError: If topology has unsupported features</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">part</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span>
+        
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">rb_torsions</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Topology includes RB torsions&#39;</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+            
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">urey_bradleys</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Topology includes Urey Bradley terms&#39;</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+            
+        <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;impropers&#39;</span><span class="p">,</span> <span class="s1">&#39;cmaps&#39;</span><span class="p">,</span> <span class="s1">&#39;trigonal_angles&#39;</span><span class="p">,</span> <span class="s1">&#39;out_of_plane_bends&#39;</span><span class="p">,</span>
+                 <span class="s1">&#39;pi_torsions&#39;</span><span class="p">,</span> <span class="s1">&#39;stretch_bends&#39;</span><span class="p">,</span> <span class="s1">&#39;torsion_torsions&#39;</span><span class="p">,</span> <span class="s1">&#39;chiral_frames&#39;</span><span class="p">,</span>
+                 <span class="s1">&#39;multipole_frames&#39;</span><span class="p">,</span> <span class="s1">&#39;adjusts&#39;</span><span class="p">,</span> <span class="s1">&#39;links&#39;</span><span class="p">]:</span>
+            <span class="n">_a</span> <span class="o">=</span> <span class="n">part</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
+            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">_a</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Topology includes </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">_a</span><span class="p">)</span><span class="si">}</span><span class="s1"> &quot;</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s1">&quot;&#39;</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">part</span><span class="o">.</span><span class="n">unknown_functional</span> <span class="o">!=</span> <span class="kc">False</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Topology unknown_functional is &quot;</span><span class="si">{</span><span class="n">part</span><span class="o">.</span><span class="n">unknown_functional</span><span class="si">}</span><span class="s1">&quot; (not &quot;False&quot;)&#39;</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">part</span><span class="o">.</span><span class="n">symmetry</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Topology symmetry is &quot;</span><span class="si">{</span><span class="n">part</span><span class="o">.</span><span class="n">symmetry</span><span class="si">}</span><span class="s1">&quot; (not &quot;None&quot;)&#39;</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">part</span><span class="o">.</span><span class="n">nrexcl</span> <span class="o">&gt;</span> <span class="mi">4</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Topology nrexcl is &quot;</span><span class="si">{</span><span class="n">part</span><span class="o">.</span><span class="n">nrexcl</span><span class="si">}</span><span class="s1">&quot; (not &lt;= &quot;4&quot;)&#39;</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+            
+        <span class="k">if</span> <span class="n">part</span><span class="o">.</span><span class="n">_combining_rule</span> <span class="o">!=</span> <span class="s1">&#39;lorentz&#39;</span><span class="p">:</span>
+            <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;Unrecognized non-bonded combining rule &quot;</span><span class="si">{</span><span class="n">part</span><span class="o">.</span><span class="n">_combining_rule</span><span class="si">}</span><span class="s1">&quot;&#39;</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+        
+        <span class="c1"># Validate first atom as representative</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_validate_atom</span><span class="p">(</span><span class="n">part</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_create_particle_types</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create ARBD ParticleType objects from atom types in the ParmEd structure.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Dictionary mapping atom type names to ParticleType objects</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_atypes</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">atom_type</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Importing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">_atypes</span><span class="p">)</span><span class="si">}</span><span class="s1"> types from ParmEd&#39;</span><span class="p">)</span>
+        
+        <span class="n">_new_types_d</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">_atypes</span><span class="p">:</span>
+            <span class="n">_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
+                      <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s1">&#39;number mass atomic_number epsilon rmin charge&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">()}</span>
+
+            <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s1">&#39;epsilon_14 rmin_14&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
+                <span class="n">_a1</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
+                <span class="n">_a2</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+                <span class="k">if</span> <span class="n">_a1</span> <span class="o">!=</span> <span class="n">_a2</span><span class="p">:</span>
+                    <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">t</span><span class="si">}</span><span class="s1">.</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s1"> differs from normal term (</span><span class="si">{</span><span class="n">_a1</span><span class="si">}</span><span class="s1"> != </span><span class="si">{</span><span class="n">_a2</span><span class="si">}</span><span class="s1">)&#39;</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+
+            <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="s1">&#39;nbfix nbthole _bond_type&#39;</span><span class="o">.</span><span class="n">split</span><span class="p">():</span>
+                <span class="n">_a</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>
+                <span class="k">if</span> <span class="n">_a</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">_a</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+                    <span class="n">_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">t</span><span class="si">}</span><span class="s1">.</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s1"> is non-null (</span><span class="si">{</span><span class="n">_a</span><span class="si">}</span><span class="s1">)&#39;</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">_msg</span><span class="p">)</span>
+
+            <span class="k">assert</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_new_types_d</span><span class="p">)</span>
+            <span class="n">_new_types_d</span><span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">ParticleType</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
+                                               <span class="n">damping_coefficient</span><span class="o">=</span><span class="mf">1e-4</span><span class="p">,</span>  <span class="c1"># 0.1 ps</span>
+                                               <span class="o">**</span><span class="n">_kwargs</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">atom_types</span> <span class="o">=</span> <span class="n">_new_types_d</span>
+        <span class="k">return</span> <span class="n">_new_types_d</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_build_model_from_structure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Build ARBD model from the loaded ParmEd structure.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Validate topology first</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_validate_topology</span><span class="p">()</span>
+        
+        <span class="c1"># Create particle types</span>
+        <span class="n">atom_types</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_particle_types</span><span class="p">()</span>
+        
+        <span class="c1"># Create model structure</span>
+        <span class="n">allsegs</span> <span class="o">=</span> <span class="n">Group</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;allsegs&#39;</span><span class="p">,</span> <span class="n">_segments</span><span class="o">=</span><span class="p">{})</span>
+        <span class="n">atoms_d</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="n">bond_t_d</span> <span class="o">=</span> <span class="p">{}</span>
+        
+        <span class="c1"># Helper function to get or create residue group</span>
+        <span class="k">def</span><span class="w"> </span><span class="nf">_get_residue</span><span class="p">(</span><span class="n">res</span><span class="p">):</span>
+            <span class="n">segid</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">segid</span> <span class="k">if</span> <span class="n">res</span><span class="o">.</span><span class="n">segid</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">res</span><span class="o">.</span><span class="n">chain</span>
+            <span class="k">if</span> <span class="n">segid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">allsegs</span><span class="o">.</span><span class="n">_segments</span><span class="p">:</span>
+                <span class="n">allsegs</span><span class="o">.</span><span class="n">_segments</span><span class="p">[</span><span class="n">segid</span><span class="p">]</span> <span class="o">=</span> <span class="n">Group</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">segid</span><span class="p">,</span> <span class="n">_residues</span><span class="o">=</span><span class="p">{},</span> <span class="n">parent</span><span class="o">=</span><span class="n">allsegs</span><span class="p">)</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Creating segment </span><span class="si">{</span><span class="n">segid</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+            <span class="n">seg</span> <span class="o">=</span> <span class="n">allsegs</span><span class="o">.</span><span class="n">_segments</span><span class="p">[</span><span class="n">segid</span><span class="p">]</span>
+
+            <span class="n">key</span> <span class="o">=</span> <span class="p">(</span><span class="n">segid</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">number</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">seg</span><span class="o">.</span><span class="n">_residues</span><span class="p">:</span>
+                <span class="n">seg</span><span class="o">.</span><span class="n">_residues</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">Group</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">res</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">resid</span><span class="o">=</span><span class="n">res</span><span class="o">.</span><span class="n">number</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="n">res</span><span class="o">.</span><span class="n">chain</span><span class="p">,</span> <span class="n">parent</span><span class="o">=</span><span class="n">seg</span><span class="p">)</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">((</span><span class="n">seg</span><span class="p">,</span> <span class="n">segid</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">number</span><span class="p">,</span> <span class="n">res</span><span class="o">.</span><span class="n">_idx</span><span class="p">))</span>
+
+            <span class="k">return</span> <span class="n">seg</span><span class="o">.</span><span class="n">_residues</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+        
+        <span class="c1"># Helper function to create an atom</span>
+        <span class="k">def</span><span class="w"> </span><span class="nf">_add_atom</span><span class="p">(</span><span class="n">atom</span><span class="p">):</span>
+            <span class="n">a</span> <span class="o">=</span> <span class="n">atom</span>
+            <span class="n">mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">bfactor</span><span class="o">=</span><span class="s1">&#39;beta&#39;</span><span class="p">,</span>
+                          <span class="n">occupancy</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">mapping</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
+                <span class="k">if</span> <span class="n">v</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                    <span class="n">mapping</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">k</span>
+
+            <span class="n">res</span> <span class="o">=</span> <span class="n">_get_residue</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">residue</span><span class="p">)</span>
+            <span class="n">_a</span> <span class="o">=</span> <span class="n">PointParticle</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">a</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">type_</span><span class="o">=</span><span class="n">atom_types</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">type</span><span class="p">],</span>
+                              <span class="n">position</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">((</span><span class="n">a</span><span class="o">.</span><span class="n">xx</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">xy</span><span class="p">,</span> <span class="n">a</span><span class="o">.</span><span class="n">xz</span><span class="p">)),</span> <span class="n">parent</span><span class="o">=</span><span class="n">res</span><span class="p">,</span>
+                              <span class="o">**</span><span class="p">{</span><span class="n">mapping</span><span class="p">[</span><span class="n">k</span><span class="p">]:</span> <span class="n">a</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">mapping</span><span class="o">.</span><span class="n">keys</span><span class="p">()})</span>
+            <span class="n">atoms_d</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">=</span> <span class="n">_a</span>
+            <span class="k">return</span> <span class="n">_a</span>
+        
+        <span class="c1"># Helper function to get or create a bond type</span>
+        <span class="k">def</span><span class="w"> </span><span class="nf">_get_bond_type</span><span class="p">(</span><span class="n">bond</span><span class="p">):</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">bond</span><span class="o">.</span><span class="n">type</span>
+            <span class="k">if</span> <span class="n">t</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">bond_t_d</span><span class="p">:</span>
+                <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">penalty</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Bond.penalty for bond </span><span class="si">{</span><span class="n">t</span><span class="si">}</span><span class="s1"> not null&#39;</span><span class="p">)</span>
+                <span class="n">width</span> <span class="o">=</span> <span class="mf">0.76565392</span><span class="o">/</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">k</span><span class="p">))</span>  <span class="c1"># units conversion</span>
+                <span class="n">b</span> <span class="o">=</span> <span class="n">HarmonicBond</span><span class="p">(</span><span class="n">k</span><span class="o">=</span><span class="n">t</span><span class="o">.</span><span class="n">k</span><span class="p">,</span> <span class="n">r0</span><span class="o">=</span><span class="n">t</span><span class="o">.</span><span class="n">req</span><span class="p">,</span>
+                                <span class="n">resolution</span><span class="o">=</span><span class="mf">0.02</span><span class="o">*</span><span class="n">width</span><span class="p">,</span>
+                                <span class="n">range_</span><span class="o">=</span><span class="p">[</span><span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">req</span><span class="o">-</span><span class="mi">5</span><span class="o">*</span><span class="n">width</span><span class="p">),</span> <span class="n">t</span><span class="o">.</span><span class="n">req</span><span class="o">+</span><span class="mi">5</span><span class="o">*</span><span class="n">width</span><span class="p">])</span>
+                <span class="n">bond_t_d</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">b</span>
+            <span class="k">return</span> <span class="n">bond_t_d</span><span class="p">[</span><span class="n">t</span><span class="p">]</span>
+        
+        <span class="c1"># Add atoms to model</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Importing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span><span class="si">}</span><span class="s1"> atoms from ParmEd&#39;</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span><span class="o">.</span><span class="n">atoms</span><span class="p">):</span>
+            <span class="k">assert</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">idx</span> <span class="o">==</span> <span class="n">i</span><span class="p">)</span>
+            <span class="n">_add_atom</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
+        
+        <span class="c1"># Add bonds to model</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Importing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span><span class="o">.</span><span class="n">bonds</span><span class="p">)</span><span class="si">}</span><span class="s1"> bonds from ParmEd&#39;</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">b0</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span><span class="o">.</span><span class="n">bonds</span><span class="p">:</span>
+            <span class="n">t</span> <span class="o">=</span> <span class="n">_get_bond_type</span><span class="p">(</span><span class="n">b0</span><span class="p">)</span>
+            <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="p">[</span><span class="n">atoms_d</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="p">(</span><span class="n">b0</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">b0</span><span class="o">.</span><span class="n">atom2</span><span class="p">)]</span>
+            <span class="n">seg</span> <span class="o">=</span> <span class="n">a1</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span>
+            <span class="n">seg</span><span class="o">.</span><span class="n">add_bond</span><span class="p">(</span><span class="n">a1</span><span class="p">,</span> <span class="n">a2</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">parmed_structure</span><span class="o">.</span><span class="n">nrexcl</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">)</span>
+        
+        <span class="c1"># Add the segment group to the model</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">allsegs</span><span class="p">)</span>
+        
+        <span class="c1"># Store mapping from ParmEd atoms to ARBD atoms</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">atoms_map</span> <span class="o">=</span> <span class="n">atoms_d</span>
+        
+        <span class="k">return</span> <span class="bp">self</span>
+    
+<div class="viewcode-block" id="ParmedArbd.simulate">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.simulate">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">simulate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">output_directory</span><span class="o">=</span><span class="s1">&#39;output&#39;</span><span class="p">,</span> <span class="n">log_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                <span class="n">directory</span><span class="o">=</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="n">binary</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">num_procs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dry_run</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Run simulation with the ARBD model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            output_name: Base name for output files</span>
+<span class="sd">            output_directory: Directory for output files</span>
+<span class="sd">            log_file: File for logging</span>
+<span class="sd">            directory: Working directory</span>
+<span class="sd">            binary: Path to simulation binary</span>
+<span class="sd">            num_procs: Number of processors to use</span>
+<span class="sd">            dry_run: If True, don&#39;t actually run</span>
+<span class="sd">            **conf_params: Additional configuration parameters</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Result of the simulation</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="kn">from</span><span class="w"> </span><span class="nn">.engine</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArbdEngine</span>
+        
+        <span class="n">engine</span> <span class="o">=</span> <span class="n">ArbdEngine</span><span class="p">(</span><span class="n">timestep</span><span class="o">=</span><span class="n">conf_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;timestep&#39;</span><span class="p">,</span> <span class="mf">1e-6</span><span class="p">))</span>
+        
+        <span class="k">return</span> <span class="n">engine</span><span class="o">.</span><span class="n">simulate</span><span class="p">(</span>
+            <span class="bp">self</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> 
+            <span class="n">output_directory</span><span class="o">=</span><span class="n">output_directory</span><span class="p">,</span>
+            <span class="n">directory</span><span class="o">=</span><span class="n">directory</span><span class="p">,</span>
+            <span class="n">log_file</span><span class="o">=</span><span class="n">log_file</span><span class="p">,</span>
+            <span class="n">binary</span><span class="o">=</span><span class="n">binary</span><span class="p">,</span>
+            <span class="n">num_procs</span><span class="o">=</span><span class="n">num_procs</span><span class="p">,</span>
+            <span class="n">dry_run</span><span class="o">=</span><span class="n">dry_run</span><span class="p">,</span>
+            <span class="o">**</span><span class="n">conf_params</span>
+        <span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="ParmedArbd.create_dual_topology_model">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model">[docs]</a>
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">create_dual_topology_model</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">u1</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">u2</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a dual topology ARBD model from two ParmEd structures.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            p1: First ParmEd structure</span>
+<span class="sd">            p2: Second ParmEd structure</span>
+<span class="sd">            u1: Optional MDAnalysis universe for p1</span>
+<span class="sd">            u2: Optional MDAnalysis universe for p2</span>
+<span class="sd">            **kwargs: Additional arguments for ParmedArbd</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            ParmedArbd model with dual topology</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Create the dual topology</span>
+        <span class="n">dual_structure</span><span class="p">,</span> <span class="n">pairs</span><span class="p">,</span> <span class="n">bp_pairs</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">create_dual_topology</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">u1</span><span class="p">,</span> <span class="n">u2</span><span class="p">)</span>
+        
+        <span class="c1"># Create ParmedArbd model with the dual structure</span>
+        <span class="n">model</span> <span class="o">=</span> <span class="bp">cls</span><span class="p">(</span><span class="n">parmed_structure</span><span class="o">=</span><span class="n">dual_structure</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+        
+        <span class="c1"># Store the extra bond information for use in simulation</span>
+        <span class="n">model</span><span class="o">.</span><span class="n">dual_topology_pairs</span> <span class="o">=</span> <span class="n">pairs</span>
+        <span class="n">model</span><span class="o">.</span><span class="n">bp_pairs</span> <span class="o">=</span> <span class="n">bp_pairs</span>
+        
+        <span class="k">return</span> <span class="n">model</span></div>
+
+
+<div class="viewcode-block" id="ParmedArbd.write_restraint_files">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.write_restraint_files">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_restraint_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fep_file</span><span class="o">=</span><span class="s1">&#39;dual.fep.exb&#39;</span><span class="p">,</span> <span class="n">min_fep_file</span><span class="o">=</span><span class="s1">&#39;dual.min.fep.exb&#39;</span><span class="p">,</span> 
+                            <span class="n">bp_file</span><span class="o">=</span><span class="s1">&#39;dual.bp.exb&#39;</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Write restraint files for dual topology simulations.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            fep_file: Output file for FEP restraints</span>
+<span class="sd">            min_fep_file: Output file for minimization FEP restraints</span>
+<span class="sd">            bp_file: Output file for base pair restraints</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;dual_topology_pairs&#39;</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;This model doesn&#39;t have dual topology information. &quot;</span>
+                                <span class="s2">&quot;Use create_dual_topology_model to create one.&quot;</span><span class="p">)</span>
+        
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">fep_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">min_fep_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh2</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">r0</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dual_topology_pairs</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;bond </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s1"> 1 </span><span class="si">{</span><span class="n">r0</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+                    <span class="n">fh2</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;bond </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s1"> 100 </span><span class="si">{</span><span class="n">r0</span><span class="si">}</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+        
+        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;bp_pairs&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">bp_pairs</span><span class="p">:</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">bp_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fh</span><span class="p">:</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">bp_pairs</span><span class="p">:</span>
+                    <span class="n">fh</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;bond </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s1"> 1 2.8</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ParmedArbd.convert_sod_to_mg">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg">[docs]</a>
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">convert_sod_to_mg</span><span class="p">(</span><span class="n">structure</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Convert sodium ions to magnesium ions in a structure.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure: ParmEd structure to modify</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Modified structure</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">structure</span><span class="p">:</span>
+            <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">residue</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;WAT&#39;</span><span class="p">:</span>
+                <span class="k">break</span>
+            <span class="k">elif</span> <span class="n">a</span><span class="o">.</span><span class="n">residue</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s1">&#39;Na+&#39;</span><span class="p">:</span>
+                <span class="k">continue</span>
+            
+            <span class="c1"># Find appropriate magnesium atom type</span>
+            <span class="k">try</span><span class="p">:</span>
+                <span class="n">mg_type</span> <span class="o">=</span> <span class="n">structure</span><span class="o">.</span><span class="n">atom_types</span><span class="p">[</span><span class="s1">&#39;Mg2+&#39;</span><span class="p">]</span>
+            <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+                <span class="c1"># If Mg2+ atom type doesn&#39;t exist, create it based on Na+ properties</span>
+                <span class="n">na_type</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">atom_type</span>
+                <span class="n">mg_type</span> <span class="o">=</span> <span class="n">parmed</span><span class="o">.</span><span class="n">AtomType</span><span class="p">(</span><span class="s1">&#39;Mg2+&#39;</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mf">24.305</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">)</span>
+                <span class="n">mg_type</span><span class="o">.</span><span class="n">epsilon</span> <span class="o">=</span> <span class="n">na_type</span><span class="o">.</span><span class="n">epsilon</span>
+                <span class="n">mg_type</span><span class="o">.</span><span class="n">rmin</span> <span class="o">=</span> <span class="n">na_type</span><span class="o">.</span><span class="n">rmin</span>
+                <span class="n">mg_type</span><span class="o">.</span><span class="n">epsilon_14</span> <span class="o">=</span> <span class="n">na_type</span><span class="o">.</span><span class="n">epsilon_14</span>
+                <span class="n">mg_type</span><span class="o">.</span><span class="n">rmin_14</span> <span class="o">=</span> <span class="n">na_type</span><span class="o">.</span><span class="n">rmin_14</span>
+                <span class="n">structure</span><span class="o">.</span><span class="n">atom_types</span><span class="p">[</span><span class="n">mg_type</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">mg_type</span>
+            
+            <span class="c1"># Update atom properties to magnesium</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">atom_type</span> <span class="o">=</span> <span class="n">mg_type</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">residue</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;Mg2+&#39;</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;Mg2+&#39;</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="s1">&#39;Mg2+&#39;</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">atomic_number</span> <span class="o">=</span> <span class="mi">12</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">_charge</span> <span class="o">=</span> <span class="mi">2</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">charge</span> <span class="o">=</span> <span class="mi">2</span>
+            <span class="n">a</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="mf">24.305</span>
+        
+        <span class="k">return</span> <span class="n">structure</span></div>
+
+    
+<div class="viewcode-block" id="ParmedArbd.create_dual_topology">
+<a class="viewcode-back" href="../../api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology">[docs]</a>
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">create_dual_topology</span><span class="p">(</span><span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">,</span> <span class="n">u1</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">u2</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a dual topology structure from two ParmEd structures.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            p1: First ParmEd structure</span>
+<span class="sd">            p2: Second ParmEd structure</span>
+<span class="sd">            u1: Optional MDAnalysis universe for p1</span>
+<span class="sd">            u2: Optional MDAnalysis universe for p2</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Tuple of (combined structure, restraint pairs, base pair bonds)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Ensure structures have same number of residues</span>
+        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">residues</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">p2</span><span class="o">.</span><span class="n">residues</span><span class="p">)</span>
+        
+        <span class="c1"># Check index alignment</span>
+        <span class="n">i</span> <span class="o">=</span> <span class="n">p1</span><span class="o">.</span><span class="n">residues</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span>
+        <span class="k">assert</span> <span class="n">i</span> <span class="o">==</span> <span class="n">p2</span><span class="o">.</span><span class="n">residues</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span>
+        
+        <span class="c1"># Verify compatibility</span>
+        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">p2</span><span class="o">.</span><span class="n">urey_bradleys</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
+        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">p2</span><span class="o">.</span><span class="n">cmaps</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
+        
+        <span class="c1"># Create new empty structure with same parameters as p1</span>
+        <span class="n">new</span> <span class="o">=</span> <span class="n">p1</span><span class="p">[:</span><span class="mi">0</span><span class="p">]</span>
+        
+        <span class="c1"># Mapping dictionaries</span>
+        <span class="n">p2_to_p1</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        <span class="n">u_p2_to_new</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
+        
+        <span class="c1"># Create maps for bonded terms</span>
+        <span class="n">bond_map</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="p">:</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">atoms</span><span class="p">}</span>
+        <span class="n">angle_map</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="p">:</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">atoms</span><span class="p">}</span>
+        <span class="n">dihed_map</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="p">:</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">atoms</span><span class="p">}</span>
+        <span class="n">improper_map</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="p">:</span> <span class="p">[]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">atoms</span><span class="p">}</span>
+        
+        <span class="c1"># Populate bonded term maps</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">bonds</span><span class="p">:</span>
+            <span class="n">bond_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
+            <span class="n">bond_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">angles</span><span class="p">:</span>
+            <span class="n">angle_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
+            <span class="n">angle_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
+            <span class="n">angle_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom3</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">dihedrals</span><span class="p">:</span>
+            <span class="n">dihed_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
+            <span class="n">dihed_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
+            <span class="n">dihed_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom3</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
+            <span class="n">dihed_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom4</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
+        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">p2</span><span class="o">.</span><span class="n">impropers</span><span class="p">:</span>
+            <span class="n">improper_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
+            <span class="n">improper_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
+            <span class="n">improper_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom3</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
+            <span class="n">improper_map</span><span class="p">[</span><span class="n">b</span><span class="o">.</span><span class="n">atom4</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">b</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>
+        
+        <span class="n">pairs</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="c1"># Process each segment of p1</span>
+        <span class="n">last_p1_i</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="n">first_p1_atom</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>  <span class="c1"># keys are segids</span>
+        <span class="n">first_new_atom</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>  <span class="c1"># keys are segids</span>
+        <span class="n">last_p1_new_atom</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>  <span class="c1"># keys are segids</span>
+        <span class="n">processed_segments</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+        
+        <span class="c1"># First pass: Add all atoms from p1 and unique atoms from p2</span>
+        <span class="k">for</span> <span class="n">res1</span><span class="p">,</span> <span class="n">res2</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">residues</span><span class="p">,</span> <span class="n">p2</span><span class="o">.</span><span class="n">residues</span><span class="p">):</span>
+            <span class="n">seg</span> <span class="o">=</span> <span class="n">res1</span><span class="o">.</span><span class="n">segid</span>
+            <span class="k">assert</span> <span class="n">seg</span> <span class="o">==</span> <span class="n">res2</span><span class="o">.</span><span class="n">segid</span>
+            
+            <span class="c1"># Add complete segment from p1 to new molecule if not already processed</span>
+            <span class="k">if</span> <span class="n">seg</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">processed_segments</span><span class="p">:</span>
+                <span class="n">_next</span> <span class="o">=</span> <span class="p">[</span><span class="n">r</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">p1</span><span class="o">.</span><span class="n">residues</span> <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">segid</span> <span class="o">==</span> <span class="n">seg</span><span class="p">][</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+                <span class="n">first_p1_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">=</span> <span class="n">last_p1_i</span>
+                <span class="n">first_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">new</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span>
+                <span class="n">new</span> <span class="o">=</span> <span class="n">new</span> <span class="o">+</span> <span class="n">p1</span><span class="p">[</span><span class="n">last_p1_i</span><span class="p">:</span><span class="n">_next</span><span class="p">]</span>
+                <span class="n">last_p1_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">new</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span>
+                <span class="n">last_p1_i</span> <span class="o">=</span> <span class="n">_next</span>
+                <span class="n">processed_segments</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">seg</span><span class="p">)</span>
+            
+            <span class="c1"># If residue is different in p1 and p2, add unique atoms from p2</span>
+            <span class="k">if</span> <span class="n">res1</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">res2</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+                <span class="c1"># Perform distance search to match atoms</span>
+                <span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">p1</span><span class="o">.</span><span class="n">coordinates</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">])</span>
+                <span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">p2</span><span class="o">.</span><span class="n">coordinates</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">])</span>
+                <span class="n">dists</span> <span class="o">=</span> <span class="n">distance_matrix</span><span class="p">(</span><span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">)</span>
+                
+                <span class="n">common_ids_j</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+                <span class="n">common_atoms_j</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+                
+                <span class="c1"># Find common atoms based on name, type, and charge</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">dists</span> <span class="o">&lt;</span> <span class="mf">0.1</span><span class="p">)):</span>
+                    <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
+                    <span class="n">p2_to_p1</span><span class="p">[</span><span class="n">a2</span><span class="p">]</span> <span class="o">=</span> <span class="n">a1</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                        <span class="k">continue</span>  <span class="c1"># Handle hydrogens separately</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">charge</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">charge</span><span class="p">):</span>
+                        <span class="n">common_ids_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
+                        <span class="n">common_atoms_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">a2</span><span class="p">)</span>
+                
+                <span class="c1"># Handle hydrogen atoms</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">dists</span> <span class="o">&lt;</span> <span class="mf">0.1</span><span class="p">)):</span>
+                    <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                        <span class="k">continue</span>  <span class="c1"># Only consider hydrogens</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">charge</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">charge</span><span class="p">):</span>
+                        <span class="c1"># Check that parent atoms of hydrogens are already considered common</span>
+                        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">bonds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">a2</span><span class="o">.</span><span class="n">bonds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
+                        <span class="n">b1</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">a1</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom2</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="n">a1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+                        <span class="n">b2</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="p">(</span><span class="n">a2</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">a2</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom2</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="n">a2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+                        <span class="k">if</span> <span class="n">b2</span> <span class="ow">in</span> <span class="n">common_atoms_j</span><span class="p">:</span>
+                            <span class="n">common_ids_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
+                            <span class="n">common_atoms_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">a2</span><span class="p">)</span>
+                
+                <span class="c1"># Special handling for H2&#39; atoms (fix for topology issues)</span>
+                <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">):</span>
+                    <span class="n">a1</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+                    <span class="n">j</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span><span class="p">)</span>
+                    <span class="k">if</span> <span class="n">a2</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">p2_to_p1</span><span class="p">:</span>
+                        <span class="n">p2_to_p1</span><span class="p">[</span><span class="n">a2</span><span class="p">]</span> <span class="o">=</span> <span class="n">a1</span>
+                        <span class="n">common_ids_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
+                        <span class="n">common_atoms_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">a2</span><span class="p">)</span>
+                
+                <span class="c1"># Find unique atoms in res2</span>
+                <span class="n">unique_atoms_j</span> <span class="o">=</span> <span class="p">[</span>
+                    <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">))</span>
+                    <span class="k">if</span> <span class="n">j</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">common_ids_j</span>
+                <span class="p">]</span>
+                <span class="n">unique_ids_j</span> <span class="o">=</span> <span class="p">[</span><span class="n">a2</span><span class="o">.</span><span class="n">idx</span> <span class="k">for</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">unique_atoms_j</span><span class="p">]</span>
+                
+                <span class="c1"># Add unique atoms from res2 to new structure</span>
+                <span class="k">if</span> <span class="n">unique_ids_j</span><span class="p">:</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Adding </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">unique_ids_j</span><span class="p">)</span><span class="si">}</span><span class="s1"> unique atoms from residue </span><span class="si">{</span><span class="n">res2</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                    <span class="n">new</span> <span class="o">=</span> <span class="n">new</span> <span class="o">+</span> <span class="n">p2</span><span class="p">[</span><span class="n">unique_ids_j</span><span class="p">]</span>
+        
+        <span class="c1"># Second pass: Add bonded terms and set up dual topology information</span>
+        <span class="n">current_seg</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="n">current_new_atom</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">for</span> <span class="n">res1</span><span class="p">,</span> <span class="n">res2</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">p1</span><span class="o">.</span><span class="n">residues</span><span class="p">,</span> <span class="n">p2</span><span class="o">.</span><span class="n">residues</span><span class="p">):</span>
+            <span class="n">seg</span> <span class="o">=</span> <span class="n">res1</span><span class="o">.</span><span class="n">segid</span>
+            <span class="k">assert</span> <span class="n">seg</span> <span class="o">==</span> <span class="n">res2</span><span class="o">.</span><span class="n">segid</span>
+            
+            <span class="k">if</span> <span class="n">current_seg</span> <span class="o">!=</span> <span class="n">seg</span><span class="p">:</span>
+                <span class="n">current_seg</span> <span class="o">=</span> <span class="n">seg</span>
+                <span class="n">current_new_atom</span> <span class="o">=</span> <span class="n">last_p1_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span>
+                <span class="n">p1_to_new_di</span> <span class="o">=</span> <span class="n">first_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">-</span> <span class="n">first_p1_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span>
+            
+            <span class="k">if</span> <span class="n">res1</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">res2</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+                <span class="c1"># Perform distance search to match atoms</span>
+                <span class="n">c1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">p1</span><span class="o">.</span><span class="n">coordinates</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">])</span>
+                <span class="n">c2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">p2</span><span class="o">.</span><span class="n">coordinates</span><span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">idx</span><span class="p">]</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">])</span>
+                <span class="n">dists</span> <span class="o">=</span> <span class="n">distance_matrix</span><span class="p">(</span><span class="n">c1</span><span class="p">,</span> <span class="n">c2</span><span class="p">)</span>
+                
+                <span class="n">common_ids_i</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+                <span class="n">common_ids_j</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+                <span class="n">common_atoms_j</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+                
+                <span class="c1"># Find common atoms</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">dists</span> <span class="o">&lt;</span> <span class="mf">0.1</span><span class="p">)):</span>
+                    <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
+                    <span class="n">p2_to_p1</span><span class="p">[</span><span class="n">a2</span><span class="p">]</span> <span class="o">=</span> <span class="n">a1</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                        <span class="k">continue</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">charge</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">charge</span><span class="p">):</span>
+                        <span class="n">common_ids_i</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
+                        <span class="n">common_ids_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
+                        <span class="n">common_atoms_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">a2</span><span class="p">)</span>
+                
+                <span class="c1"># Handle hydrogen atoms</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">dists</span> <span class="o">&lt;</span> <span class="mf">0.1</span><span class="p">)):</span>
+                    <span class="n">a1</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                        <span class="k">continue</span>
+                    <span class="k">if</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">type</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">charge</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">charge</span><span class="p">):</span>
+                        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">bonds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">a2</span><span class="o">.</span><span class="n">bonds</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
+                        <span class="n">b1</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="p">(</span><span class="n">a1</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">a1</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom2</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="n">a1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+                        <span class="n">b2</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="p">(</span><span class="n">a2</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">a2</span><span class="o">.</span><span class="n">bonds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">atom2</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span> <span class="o">!=</span> <span class="n">a2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+                        <span class="k">if</span> <span class="n">b2</span> <span class="ow">in</span> <span class="n">common_atoms_j</span><span class="p">:</span>
+                            <span class="n">common_ids_i</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
+                            <span class="n">common_ids_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
+                            <span class="n">common_atoms_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">a2</span><span class="p">)</span>
+                
+                <span class="c1"># Special handling for H2&#39; atoms</span>
+                <span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">any</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">):</span>
+                    <span class="n">i</span><span class="p">,</span> <span class="n">a1</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span><span class="p">)</span>
+                    <span class="n">j</span><span class="p">,</span> <span class="n">a2</span> <span class="o">=</span> <span class="nb">next</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">)</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;H2&#39;&quot;</span><span class="p">)</span>
+                    <span class="k">if</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">p2_to_p1</span><span class="p">:</span>
+                        <span class="k">assert</span> <span class="n">p2_to_p1</span><span class="p">[</span><span class="n">a2</span><span class="p">]</span> <span class="o">==</span> <span class="n">a1</span>
+                    <span class="n">p2_to_p1</span><span class="p">[</span><span class="n">a2</span><span class="p">]</span> <span class="o">=</span> <span class="n">a1</span>
+                    <span class="n">common_ids_i</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
+                    <span class="n">common_ids_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
+                    <span class="n">common_atoms_j</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">a2</span><span class="p">)</span>
+                
+                <span class="c1"># Get unique atoms in res2</span>
+                <span class="n">unique_atoms_j</span> <span class="o">=</span> <span class="p">[</span>
+                    <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">))</span>
+                    <span class="k">if</span> <span class="n">j</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">common_ids_j</span>
+                <span class="p">]</span>
+                <span class="n">unique_ids_j</span> <span class="o">=</span> <span class="p">[</span><span class="n">a2</span><span class="o">.</span><span class="n">idx</span> <span class="k">for</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">unique_atoms_j</span><span class="p">]</span>
+                
+                <span class="c1"># Find mapping of unique atoms from res2 to new structure</span>
+                <span class="n">_num_new</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">unique_ids_j</span><span class="p">)</span>
+                <span class="n">_tmp</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="o">.</span><span class="n">name</span><span class="p">:</span> <span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">new</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">current_new_atom</span><span class="p">:</span><span class="n">current_new_atom</span> <span class="o">+</span> <span class="n">_num_new</span><span class="p">]}</span>
+                <span class="n">current_new_atom</span> <span class="o">+=</span> <span class="n">_num_new</span>
+                <span class="n">u_p2_to_new</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">a2</span><span class="p">:</span> <span class="n">_tmp</span><span class="p">[</span><span class="n">a2</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="k">for</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">unique_atoms_j</span><span class="p">})</span>
+                
+                <span class="c1"># Find pairs of dual-topology atoms for restraints, excluding hydrogens</span>
+                <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">c1</span><span class="p">)):</span>
+                    <span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">common_ids_i</span> <span class="ow">or</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                        <span class="n">dists</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="p">:]</span> <span class="o">+=</span> <span class="mi">100</span>  <span class="c1"># Exclude from pairing</span>
+                
+                <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">c2</span><span class="p">)):</span>
+                    <span class="k">if</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">common_ids_j</span> <span class="ow">or</span> <span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                        <span class="n">dists</span><span class="p">[:,</span> <span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">100</span>  <span class="c1"># Exclude from pairing</span>
+                
+                <span class="c1"># Create restraint pairs</span>
+                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">c1</span><span class="p">)</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">c2</span><span class="p">):</span>
+                    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a1</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">):</span>
+                        <span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">common_ids_i</span> <span class="ow">or</span> <span class="n">a1</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                            <span class="k">continue</span>
+                        <span class="n">j</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmin</span><span class="p">(</span><span class="n">dists</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
+                        <span class="n">pairs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">p1_to_new_di</span> <span class="o">+</span> <span class="n">a1</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span> <span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span> <span class="n">dists</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]))</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="k">for</span> <span class="n">j</span><span class="p">,</span> <span class="n">a2</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">res2</span><span class="o">.</span><span class="n">atoms</span><span class="p">):</span>
+                        <span class="k">if</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">common_ids_j</span> <span class="ow">or</span> <span class="n">a2</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;H&#39;</span><span class="p">:</span>
+                            <span class="k">continue</span>
+                        <span class="n">i</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmin</span><span class="p">(</span><span class="n">dists</span><span class="p">[:,</span> <span class="n">j</span><span class="p">])</span>
+                        <span class="n">pairs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">p1_to_new_di</span> <span class="o">+</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span> <span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">a2</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span><span class="p">,</span> <span class="n">dists</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]))</span>
+                
+                <span class="c1"># Set beta factor for FEP atoms</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">new</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">p1_to_new_di</span> <span class="o">+</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span><span class="p">:</span><span class="n">p1_to_new_di</span> <span class="o">+</span> <span class="n">res1</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]):</span>
+                    <span class="k">if</span> <span class="n">i</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">common_ids_i</span><span class="p">:</span>
+                        <span class="n">a</span><span class="o">.</span><span class="n">bfactor</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span>
+                
+                <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">u_p2_to_new</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                    <span class="n">a</span><span class="o">.</span><span class="n">bfactor</span> <span class="o">=</span> <span class="mf">1.0</span>
+                
+                <span class="c1"># Add bonded potentials from p2 that include unique atoms</span>
+                <span class="n">processed</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>  <span class="c1"># avoid duplicate entries</span>
+                <span class="k">for</span> <span class="n">a2</span> <span class="ow">in</span> <span class="n">unique_atoms_j</span><span class="p">:</span>
+                    <span class="k">for</span> <span class="n">pot_map</span> <span class="ow">in</span> <span class="p">(</span><span class="n">bond_map</span><span class="p">,</span> <span class="n">angle_map</span><span class="p">,</span> <span class="n">dihed_map</span><span class="p">,</span> <span class="n">improper_map</span><span class="p">):</span>
+                        <span class="k">for</span> <span class="n">b</span><span class="p">,</span> <span class="n">rank</span> <span class="ow">in</span> <span class="n">pot_map</span><span class="p">[</span><span class="n">a2</span><span class="p">]:</span>
+                            <span class="c1"># Avoid double-counting</span>
+                            <span class="k">if</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">processed</span><span class="p">:</span>
+                                <span class="k">continue</span>
+                            <span class="n">processed</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
+                            
+                            <span class="c1"># Get atoms involved in the potential</span>
+                            <span class="k">if</span> <span class="n">pot_map</span> <span class="o">==</span> <span class="n">bond_map</span><span class="p">:</span>
+                                <span class="n">atoms</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">)</span>
+                                <span class="n">gen_pot</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">new_atoms</span><span class="p">:</span> <span class="n">parmed</span><span class="o">.</span><span class="n">Bond</span><span class="p">(</span><span class="o">*</span><span class="n">new_atoms</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
+                                <span class="n">pot_list</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">bonds</span>
+                            <span class="k">elif</span> <span class="n">pot_map</span> <span class="o">==</span> <span class="n">angle_map</span><span class="p">:</span>
+                                <span class="n">atoms</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom3</span><span class="p">)</span>
+                                <span class="n">gen_pot</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">new_atoms</span><span class="p">:</span> <span class="n">parmed</span><span class="o">.</span><span class="n">Angle</span><span class="p">(</span><span class="o">*</span><span class="n">new_atoms</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
+                                <span class="n">pot_list</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">angles</span>
+                            <span class="k">elif</span> <span class="n">pot_map</span> <span class="o">==</span> <span class="n">dihed_map</span><span class="p">:</span>
+                                <span class="n">atoms</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom3</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom4</span><span class="p">)</span>
+                                <span class="n">gen_pot</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">new_atoms</span><span class="p">:</span> <span class="n">parmed</span><span class="o">.</span><span class="n">Dihedral</span><span class="p">(</span><span class="o">*</span><span class="n">new_atoms</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">improper</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">improper</span><span class="p">)</span>
+                                <span class="n">pot_list</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">dihedrals</span>
+                            <span class="k">elif</span> <span class="n">pot_map</span> <span class="o">==</span> <span class="n">improper_map</span><span class="p">:</span>
+                                <span class="n">atoms</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">.</span><span class="n">atom1</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom2</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom3</span><span class="p">,</span> <span class="n">b</span><span class="o">.</span><span class="n">atom4</span><span class="p">)</span>
+                                <span class="n">gen_pot</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">new_atoms</span><span class="p">:</span> <span class="n">parmed</span><span class="o">.</span><span class="n">Improper</span><span class="p">(</span><span class="o">*</span><span class="n">new_atoms</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">b</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
+                                <span class="n">pot_list</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">impropers</span>
+                            <span class="k">else</span><span class="p">:</span>
+                                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Unknown potential map&quot;</span><span class="p">)</span>
+                            
+                            <span class="c1"># Skip if no atoms in bond are unique atoms</span>
+                            <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">a</span> <span class="ow">in</span> <span class="n">unique_atoms_j</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">atoms</span><span class="p">):</span>
+                                <span class="k">continue</span>
+                            
+                            <span class="c1"># Find corresponding atoms in new structure</span>
+                            <span class="n">new_atoms</span> <span class="o">=</span> <span class="p">[]</span>
+                            <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">atoms</span><span class="p">:</span>
+                                <span class="k">if</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">unique_atoms_j</span><span class="p">:</span>
+                                    <span class="n">new_atoms</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">a</span><span class="p">])</span>
+                                <span class="k">else</span><span class="p">:</span>
+                                    <span class="n">new_atoms</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="n">p1_to_new_di</span> <span class="o">+</span> <span class="n">p2_to_p1</span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span><span class="p">])</span>
+                            
+                            <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">a</span> <span class="ow">in</span> <span class="n">new</span><span class="o">.</span><span class="n">atoms</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">new_atoms</span><span class="p">)</span>
+                            
+                            <span class="c1"># Add potential to new structure</span>
+                            <span class="n">pot_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">gen_pot</span><span class="p">(</span><span class="n">new_atoms</span><span class="p">))</span>
+        
+        <span class="c1"># Handle base-pair information if MDAnalysis universes are provided</span>
+        <span class="n">bp_pairs</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">if</span> <span class="n">u1</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">u2</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">bp_pairs</span> <span class="o">=</span> <span class="p">[]</span>
+            
+            <span class="c1"># Function to find base pairs in a nucleic acid structure</span>
+            <span class="k">def</span><span class="w"> </span><span class="nf">find_bp</span><span class="p">(</span><span class="n">u</span><span class="p">):</span>
+                <span class="c1"># Find segment termini</span>
+                <span class="n">seg_ends</span> <span class="o">=</span> <span class="p">[</span><span class="n">a</span><span class="o">.</span><span class="n">position</span> <span class="k">for</span> <span class="n">seg</span> <span class="ow">in</span> <span class="n">u</span><span class="o">.</span><span class="n">segments</span>
+                           <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="p">[</span><span class="n">seg</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">seg</span><span class="o">.</span><span class="n">atoms</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]]</span>
+                <span class="n">seg_ends</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">seg_ends</span><span class="p">)</span>
+                
+                <span class="n">dists</span> <span class="o">=</span> <span class="n">distance_matrix</span><span class="p">(</span><span class="n">seg_ends</span><span class="p">,</span> <span class="n">seg_ends</span><span class="p">)</span> <span class="o">+</span> <span class="mi">100</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">eye</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">seg_ends</span><span class="p">))</span>
+                
+                <span class="n">seg_end_map</span> <span class="o">=</span> <span class="p">{}</span>
+                <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">dists</span><span class="p">):</span>
+                    <span class="n">j</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmin</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
+                    <span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">seg_end_map</span><span class="p">:</span>
+                        <span class="k">assert</span> <span class="n">seg_end_map</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">j</span>
+                    <span class="n">seg_end_map</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span>
+                
+                <span class="n">bp</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">u</span><span class="o">.</span><span class="n">residues</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
+                <span class="n">processed</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+                
+                <span class="k">for</span> <span class="n">I</span><span class="p">,</span> <span class="n">J</span> <span class="ow">in</span> <span class="n">seg_end_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                    <span class="k">if</span> <span class="n">I</span> <span class="ow">in</span> <span class="n">processed</span><span class="p">:</span>
+                        <span class="k">continue</span>
+                    <span class="n">processed</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">I</span><span class="p">)</span>
+                    <span class="n">processed</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">J</span><span class="p">)</span>
+                    
+                    <span class="n">reses1</span><span class="p">,</span> <span class="n">reses2</span> <span class="o">=</span> <span class="p">[</span><span class="n">u</span><span class="o">.</span><span class="n">segments</span><span class="p">[</span><span class="n">K</span> <span class="o">//</span> <span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">residues</span><span class="p">[::</span><span class="mi">1</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">K</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)]</span> <span class="k">for</span> <span class="n">K</span> <span class="ow">in</span> <span class="p">(</span><span class="n">I</span><span class="p">,</span> <span class="n">J</span><span class="p">)]</span>
+                    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">r1</span><span class="p">,</span> <span class="n">r2</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">reses1</span><span class="p">,</span> <span class="n">reses2</span><span class="p">)):</span>
+                        <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">reses1</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span><span class="p">:</span>
+                            <span class="k">break</span>
+                        <span class="n">bp</span><span class="p">[</span><span class="n">r1</span><span class="o">.</span><span class="n">resindex</span><span class="p">]</span> <span class="o">=</span> <span class="n">r2</span><span class="o">.</span><span class="n">resindex</span>
+                        <span class="n">bp</span><span class="p">[</span><span class="n">r2</span><span class="o">.</span><span class="n">resindex</span><span class="p">]</span> <span class="o">=</span> <span class="n">r1</span><span class="o">.</span><span class="n">resindex</span>
+                
+                <span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">bp</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span>
+                <span class="k">return</span> <span class="n">bp</span>
+            
+            <span class="c1"># Find base pairs in both structures</span>
+            <span class="n">bp1</span><span class="p">,</span> <span class="n">bp2</span> <span class="o">=</span> <span class="p">[</span><span class="n">find_bp</span><span class="p">(</span><span class="n">u</span><span class="p">)</span> <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="p">(</span><span class="n">u1</span><span class="p">,</span> <span class="n">u2</span><span class="p">)]</span>
+            
+            <span class="c1"># Define atom pairs for base-pairing</span>
+            <span class="n">bp_bond_atoms</span> <span class="o">=</span> <span class="p">{</span>
+                <span class="s1">&#39;DA&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N1&#39;</span><span class="p">,</span> <span class="s1">&#39;N3&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;N6&#39;</span><span class="p">,</span> <span class="s1">&#39;O4&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;DT&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N3&#39;</span><span class="p">,</span> <span class="s1">&#39;N1&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;O4&#39;</span><span class="p">,</span> <span class="s1">&#39;N6&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;DC&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N3&#39;</span><span class="p">,</span> <span class="s1">&#39;N1&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;O2&#39;</span><span class="p">,</span> <span class="s1">&#39;N2&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;DG&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N1&#39;</span><span class="p">,</span> <span class="s1">&#39;N3&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;N2&#39;</span><span class="p">,</span> <span class="s1">&#39;O2&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N1&#39;</span><span class="p">,</span> <span class="s1">&#39;N3&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;N6&#39;</span><span class="p">,</span> <span class="s1">&#39;O4&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;T&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N3&#39;</span><span class="p">,</span> <span class="s1">&#39;N1&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;O4&#39;</span><span class="p">,</span> <span class="s1">&#39;N6&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;U&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N3&#39;</span><span class="p">,</span> <span class="s1">&#39;N1&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;O4&#39;</span><span class="p">,</span> <span class="s1">&#39;N6&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N3&#39;</span><span class="p">,</span> <span class="s1">&#39;N1&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;O2&#39;</span><span class="p">,</span> <span class="s1">&#39;N2&#39;</span><span class="p">)],</span>
+                <span class="s1">&#39;G&#39;</span><span class="p">:</span> <span class="p">[(</span><span class="s1">&#39;N1&#39;</span><span class="p">,</span> <span class="s1">&#39;N3&#39;</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;N2&#39;</span><span class="p">,</span> <span class="s1">&#39;O2&#39;</span><span class="p">)]</span>
+            <span class="p">}</span>
+            
+            <span class="c1"># Map residue names to keys in bp_bond_atoms</span>
+            <span class="n">resname_to_key</span> <span class="o">=</span> <span class="p">{}</span>
+            <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">bp_bond_atoms</span><span class="p">:</span>
+                <span class="n">resname_to_key</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
+                <span class="c1"># Handle modified bases</span>
+                <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;DA&#39;</span><span class="p">,</span> <span class="s1">&#39;DT&#39;</span><span class="p">,</span> <span class="s1">&#39;DC&#39;</span><span class="p">,</span> <span class="s1">&#39;DG&#39;</span><span class="p">):</span>
+                    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span>
+                        <span class="n">mod_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">key</span><span class="si">}{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
+                        <span class="n">resname_to_key</span><span class="p">[</span><span class="n">mod_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
+            
+            <span class="c1"># Create base pair bonds</span>
+            <span class="k">for</span> <span class="n">ra</span><span class="p">,</span> <span class="p">(</span><span class="n">r1b</span><span class="p">,</span> <span class="n">r2b</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">bp1</span><span class="p">,</span> <span class="n">bp2</span><span class="p">)):</span>
+                <span class="c1"># Ra pairs with r1b; r2a pairs with r2b</span>
+                <span class="n">R1a</span> <span class="o">=</span> <span class="n">p1</span><span class="o">.</span><span class="n">residues</span><span class="p">[</span><span class="n">ra</span><span class="p">]</span>
+                <span class="n">R2a</span> <span class="o">=</span> <span class="n">p2</span><span class="o">.</span><span class="n">residues</span><span class="p">[</span><span class="n">ra</span><span class="p">]</span>
+                <span class="n">R1b</span> <span class="o">=</span> <span class="n">p1</span><span class="o">.</span><span class="n">residues</span><span class="p">[</span><span class="n">r1b</span><span class="p">]</span> <span class="k">if</span> <span class="n">r1b</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">else</span> <span class="kc">None</span>
+                <span class="n">R2b</span> <span class="o">=</span> <span class="n">p2</span><span class="o">.</span><span class="n">residues</span><span class="p">[</span><span class="n">r2b</span><span class="p">]</span> <span class="k">if</span> <span class="n">r2b</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">else</span> <span class="kc">None</span>
+                
+                <span class="c1"># Add base pair bonds for structure 1</span>
+                <span class="k">if</span> <span class="n">R1b</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">ra</span> <span class="o">&lt;</span> <span class="n">r1b</span><span class="p">:</span>
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">res_key</span> <span class="o">=</span> <span class="n">resname_to_key</span><span class="p">[</span><span class="n">R1a</span><span class="o">.</span><span class="n">name</span><span class="p">]</span>
+                        <span class="k">for</span> <span class="n">n1</span><span class="p">,</span> <span class="n">n2</span> <span class="ow">in</span> <span class="n">bp_bond_atoms</span><span class="p">[</span><span class="n">res_key</span><span class="p">]:</span>
+                            <span class="n">a</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">R1a</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n1</span><span class="p">)</span>
+                            <span class="n">b</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">R1b</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n2</span><span class="p">)</span>
+                            
+                            <span class="c1"># Account for index offsets</span>
+                            <span class="n">seg</span> <span class="o">=</span> <span class="n">R1a</span><span class="o">.</span><span class="n">segid</span>
+                            <span class="n">ai</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">idx</span> <span class="o">+</span> <span class="n">first_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">-</span> <span class="n">first_p1_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span>
+                            <span class="n">seg</span> <span class="o">=</span> <span class="n">R1b</span><span class="o">.</span><span class="n">segid</span>
+                            <span class="n">bi</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="n">idx</span> <span class="o">+</span> <span class="n">first_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">-</span> <span class="n">first_p1_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span>
+                            <span class="n">bp_pairs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ai</span><span class="p">,</span> <span class="n">bi</span><span class="p">))</span>
+                    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+                        <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Residue </span><span class="si">{</span><span class="n">R1a</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> not found in base pair definitions&quot;</span><span class="p">)</span>
+                        <span class="k">continue</span>
+                
+                <span class="c1"># Add base pair bonds for structure 2 (if different)</span>
+                <span class="k">if</span> <span class="n">R2b</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">ra</span> <span class="o">&lt;</span> <span class="n">r2b</span><span class="p">:</span>
+                    <span class="c1"># Skip redundant base pairs</span>
+                    <span class="k">if</span> <span class="n">R1b</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">R1a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">R2a</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span> <span class="n">R1b</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">R2b</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+                        <span class="k">continue</span>
+                    
+                    <span class="k">try</span><span class="p">:</span>
+                        <span class="n">res_key</span> <span class="o">=</span> <span class="n">resname_to_key</span><span class="p">[</span><span class="n">R2a</span><span class="o">.</span><span class="n">name</span><span class="p">]</span>
+                        <span class="k">for</span> <span class="n">n1</span><span class="p">,</span> <span class="n">n2</span> <span class="ow">in</span> <span class="n">bp_bond_atoms</span><span class="p">[</span><span class="n">res_key</span><span class="p">]:</span>
+                            <span class="n">a</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">R2a</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n1</span><span class="p">)</span>
+                            <span class="n">b</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">R2b</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n2</span><span class="p">)</span>
+                            
+                            <span class="k">try</span><span class="p">:</span>
+                                <span class="n">ai</span> <span class="o">=</span> <span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span>
+                                <span class="k">assert</span> <span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n1</span>
+                            <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+                                <span class="n">seg</span> <span class="o">=</span> <span class="n">R1a</span><span class="o">.</span><span class="n">segid</span>
+                                <span class="n">a1</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">R1a</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n1</span><span class="p">)</span>
+                                <span class="n">ai</span> <span class="o">=</span> <span class="n">a1</span><span class="o">.</span><span class="n">idx</span> <span class="o">+</span> <span class="n">first_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">-</span> <span class="n">first_p1_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span>
+                            
+                            <span class="k">try</span><span class="p">:</span>
+                                <span class="n">bi</span> <span class="o">=</span> <span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">b</span><span class="p">]</span><span class="o">.</span><span class="n">idx</span>
+                                <span class="k">assert</span> <span class="n">u_p2_to_new</span><span class="p">[</span><span class="n">b</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n2</span>
+                            <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+                                <span class="n">seg</span> <span class="o">=</span> <span class="n">R1b</span><span class="o">.</span><span class="n">segid</span>
+                                <span class="n">b1</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">R1b</span><span class="o">.</span><span class="n">atoms</span> <span class="k">if</span> <span class="n">x</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">n2</span><span class="p">)</span>
+                                <span class="n">bi</span> <span class="o">=</span> <span class="n">b1</span><span class="o">.</span><span class="n">idx</span> <span class="o">+</span> <span class="n">first_new_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span> <span class="o">-</span> <span class="n">first_p1_atom</span><span class="p">[</span><span class="n">seg</span><span class="p">]</span>
+                            
+                            <span class="n">bp_pairs</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ai</span><span class="p">,</span> <span class="n">bi</span><span class="p">))</span>
+                    <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+                        <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Residue </span><span class="si">{</span><span class="n">R2a</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> not found in base pair definitions&quot;</span><span class="p">)</span>
+                        <span class="k">continue</span>
+        
+        <span class="k">return</span> <span class="n">new</span><span class="p">,</span> <span class="n">pairs</span><span class="p">,</span> <span class="n">bp_pairs</span></div>
+</div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/sali_polymer_model.html b/_build/html/_modules/arbdmodel/sali_polymer_model.html
new file mode 100644
index 0000000000000000000000000000000000000000..8ea3233d04d919f61e7fb0d79ae56dadcb61c012
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/sali_polymer_model.html
@@ -0,0 +1,564 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.sali_polymer_model &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/sali_polymer_model';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.sali_polymer_model</h1><div class="highlight"><pre>
+<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="c1">## Test with `python -m arbdmodel.hps_polymer_model`</span>
+
+<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
+
+
+<span class="c1">## Local imports</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">ParticleType</span><span class="p">,</span> <span class="n">PointParticle</span><span class="p">,</span> <span class="n">Group</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">get_resource_path</span>    
+<span class="kn">from</span><span class="w"> </span><span class="nn">.model</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArbdModel</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.polymer</span><span class="w"> </span><span class="kn">import</span> <span class="n">PolymerSection</span><span class="p">,</span> <span class="n">PolymerGroup</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.interactions</span><span class="w"> </span><span class="kn">import</span> <span class="n">AbstractPotential</span><span class="p">,</span> <span class="n">HarmonicBond</span><span class="p">,</span> <span class="n">HarmonicBondedPotential</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.coords</span><span class="w"> </span><span class="kn">import</span> <span class="n">quaternion_to_matrix</span>
+
+
+<span class="sd">&quot;&quot;&quot;Define particle types&quot;&quot;&quot;</span>
+<span class="n">type_</span> <span class="o">=</span> <span class="n">ParticleType</span><span class="p">(</span><span class="s2">&quot;AA&quot;</span><span class="p">,</span>
+                     <span class="c1"># units &quot;297.15 k K / (6 pi 0.92 mPa s 6 AA)&quot; &quot;AA**2/ns&quot;</span>
+                     <span class="n">diffusivity</span> <span class="o">=</span> <span class="mf">39.429314</span>
+<span class="p">)</span>
+
+<span class="c1">## Bonded potentials</span>
+<div class="viewcode-block" id="LinearBond">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.LinearBond">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">LinearBond</span><span class="p">(</span><span class="n">HarmonicBond</span><span class="p">):</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">r0</span><span class="p">,</span> <span class="n">rRange</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">50</span><span class="p">),</span> <span class="n">resolution</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">maxForce</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">max_potential</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="s2">&quot;potentials/&quot;</span><span class="p">):</span>
+        <span class="n">HarmonicBondedPotential</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">r0</span><span class="p">,</span> <span class="n">rRange</span><span class="p">,</span> <span class="n">resolution</span><span class="p">,</span> <span class="n">maxForce</span><span class="p">,</span> <span class="n">max_potential</span><span class="p">,</span> <span class="n">prefix</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">type_</span> <span class="o">=</span> <span class="s2">&quot;linearbond&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">kscale_</span> <span class="o">=</span> <span class="mf">1.0</span>
+
+<div class="viewcode-block" id="LinearBond.potential">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.LinearBond.potential">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">potential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dr</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">k</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">dr</span><span class="p">)</span></div>
+</div>
+
+
+<div class="viewcode-block" id="SaliNonbonded">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliNonbonded">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SaliNonbonded</span><span class="p">(</span><span class="n">AbstractPotential</span><span class="p">):</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resolution</span><span class="o">=</span><span class="mf">0.1</span><span class="p">):</span>
+        <span class="n">AbstractPotential</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resolution</span><span class="o">=</span><span class="n">resolution</span><span class="p">)</span>
+
+<div class="viewcode-block" id="SaliNonbonded.potential">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliNonbonded.potential">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">potential</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">r</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Constant force excluded volume &quot;&quot;&quot;</span>
+        <span class="n">force</span> <span class="o">=</span> <span class="mi">10</span>              <span class="c1"># kcal_mol/AA</span>
+        <span class="n">radius</span> <span class="o">=</span> <span class="mi">6</span>
+        
+        <span class="n">u</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
+        <span class="n">s</span> <span class="o">=</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">radius</span>
+        <span class="n">u</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">radius</span> <span class="o">-</span> <span class="n">r</span><span class="p">[</span><span class="n">s</span><span class="p">])</span> <span class="o">*</span> <span class="n">force</span>            
+        <span class="k">return</span> <span class="n">u</span></div>
+</div>
+
+
+<div class="viewcode-block" id="SaliBeadsFromPolymer">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliBeadsFromPolymer">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SaliBeadsFromPolymer</span><span class="p">(</span><span class="n">Group</span><span class="p">):</span>
+    <span class="c1"># p = PointParticle(_P, (0,0,0), &quot;P&quot;)</span>
+    <span class="c1"># b = PointParticle(_B, (3,0,1), &quot;B&quot;)</span>
+    <span class="c1"># nt = Group( name = &quot;nt&quot;, children = [p,b])</span>
+    <span class="c1"># nt.add_bond( i=p, j=b, bond = get_resource_path(&#39;two_bead_model/BPB.dat&#39;) )</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">polymer</span><span class="p">,</span> <span class="n">sequence</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+
+        <span class="k">if</span> <span class="n">sequence</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span>
+            <span class="c1"># ... set random sequence</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">polymer</span> <span class="o">=</span> <span class="n">polymer</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">sequence</span> <span class="o">=</span> <span class="n">sequence</span>
+
+        <span class="k">for</span> <span class="n">prop</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;segname&#39;</span><span class="p">,</span><span class="s1">&#39;chain&#39;</span><span class="p">):</span>
+            <span class="k">if</span> <span class="n">prop</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+                <span class="c1"># import pdb</span>
+                <span class="c1"># pdb.set_trace()</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">prop</span><span class="p">]</span> <span class="o">=</span> <span class="n">polymer</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">prop</span><span class="p">]</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="k">pass</span>
+
+        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sequence</span><span class="p">)</span> <span class="o">!=</span> <span class="n">polymer</span><span class="o">.</span><span class="n">num_monomers</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Length of sequence does not match length of polymer&quot;</span><span class="p">)</span>
+        <span class="n">Group</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_beads</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">polymer</span><span class="o">.</span><span class="n">num_monomers</span> <span class="o">/</span> <span class="mi">20</span><span class="p">))</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">_clear_beads</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="o">...</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_generate_beads</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="c1"># beads = self.children</span>
+        <span class="n">nb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">num_beads</span>
+        
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nb</span><span class="p">):</span>
+            <span class="c1"># c = self.polymer.monomer_index_to_contour(i)</span>
+            <span class="n">c</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">nb</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">nb</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="mf">0.5</span>
+            <span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">polymer</span><span class="o">.</span><span class="n">contour_to_position</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+
+            <span class="n">bead</span> <span class="o">=</span> <span class="n">PointParticle</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span>
+                                 <span class="n">resid</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">bead</span><span class="p">)</span>
+
+        <span class="c1">## Two consecutive nts </span>
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
+            <span class="n">b1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+            <span class="n">b2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span>
+<span class="w">            </span><span class="sd">&quot;&quot;&quot; units &quot;10 kJ/N_A&quot; kcal_mol &quot;&quot;&quot;</span>
+            <span class="n">bond</span> <span class="o">=</span> <span class="n">LinearBond</span><span class="p">(</span><span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span>
+                              <span class="n">r0</span> <span class="o">=</span> <span class="mi">18</span><span class="p">,</span>
+                              <span class="n">rRange</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">500</span><span class="p">),</span>
+                              <span class="n">resolution</span> <span class="o">=</span> <span class="mf">0.01</span><span class="p">,</span>
+                              <span class="n">maxForce</span> <span class="o">=</span> <span class="mi">30</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">add_bond</span><span class="p">(</span> <span class="n">i</span><span class="o">=</span><span class="n">b1</span><span class="p">,</span> <span class="n">j</span><span class="o">=</span><span class="n">b2</span><span class="p">,</span> <span class="n">bond</span> <span class="o">=</span> <span class="n">bond</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">True</span> <span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="SaliModel">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliModel">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SaliModel</span><span class="p">(</span><span class="n">ArbdModel</span><span class="p">):</span>
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">polymers</span><span class="p">,</span>
+                 <span class="n">sequences</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+                 <span class="n">debye_length</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
+                 <span class="n">damping_coefficient</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
+                 <span class="n">DEBUG</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; </span>
+<span class="sd">        [debye_length]: angstroms</span>
+<span class="sd">        [damping_coefficient]: ns</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+
+        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WARNING: diffusion coefficient arbitrarily set to 100 AA**2/ns in SaliModel&quot;</span><span class="p">)</span>
+        
+        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;timestep&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1047e-6</span>
+        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;cutoff&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">18</span>
+
+        <span class="k">if</span> <span class="s1">&#39;decompPeriod&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+            <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;decompPeriod&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1000</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Assign sequences &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">sequences</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">&quot;HpsModel must be provided a sequences argument&quot;</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">polymer_group</span> <span class="o">=</span> <span class="n">PolymerGroup</span><span class="p">(</span><span class="n">polymers</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">sequences</span> <span class="o">=</span> <span class="n">sequences</span>
+        <span class="n">ArbdModel</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+        <span class="c1"># &quot;&quot;&quot; Update type diffusion coefficients &quot;&quot;&quot;</span>
+        <span class="c1"># self.set_damping_coefficient( damping_coefficient )</span>
+
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Set up nonbonded interactions &quot;&quot;&quot;</span>
+        <span class="n">nonbonded</span> <span class="o">=</span> <span class="n">SaliNonbonded</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">useNonbondedScheme</span><span class="p">(</span> <span class="n">nonbonded</span><span class="p">,</span> <span class="n">typeA</span><span class="o">=</span><span class="n">type_</span><span class="p">,</span> <span class="n">typeB</span><span class="o">=</span><span class="n">type_</span> <span class="p">)</span>
+<span class="w">                </span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; Generate beads &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">generate_beads</span><span class="p">()</span>
+
+<div class="viewcode-block" id="SaliModel.update_splines">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliModel.update_splines">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">update_splines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">coords</span><span class="p">):</span>
+        <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
+        <span class="k">for</span> <span class="n">p</span><span class="p">,</span><span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">polymer_group</span><span class="o">.</span><span class="n">polymers</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">children</span><span class="p">):</span>
+            <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">children</span><span class="p">)</span>
+            <span class="n">p</span><span class="o">.</span><span class="n">set_splines</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">n</span><span class="p">),</span> <span class="n">coords</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="n">n</span><span class="p">])</span>
+            <span class="n">i</span> <span class="o">+=</span> <span class="n">n</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">clear_all</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">generate_beads</span><span class="p">()</span></div>
+
+        <span class="c1">## TODO Apply restraints, etc</span>
+
+<div class="viewcode-block" id="SaliModel.generate_beads">
+<a class="viewcode-back" href="../../api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliModel.generate_beads">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">generate_beads</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">peptides</span> <span class="o">=</span> <span class="p">[</span><span class="n">SaliBeadsFromPolymer</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
+                         <span class="k">for</span> <span class="n">p</span><span class="p">,</span><span class="n">s</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">polymer_group</span><span class="o">.</span><span class="n">polymers</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">sequences</span><span class="p">)]</span>
+
+        <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">peptides</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
+            <span class="n">s</span><span class="o">.</span><span class="n">_generate_beads</span><span class="p">()</span></div>
+</div>
+
+
+    <span class="c1"># def set_damping_coefficient(self, damping_coefficient):</span>
+    <span class="c1">#     for t in self.types:</span>
+    <span class="c1">#         t.damping_coefficient = damping_coefficient</span>
+    <span class="c1">#         # t.diffusivity = 831447.2 * temperature / (t.mass * damping_coefficient)</span>
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="k">pass</span>
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/sim_config.html b/_build/html/_modules/arbdmodel/sim_config.html
new file mode 100644
index 0000000000000000000000000000000000000000..e50e874066de46702bc959e929a04e924a4d44b3
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/sim_config.html
@@ -0,0 +1,615 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.sim_config &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/sim_config';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.sim_config</h1><div class="highlight"><pre>
+<span></span><span class="c1"># -*- coding: utf-8 -*-</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Simulation configuration module. Provides SimConf and DefaultSimConf </span>
+<span class="sd">classes for configuring simulation parameters.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">copy</span><span class="w"> </span><span class="kn">import</span> <span class="n">copy</span><span class="p">,</span> <span class="n">deepcopy</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span><span class="p">,</span> <span class="n">devlogger</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.binary_manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">BinaryManager</span>
+
+<span class="k">def</span><span class="w"> </span><span class="nf">_get_properties_and_dict_keys</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+    <span class="kn">import</span><span class="w"> </span><span class="nn">inspect</span>
+    <span class="bp">cls</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="nf">filter_props</span><span class="p">(</span><span class="n">name_type</span><span class="p">):</span>
+        <span class="n">nt</span> <span class="o">=</span> <span class="n">name_type</span>
+        <span class="k">return</span> <span class="ow">not</span> <span class="n">nt</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">nt</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nb">property</span><span class="p">)</span>
+    <span class="n">properties</span> <span class="o">=</span> <span class="p">[</span><span class="n">name</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">type_</span> <span class="ow">in</span> <span class="nb">filter</span><span class="p">(</span><span class="n">filter_props</span><span class="p">,</span> <span class="n">inspect</span><span class="o">.</span><span class="n">getmembers</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="p">))]</span>
+    <span class="k">return</span> <span class="n">properties</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+
+<div class="viewcode-block" id="SimConf">
+<a class="viewcode-back" href="../../api/core/sim_config.html#arbdmodel.sim_config.SimConf">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SimConf</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; Class describing properties for a (ARBD or NAMD) simulation &quot;&quot;&quot;</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">num_steps</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">output_period</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">integrator</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">timestep</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">thermostat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">barostat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">temperature</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pressure</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">cutoff</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">pairlist_distance</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">decomp_period</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">gpu</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">seed</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">restart_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="c1">## ARBD-specific</span>
+                 <span class="n">rigid_body_integrator</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">rigid_body_grid_grid_period</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="c1">## SimpleARBD parameters</span>
+                 <span class="n">viscosity</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">solvent_density</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">num_heavy_cluster</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="c1">## Binary paths</span>
+                 <span class="n">arbd_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">namd_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">vmd_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                 <span class="n">hydropro_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">apbs_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">gmsh_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_steps</span> <span class="o">=</span> <span class="n">num_steps</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">output_period</span> <span class="o">=</span> <span class="n">output_period</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">integrator</span> <span class="o">=</span> <span class="n">integrator</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">timestep</span> <span class="o">=</span> <span class="n">timestep</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">thermostat</span> <span class="o">=</span> <span class="n">thermostat</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">barostat</span> <span class="o">=</span> <span class="n">barostat</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">temperature</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">pressure</span> <span class="o">=</span> <span class="n">pressure</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cutoff</span> <span class="o">=</span> <span class="n">cutoff</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">pairlist_distance</span> <span class="o">=</span> <span class="n">pairlist_distance</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">decomp_period</span> <span class="o">=</span> <span class="n">decomp_period</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">seed</span> <span class="o">=</span> <span class="n">seed</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">restart_file</span> <span class="o">=</span> <span class="n">restart_file</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">gpu</span> <span class="o">=</span> <span class="n">gpu</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_body_integrator</span> <span class="o">=</span> <span class="n">rigid_body_integrator</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rigid_body_grid_grid_period</span> <span class="o">=</span> <span class="n">rigid_body_grid_grid_period</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span> <span class="o">=</span> <span class="n">viscosity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span> <span class="o">=</span> <span class="n">solvent_density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_heavy_cluster</span> <span class="o">=</span> <span class="n">num_heavy_cluster</span>
+        
+        <span class="c1"># Set binary paths</span>
+        <span class="k">if</span> <span class="n">arbd_path</span><span class="p">:</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="s1">&#39;arbd&#39;</span><span class="p">,</span> <span class="n">arbd_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">namd_path</span><span class="p">:</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="s1">&#39;namd&#39;</span><span class="p">,</span> <span class="n">namd_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">vmd_path</span><span class="p">:</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="s1">&#39;vmd&#39;</span><span class="p">,</span> <span class="n">vmd_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">hydropro_path</span><span class="p">:</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="s1">&#39;hydropro&#39;</span><span class="p">,</span> <span class="n">hydropro_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">apbs_path</span><span class="p">:</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="s1">&#39;apbs&#39;</span><span class="p">,</span> <span class="n">apbs_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">gmsh_path</span><span class="p">:</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="s1">&#39;gmsh&#39;</span><span class="p">,</span> <span class="n">gmsh_path</span><span class="p">)</span>
+
+<div class="viewcode-block" id="SimConf.get_binary">
+<a class="viewcode-back" href="../../api/core/sim_config.html#arbdmodel.sim_config.SimConf.get_binary">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the path to a specific binary with improved error handling.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            name: The name of the binary (e.g., &#39;arbd&#39;, &#39;hydropro&#39;)</span>
+<span class="sd">                </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Path to the binary if found, None otherwise</span>
+<span class="sd">            </span>
+<span class="sd">        This method does not raise exceptions when binaries are not found, allowing</span>
+<span class="sd">        for graceful handling of missing optional dependencies.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">binary_path</span> <span class="o">=</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">get_binary_path</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+        
+        <span class="c1"># Check if we found a binary and convert to string if needed</span>
+        <span class="k">if</span> <span class="n">binary_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">binary_path</span><span class="p">)</span>
+        
+        <span class="c1"># Determine if this is an essential binary</span>
+        <span class="k">if</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">is_binary_essential</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Essential binary &#39;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; not found. Core functionality may be limited.&quot;</span><span class="p">)</span>
+        
+        <span class="k">return</span> <span class="kc">None</span></div>
+
+    
+<div class="viewcode-block" id="SimConf.set_binary">
+<a class="viewcode-back" href="../../api/core/sim_config.html#arbdmodel.sim_config.SimConf.set_binary">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">set_binary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Set the path to a specific binary.&quot;&quot;&quot;</span>
+        <span class="n">BinaryManager</span><span class="o">.</span><span class="n">set_binary_path</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">path</span></div>
+
+
+    <span class="nd">@property</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">temperature</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__temperature</span>
+    
+    <span class="nd">@temperature</span><span class="o">.</span><span class="n">setter</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">temperature</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Temperature must be positive&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__temperature</span> <span class="o">=</span> <span class="n">value</span>
+
+<div class="viewcode-block" id="SimConf.combine">
+<a class="viewcode-back" href="../../api/core/sim_config.html#arbdmodel.sim_config.SimConf.combine">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">combine</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">,</span> <span class="n">policy</span><span class="o">=</span><span class="s1">&#39;override&#39;</span><span class="p">,</span> <span class="n">warn</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot; </span>
+<span class="sd">        Creates a new SimConf object whose properties are</span>
+<span class="sd">        initialized to be from &quot;self&quot;, but are overridden with</span>
+<span class="sd">        properties in &quot;other&quot;, provided they are not None</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">new_conf</span> <span class="o">=</span> <span class="n">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+        <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">_get_properties_and_dict_keys</span><span class="p">(</span><span class="n">other</span><span class="p">):</span>
+            <span class="n">oldval</span> <span class="o">=</span> <span class="kc">None</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="n">other</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="n">oldval</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
+                <span class="k">except</span><span class="p">:</span>
+                    <span class="k">pass</span>
+                <span class="k">if</span> <span class="n">oldval</span> <span class="o">!=</span> <span class="n">val</span> <span class="ow">and</span> <span class="p">(</span><span class="n">oldval</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span> \
+                   <span class="p">(</span><span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">and</span> <span class="n">policy</span> <span class="o">!=</span> <span class="s1">&#39;override&#39;</span><span class="p">:</span>
+                    <span class="k">if</span> <span class="n">policy</span> <span class="o">==</span> <span class="s1">&#39;best&#39;</span><span class="p">:</span>
+                        <span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;timestep&#39;</span><span class="p">,</span> <span class="s1">&#39;output_period&#39;</span><span class="p">,</span> <span class="s1">&#39;decomp_period&#39;</span><span class="p">):</span>
+                            <span class="k">if</span> <span class="n">warn</span><span class="p">:</span> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Combining attribute </span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">oldval</span><span class="si">}</span><span class="s1"> != </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">, using </span><span class="si">{</span><span class="nb">min</span><span class="p">([</span><span class="n">oldval</span><span class="p">,</span><span class="n">val</span><span class="p">])</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                            <span class="n">new_conf</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="nb">min</span><span class="p">([</span><span class="n">oldval</span><span class="p">,</span><span class="n">val</span><span class="p">]))</span>
+                        <span class="k">elif</span> <span class="n">attr</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;num_steps&#39;</span><span class="p">,</span> <span class="s1">&#39;cutoff&#39;</span><span class="p">,</span> <span class="s1">&#39;pairlist_distance&#39;</span><span class="p">):</span>
+                            <span class="k">if</span> <span class="n">warn</span><span class="p">:</span> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Combining attribute </span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">oldval</span><span class="si">}</span><span class="s1"> != </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">, using </span><span class="si">{</span><span class="nb">max</span><span class="p">([</span><span class="n">oldval</span><span class="p">,</span><span class="n">val</span><span class="p">])</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                            <span class="n">new_conf</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="nb">max</span><span class="p">([</span><span class="n">oldval</span><span class="p">,</span><span class="n">val</span><span class="p">]))</span>
+                        <span class="k">elif</span> <span class="n">attr</span> <span class="o">==</span> <span class="s1">&#39;integrator&#39;</span><span class="p">:</span>
+                            <span class="k">if</span> <span class="s1">&#39;MD&#39;</span> <span class="ow">in</span> <span class="p">(</span><span class="n">oldval</span><span class="p">,</span><span class="n">val</span><span class="p">)</span> <span class="ow">and</span> <span class="s1">&#39;BD&#39;</span> <span class="ow">in</span> <span class="p">(</span><span class="n">oldval</span><span class="p">,</span><span class="n">val</span><span class="p">):</span>
+                                <span class="k">if</span> <span class="n">warn</span><span class="p">:</span> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Combining attribute </span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">oldval</span><span class="si">}</span><span class="s1"> != </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">, using &quot;MD&quot;&#39;</span><span class="p">)</span>
+                                <span class="n">new_conf</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span><span class="s1">&#39;MD&#39;</span><span class="p">)</span>
+                            <span class="k">else</span><span class="p">:</span>
+                                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Unsure how to combine </span><span class="si">{</span><span class="n">oldval</span><span class="si">}</span><span class="s1"> and </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1"> for </span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s1"> under policy </span><span class="si">{</span><span class="n">policy</span><span class="si">}</span><span class="s1">; using </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                                <span class="n">new_conf</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
+                        <span class="k">else</span><span class="p">:</span>
+                            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Unsure how to combine </span><span class="si">{</span><span class="n">oldval</span><span class="si">}</span><span class="s1"> and </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1"> for </span><span class="si">{</span><span class="n">attr</span><span class="si">}</span><span class="s1"> under policy </span><span class="si">{</span><span class="n">policy</span><span class="si">}</span><span class="s1">; using </span><span class="si">{</span><span class="n">val</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
+                            <span class="n">new_conf</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>                            
+                    <span class="k">else</span><span class="p">:</span>
+                        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Unrecognized policy &quot;</span><span class="si">{</span><span class="n">policy</span><span class="si">}</span><span class="s1">&quot; for combining SimConfs&#39;</span><span class="p">)</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="n">new_conf</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">attr</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">new_conf</span></div>
+
+
+<div class="viewcode-block" id="SimConf.items">
+<a class="viewcode-back" href="../../api/core/sim_config.html#arbdmodel.sim_config.SimConf.items">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">_get_properties_and_dict_keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
+            <span class="k">yield</span> <span class="n">attr</span><span class="p">,</span> <span class="n">val</span></div>
+</div>
+
+
+<div class="viewcode-block" id="DefaultSimConf">
+<a class="viewcode-back" href="../../api/core/sim_config.html#arbdmodel.sim_config.DefaultSimConf">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">DefaultSimConf</span><span class="p">(</span><span class="n">SimConf</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot; Generic class describing properties for a simulation with default binary paths &quot;&quot;&quot;</span>
+
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">num_steps</span><span class="o">=</span><span class="mf">1e5</span><span class="p">,</span> <span class="n">output_period</span><span class="o">=</span><span class="mf">1e3</span><span class="p">,</span>
+                 <span class="n">integrator</span><span class="o">=</span><span class="s1">&#39;MD&#39;</span><span class="p">,</span> <span class="n">timestep</span><span class="o">=</span><span class="mf">20e-6</span><span class="p">,</span> <span class="n">thermostat</span><span class="o">=</span><span class="s1">&#39;Langevin&#39;</span><span class="p">,</span> <span class="n">barostat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">temperature</span><span class="o">=</span><span class="mi">295</span><span class="p">,</span> <span class="n">pressure</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">cutoff</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span> <span class="n">pairlist_distance</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">decomp_period</span><span class="o">=</span><span class="mi">40</span><span class="p">,</span>
+                 <span class="n">seed</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">restart_file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">gpu</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
+                 <span class="n">viscosity</span><span class="o">=</span><span class="mf">0.01</span><span class="p">,</span> <span class="n">solvent_density</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">num_heavy_cluster</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
+                 <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+        
+        <span class="c1"># Set default paths only for essential binaries or those that exist</span>
+        <span class="n">default_paths</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="n">essential_binaries</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;arbd&quot;</span><span class="p">]</span>  <span class="c1"># These are required for basic functionality</span>
+        <span class="n">optional_binaries</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;hydropro&quot;</span><span class="p">,</span> <span class="s2">&quot;apbs&quot;</span><span class="p">,</span> <span class="s2">&quot;vmd&quot;</span><span class="p">,</span> <span class="s2">&quot;namd&quot;</span><span class="p">]</span>  <span class="c1"># These are optional</span>
+        
+        <span class="c1"># First add essential binaries</span>
+        <span class="k">for</span> <span class="n">binary_name</span> <span class="ow">in</span> <span class="n">essential_binaries</span><span class="p">:</span>
+            <span class="n">resource_path</span> <span class="o">=</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">get_binary_path</span><span class="p">(</span><span class="n">binary_name</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">resource_path</span><span class="p">:</span>
+                <span class="n">default_paths</span><span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">binary_name</span><span class="si">}</span><span class="s2">_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">resource_path</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Essential binary &#39;</span><span class="si">{</span><span class="n">binary_name</span><span class="si">}</span><span class="s2">&#39; not found. Some functionality may be limited.&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Then add optional binaries only if they exist</span>
+        <span class="k">for</span> <span class="n">binary_name</span> <span class="ow">in</span> <span class="n">optional_binaries</span><span class="p">:</span>
+            <span class="n">resource_path</span> <span class="o">=</span> <span class="n">BinaryManager</span><span class="o">.</span><span class="n">get_binary_path</span><span class="p">(</span><span class="n">binary_name</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">resource_path</span><span class="p">:</span>
+                <span class="n">default_paths</span><span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">binary_name</span><span class="si">}</span><span class="s2">_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">resource_path</span>
+        
+        <span class="c1"># Initialize with binary paths and other parameters</span>
+        <span class="n">SimConf</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> 
+                         <span class="n">num_steps</span><span class="o">=</span><span class="n">num_steps</span><span class="p">,</span> 
+                         <span class="n">output_period</span><span class="o">=</span><span class="n">output_period</span><span class="p">,</span>
+                         <span class="n">integrator</span><span class="o">=</span><span class="n">integrator</span><span class="p">,</span> 
+                         <span class="n">timestep</span><span class="o">=</span><span class="n">timestep</span><span class="p">,</span> 
+                         <span class="n">thermostat</span><span class="o">=</span><span class="n">thermostat</span><span class="p">,</span> 
+                         <span class="n">barostat</span><span class="o">=</span><span class="n">barostat</span><span class="p">,</span>
+                         <span class="n">temperature</span><span class="o">=</span><span class="n">temperature</span><span class="p">,</span> 
+                         <span class="n">pressure</span><span class="o">=</span><span class="n">pressure</span><span class="p">,</span>
+                         <span class="n">cutoff</span><span class="o">=</span><span class="n">cutoff</span><span class="p">,</span> 
+                         <span class="n">pairlist_distance</span><span class="o">=</span><span class="n">pairlist_distance</span><span class="p">,</span> 
+                         <span class="n">decomp_period</span><span class="o">=</span><span class="n">decomp_period</span><span class="p">,</span>
+                         <span class="n">seed</span><span class="o">=</span><span class="n">seed</span><span class="p">,</span> 
+                         <span class="n">restart_file</span><span class="o">=</span><span class="n">restart_file</span><span class="p">,</span> 
+                         <span class="n">gpu</span><span class="o">=</span><span class="n">gpu</span><span class="p">,</span>
+                         <span class="n">viscosity</span><span class="o">=</span><span class="n">viscosity</span><span class="p">,</span>
+                         <span class="n">solvent_density</span><span class="o">=</span><span class="n">solvent_density</span><span class="p">,</span>
+                         <span class="n">num_heavy_cluster</span><span class="o">=</span><span class="n">num_heavy_cluster</span><span class="p">,</span>
+                         <span class="o">**</span><span class="p">{</span><span class="o">**</span><span class="n">default_paths</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">})</span>  <span class="c1"># User-provided values override defaults</span>
+        
+        <span class="c1"># Store these for direct access</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_steps</span> <span class="o">=</span> <span class="n">num_steps</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">output_period</span> <span class="o">=</span> <span class="n">output_period</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__temperature</span> <span class="o">=</span> <span class="n">temperature</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">pressure</span> <span class="o">=</span> <span class="n">pressure</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span> <span class="o">=</span> <span class="n">viscosity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span> <span class="o">=</span> <span class="n">solvent_density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_heavy_cluster</span> <span class="o">=</span> <span class="n">num_heavy_cluster</span>
+
+    <span class="nd">@property</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">temperature</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__temperature</span>
+    
+    <span class="nd">@temperature</span><span class="o">.</span><span class="n">setter</span>
+    <span class="k">def</span><span class="w"> </span><span class="nf">temperature</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+        <span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Temperature must be positive&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">__temperature</span> <span class="o">=</span> <span class="n">value</span></div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/simplearbd.html b/_build/html/_modules/arbdmodel/simplearbd.html
new file mode 100644
index 0000000000000000000000000000000000000000..31a90d2da1ac7196b851cfeb968d620a8326a3d0
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/simplearbd.html
@@ -0,0 +1,801 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.simplearbd &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/simplearbd';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.simplearbd</h1><div class="highlight"><pre>
+<span></span><span class="ch">#!/usr/bin/env python3</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">argparse</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+
+<span class="kn">from</span><span class="w"> </span><span class="nn">.structure_rigidbody</span><span class="w"> </span><span class="kn">import</span> <span class="n">StructureRigidBodyModel</span><span class="p">,</span> <span class="n">SimpleArbdEngine</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.sim_config</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimConf</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+
+<div class="viewcode-block" id="SimpleArbdConfig">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SimpleArbdConfig</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Parse and manage SimpleARBD configuration file.</span>
+<span class="sd">    </span>
+<span class="sd">    This class provides a modern, clean interface for reading SimpleARBD</span>
+<span class="sd">    configuration files and setting up the simulation.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">config_path</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Initialize SimpleArbdConfig.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            config_path: Path to the SimpleARBD configuration file</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">config_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">config_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">config_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Config file not found: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">config_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_config</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">simconf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_simconf</span><span class="p">()</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_parse_config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Parse the SimpleARBD configuration file.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Dict containing configuration parameters</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Parsing config file: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">config_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="n">config</span> <span class="o">=</span> <span class="p">{}</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">text</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+            
+        <span class="c1"># Parse diffusible objects</span>
+        <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;Diffusible_objects:([ \w\.]+)&#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+            <span class="n">config</span><span class="p">[</span><span class="s1">&#39;diffusible_objects&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
+            
+        <span class="c1"># Parse static objects</span>
+        <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;Static_objects \(Enter NA for no static object\):([ \w\.]+)&#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+            <span class="n">val</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+            <span class="n">config</span><span class="p">[</span><span class="s1">&#39;static_objects&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">if</span> <span class="n">val</span> <span class="o">==</span> <span class="s1">&#39;NA&#39;</span> <span class="k">else</span> <span class="n">val</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
+            
+        <span class="c1"># Parse remaining configuration parameters</span>
+        <span class="n">parameter_patterns</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;salt_concentration&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;SaltConcentration:(\s*[0-9]*\.[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;temperature&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Temperature \(K\):(\s*[0-9]*\.?[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;viscosity&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Viscosity:(\s*[0-9]*\.?[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;solvent_density&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Solvent_density:(\s*[0-9]*\.?[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;num_heavy_cluster&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Number_of_heavy_cluster \(Integer\):(\s*[0-9]+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;gaussian_width&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;GaussianWidth:(\s*[0-9]*\.?[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;skip_parametrizing_diffusible&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Skip_parametrizing_diffusible \(Yes/No\):([ \w]+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;gigantic_stat_objects&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Gigantic_stat_objects \(Yes/No\):([ \w]+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;python_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Python_path:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;hydro_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Hydro_path:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;apbs_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Apbs_path:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;vmd_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Vmd_path:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;parameters_folder&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Parameters_folder:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;num_replicas&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Num_replicas \(Integer\):(\s*[0-9]+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;timestep&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Timestep \(Float\):(\s*[0-9]*\.?[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;steps&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Steps \(Integer\):(\s*[0-9]+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;interactive&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Interactive \(Yes/No\):([ \w]+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;grid_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Grid_path:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;well_depth&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;WellDepth \(Positive\):\s*([0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;well_resolution&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;WellResolution \(Positive\):\s*([0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;arbd_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;ARBD_path:(\s*\S+)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;simulation_path&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;Path_for_ARBD_simulations:(\s*\S+)&#39;</span><span class="p">,</span>
+        <span class="p">}</span>
+        
+        <span class="c1"># Extract cell vectors and origin</span>
+        <span class="n">vector_patterns</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;cell_basis_vector1&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;CellBasisVector1:\s*([0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;cell_basis_vector2&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;CellBasisVector2:\s*([0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;cell_basis_vector3&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;CellBasisVector3:\s*([0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;cell_origin&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;CellOrigin:\s*(-*[0-9]+[\.]*[0-9]* -*[0-9]+[\.]*[0-9]* -*[0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;initial_coor_basis_vector1&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;InitialCoorBasisVector1:\s*([0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;initial_coor_basis_vector2&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;InitialCoorBasisVector2:\s*([0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;initial_coor_basis_vector3&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;InitialCoorBasisVector3:\s*([0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]* [0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;initial_coor_origin&#39;</span><span class="p">:</span> <span class="sa">r</span><span class="s1">&#39;InitialCoorOrigin:\s*(-*[0-9]+[\.]*[0-9]* -*[0-9]+[\.]*[0-9]* -*[0-9]+[\.]*[0-9]*)&#39;</span><span class="p">,</span>
+        <span class="p">}</span>
+        
+        <span class="c1"># Extract all parameters using regex</span>
+        <span class="k">for</span> <span class="n">param</span><span class="p">,</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">parameter_patterns</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+                <span class="n">config</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+                
+        <span class="c1"># Extract and convert vector parameters</span>
+        <span class="k">for</span> <span class="n">param</span><span class="p">,</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="n">vector_patterns</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
+            <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+                <span class="c1"># Convert space-separated values to list of floats</span>
+                <span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">()]</span>
+                <span class="n">config</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="o">=</span> <span class="n">values</span>
+                
+        <span class="c1"># Extract copies per object</span>
+        <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;Number_of_copies_per_object \(Integer\(s\)\):([ 0-9]+)&#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+            <span class="n">copies</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
+            <span class="k">if</span> <span class="s1">&#39;diffusible_objects&#39;</span> <span class="ow">in</span> <span class="n">config</span><span class="p">:</span>
+                <span class="n">config</span><span class="p">[</span><span class="s1">&#39;copies_per_object&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
+                    <span class="n">obj</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">copies</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">obj</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;diffusible_objects&#39;</span><span class="p">])</span>
+                    <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">copies</span><span class="p">)</span>
+                <span class="p">}</span>
+                
+        <span class="c1"># Extract extra potential tags</span>
+        <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;Extra_potentials_tags \(Path, vdw cluster group\):([\s\S]*)\n&#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
+            <span class="n">tags</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\((\S+\.dx,\s*\w+)\)&#39;</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
+            <span class="n">config</span><span class="p">[</span><span class="s1">&#39;extra_potentials&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+            <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">tags</span><span class="p">:</span>
+                <span class="n">parts</span> <span class="o">=</span> <span class="n">tag</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
+                <span class="n">config</span><span class="p">[</span><span class="s1">&#39;extra_potentials&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
+                    <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">(),</span>
+                    <span class="s1">&#39;vdw_type&#39;</span><span class="p">:</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+                <span class="p">})</span>
+                
+        <span class="c1"># Convert appropriate values to correct types</span>
+        <span class="n">type_conversions</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;salt_concentration&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;temperature&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;viscosity&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;solvent_density&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;num_heavy_cluster&#39;</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
+            <span class="s1">&#39;gaussian_width&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;num_replicas&#39;</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
+            <span class="s1">&#39;timestep&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;steps&#39;</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
+            <span class="s1">&#39;well_depth&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+            <span class="s1">&#39;well_resolution&#39;</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span>
+        <span class="p">}</span>
+        
+        <span class="k">for</span> <span class="n">param</span><span class="p">,</span> <span class="n">convert</span> <span class="ow">in</span> <span class="n">type_conversions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">config</span><span class="p">:</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="n">config</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="o">=</span> <span class="n">convert</span><span class="p">(</span><span class="n">config</span><span class="p">[</span><span class="n">param</span><span class="p">])</span>
+                <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not convert </span><span class="si">{</span><span class="n">param</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">convert</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+                    
+        <span class="c1"># Boolean conversions</span>
+        <span class="n">bool_conversions</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;skip_parametrizing_diffusible&#39;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;yes&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;gigantic_stat_objects&#39;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;yes&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;interactive&#39;</span><span class="p">:</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;yes&#39;</span><span class="p">,</span>
+        <span class="p">}</span>
+        
+        <span class="k">for</span> <span class="n">param</span><span class="p">,</span> <span class="n">convert</span> <span class="ow">in</span> <span class="n">bool_conversions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">param</span> <span class="ow">in</span> <span class="n">config</span><span class="p">:</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="n">config</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="o">=</span> <span class="n">convert</span><span class="p">(</span><span class="n">config</span><span class="p">[</span><span class="n">param</span><span class="p">])</span>
+                <span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not convert </span><span class="si">{</span><span class="n">param</span><span class="si">}</span><span class="s2"> to boolean&quot;</span><span class="p">)</span>
+                    
+        <span class="k">return</span> <span class="n">config</span>
+        
+    <span class="k">def</span><span class="w"> </span><span class="nf">_create_simconf</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">SimConf</span><span class="p">:</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a SimConf object from the parsed configuration.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            SimConf object</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Extract parameters for SimConf</span>
+        <span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;temperature&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;temperature&#39;</span><span class="p">,</span> <span class="mi">300</span><span class="p">),</span>
+            <span class="s1">&#39;viscosity&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;viscosity&#39;</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">),</span>
+            <span class="s1">&#39;solvent_density&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;solvent_density&#39;</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">),</span>
+            <span class="s1">&#39;num_heavy_cluster&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_heavy_cluster&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
+            <span class="s1">&#39;timestep&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;timestep&#39;</span><span class="p">,</span> <span class="mf">0.0002</span><span class="p">),</span>
+            <span class="s1">&#39;num_steps&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;steps&#39;</span><span class="p">,</span> <span class="mi">10000000</span><span class="p">),</span>
+            <span class="s1">&#39;output_period&#39;</span><span class="p">:</span> <span class="mi">1000</span><span class="p">,</span>  <span class="c1"># Default</span>
+        <span class="p">}</span>
+        
+        <span class="c1"># Add binary paths if available</span>
+        <span class="n">binary_paths</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;hydro_path&#39;</span><span class="p">:</span> <span class="s1">&#39;hydro_path&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;apbs_path&#39;</span><span class="p">:</span> <span class="s1">&#39;apbs_path&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;vmd_path&#39;</span><span class="p">:</span> <span class="s1">&#39;vmd_path&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;arbd_path&#39;</span><span class="p">:</span> <span class="s1">&#39;arbd_path&#39;</span>
+        <span class="p">}</span>
+        
+        <span class="k">for</span> <span class="n">config_key</span><span class="p">,</span> <span class="n">simconf_key</span> <span class="ow">in</span> <span class="n">binary_paths</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">config_key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">:</span>
+                <span class="n">params</span><span class="p">[</span><span class="n">simconf_key</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="n">config_key</span><span class="p">]</span>
+                
+        <span class="k">return</span> <span class="n">SimConf</span><span class="p">(</span><span class="o">**</span><span class="n">params</span><span class="p">)</span>
+    
+<div class="viewcode-block" id="SimpleArbdConfig.create_model">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.create_model">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">create_model</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">StructureRigidBodyModel</span><span class="p">:</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a StructureRigidBodyModel from the configuration.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            StructureRigidBodyModel instance</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Set up cell vectors and origin for model</span>
+        <span class="n">cell_vectors</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="n">cell_origin</span> <span class="o">=</span> <span class="kc">None</span>
+        
+        <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;cell_basis_vector1&#39;</span><span class="p">,</span> <span class="s1">&#39;cell_basis_vector2&#39;</span><span class="p">,</span> <span class="s1">&#39;cell_basis_vector3&#39;</span><span class="p">]):</span>
+            <span class="n">cell_vectors</span> <span class="o">=</span> <span class="p">[</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;cell_basis_vector1&#39;</span><span class="p">],</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;cell_basis_vector2&#39;</span><span class="p">],</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;cell_basis_vector3&#39;</span><span class="p">]</span>
+            <span class="p">]</span>
+            
+        <span class="k">if</span> <span class="s1">&#39;cell_origin&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">:</span>
+            <span class="n">cell_origin</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;cell_origin&#39;</span><span class="p">]</span>
+            
+        <span class="c1"># Create the model</span>
+        <span class="n">model</span> <span class="o">=</span> <span class="n">StructureRigidBodyModel</span><span class="p">(</span>
+            <span class="n">cell_vectors</span><span class="o">=</span><span class="n">cell_vectors</span><span class="p">,</span>
+            <span class="n">cell_origin</span><span class="o">=</span><span class="n">cell_origin</span><span class="p">,</span>
+            <span class="n">configuration</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+            <span class="n">use_boundary</span><span class="o">=</span><span class="s1">&#39;extra_potentials&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;extra_potentials&#39;</span><span class="p">])</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">,</span>
+            <span class="n">boundary_params</span><span class="o">=</span><span class="p">{</span>
+                <span class="s1">&#39;well_depth&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;well_depth&#39;</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">),</span>
+                <span class="s1">&#39;resolution&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;well_resolution&#39;</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">),</span>
+            <span class="p">}</span>
+        <span class="p">)</span>
+        
+        <span class="k">return</span> <span class="n">model</span></div>
+
+    
+<div class="viewcode-block" id="SimpleArbdConfig.create_engine">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.create_engine">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">create_engine</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">SimpleArbdEngine</span><span class="p">:</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a SimpleArbdEngine from the configuration.</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            SimpleArbdEngine instance</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Create the engine with appropriate configuration</span>
+        <span class="n">engine</span> <span class="o">=</span> <span class="n">SimpleArbdEngine</span><span class="p">(</span>
+            <span class="n">configuration</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+            <span class="n">extra_bd_file_lines</span><span class="o">=</span><span class="s1">&#39;&#39;</span>
+        <span class="p">)</span>
+        
+        <span class="k">return</span> <span class="n">engine</span></div>
+
+        
+<div class="viewcode-block" id="SimpleArbdConfig.setup_diffusible_objects">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">setup_diffusible_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">:</span> <span class="n">StructureRigidBodyModel</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Set up diffusible objects in the model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            model: StructureRigidBodyModel to add diffusible objects to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="s1">&#39;diffusible_objects&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;No diffusible objects specified in configuration&quot;</span><span class="p">)</span>
+            <span class="k">return</span>
+            
+        <span class="c1"># Create initial region from configuration</span>
+        <span class="n">initial_region</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">[</span>
+            <span class="s1">&#39;initial_coor_basis_vector1&#39;</span><span class="p">,</span> 
+            <span class="s1">&#39;initial_coor_basis_vector2&#39;</span><span class="p">,</span> 
+            <span class="s1">&#39;initial_coor_basis_vector3&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;initial_coor_origin&#39;</span>
+        <span class="p">]):</span>
+            <span class="n">initial_region</span> <span class="o">=</span> <span class="p">{</span>
+                <span class="s1">&#39;bv1&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;initial_coor_basis_vector1&#39;</span><span class="p">],</span>
+                <span class="s1">&#39;bv2&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;initial_coor_basis_vector2&#39;</span><span class="p">],</span>
+                <span class="s1">&#39;bv3&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;initial_coor_basis_vector3&#39;</span><span class="p">],</span>
+                <span class="s1">&#39;origin&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;initial_coor_origin&#39;</span><span class="p">]</span>
+            <span class="p">}</span>
+            
+        <span class="c1"># Add each diffusible object</span>
+        <span class="k">for</span> <span class="n">obj_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;diffusible_objects&#39;</span><span class="p">]:</span>
+            <span class="c1"># Skip parametrization if requested</span>
+            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;skip_parametrizing_diffusible&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">):</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Skipping parametrization for </span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2"> (as requested in config)&quot;</span><span class="p">)</span>
+                <span class="k">continue</span>
+                
+            <span class="c1"># Determine number of copies</span>
+            <span class="n">copies</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;copies_per_object&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">obj_name</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+            
+            <span class="c1"># Find structure files</span>
+            <span class="n">psf_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2">.psf&quot;</span><span class="p">)</span>
+            <span class="n">pdb_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2">.pdb&quot;</span><span class="p">)</span>
+            
+            <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">psf_file</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">and</span> <span class="n">pdb_file</span><span class="o">.</span><span class="n">exists</span><span class="p">()):</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Structure files for </span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2"> not found: </span><span class="si">{</span><span class="n">psf_file</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">pdb_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">continue</span>
+                
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Adding diffusible object: </span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2"> with </span><span class="si">{</span><span class="n">copies</span><span class="si">}</span><span class="s2"> copies&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Create work directory</span>
+            <span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;parameters_folder&#39;</span><span class="p">,</span> <span class="s1">&#39;./parameters&#39;</span><span class="p">))</span> <span class="o">/</span> <span class="n">obj_name</span>
+            
+            <span class="c1"># Add to model</span>
+            <span class="n">model</span><span class="o">.</span><span class="n">add_diffusible_object</span><span class="p">(</span>
+                <span class="n">structure_path</span><span class="o">=</span><span class="n">psf_file</span><span class="p">,</span>  <span class="c1"># Use PSF as primary file</span>
+                <span class="n">copies</span><span class="o">=</span><span class="n">copies</span><span class="p">,</span>
+                <span class="n">name</span><span class="o">=</span><span class="n">obj_name</span><span class="p">,</span>
+                <span class="n">initial_region</span><span class="o">=</span><span class="n">initial_region</span><span class="p">,</span>
+                <span class="n">random_seed</span><span class="o">=</span><span class="mi">42</span><span class="p">,</span>  <span class="c1"># Fixed seed for reproducibility</span>
+                <span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span>
+            <span class="p">)</span></div>
+
+            
+<div class="viewcode-block" id="SimpleArbdConfig.setup_static_objects">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">setup_static_objects</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">:</span> <span class="n">StructureRigidBodyModel</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Set up static objects in the model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            model: StructureRigidBodyModel to add static objects to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="s1">&#39;static_objects&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;static_objects&#39;</span><span class="p">]:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;No static objects specified in configuration&quot;</span><span class="p">)</span>
+            <span class="k">return</span>
+            
+        <span class="c1"># Process each static object</span>
+        <span class="k">for</span> <span class="n">obj_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;static_objects&#39;</span><span class="p">]:</span>
+            <span class="c1"># Find structure files</span>
+            <span class="n">psf_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2">.psf&quot;</span><span class="p">)</span>
+            <span class="n">pdb_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2">.pdb&quot;</span><span class="p">)</span>
+            
+            <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">psf_file</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">and</span> <span class="n">pdb_file</span><span class="o">.</span><span class="n">exists</span><span class="p">()):</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Structure files for static object </span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2"> not found: </span><span class="si">{</span><span class="n">psf_file</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">pdb_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">continue</span>
+                
+            <span class="c1"># Determine if it&#39;s a gigantic object</span>
+            <span class="n">is_gigantic</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;gigantic_stat_objects&#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
+            
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Adding static object: </span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2"> (gigantic: </span><span class="si">{</span><span class="n">is_gigantic</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Create work directory</span>
+            <span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;parameters_folder&#39;</span><span class="p">,</span> <span class="s1">&#39;./parameters&#39;</span><span class="p">))</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;static_</span><span class="si">{</span><span class="n">obj_name</span><span class="si">}</span><span class="s2">&quot;</span>
+            
+            <span class="c1"># Add to model</span>
+            <span class="n">model</span><span class="o">.</span><span class="n">add_static_object</span><span class="p">(</span>
+                <span class="n">structure_path</span><span class="o">=</span><span class="n">psf_file</span><span class="p">,</span>  <span class="c1"># Use PSF as primary file</span>
+                <span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span><span class="p">,</span>
+                <span class="n">is_gigantic</span><span class="o">=</span><span class="n">is_gigantic</span><span class="p">,</span>
+                <span class="n">threshold</span><span class="o">=</span><span class="mi">300</span>  <span class="c1"># Default threshold</span>
+            <span class="p">)</span></div>
+
+            
+<div class="viewcode-block" id="SimpleArbdConfig.run_simulation">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.run_simulation">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">run_simulation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">:</span> <span class="n">StructureRigidBodyModel</span><span class="p">,</span> <span class="n">engine</span><span class="p">:</span> <span class="n">SimpleArbdEngine</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Run the simulation.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            model: StructureRigidBodyModel to simulate</span>
+<span class="sd">            engine: SimpleArbdEngine to use for simulation</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Set up output directory</span>
+        <span class="n">sim_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;simulation_path&#39;</span><span class="p">,</span> <span class="s1">&#39;./simulation&#39;</span><span class="p">)</span>
+        <span class="n">output_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">sim_path</span><span class="p">)</span> <span class="o">/</span> <span class="s1">&#39;output&#39;</span>
+        <span class="n">output_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Determine number of replicas</span>
+        <span class="n">replicas</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_replicas&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+        
+        <span class="c1"># Run simulation</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Running simulation with </span><span class="si">{</span><span class="n">replicas</span><span class="si">}</span><span class="s2"> replicas&quot;</span><span class="p">)</span>
+        
+        <span class="n">engine</span><span class="o">.</span><span class="n">run_simulation</span><span class="p">(</span>
+            <span class="n">model</span><span class="o">=</span><span class="n">model</span><span class="p">,</span>
+            <span class="n">output_name</span><span class="o">=</span><span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">config_path</span><span class="p">)</span><span class="o">.</span><span class="n">stem</span><span class="p">,</span>
+            <span class="n">replicas</span><span class="o">=</span><span class="n">replicas</span><span class="p">,</span>
+            <span class="n">output_directory</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">output_dir</span><span class="p">),</span>
+            <span class="n">directory</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">sim_path</span><span class="p">)</span>
+        <span class="p">)</span></div>
+</div>
+
+
+
+<div class="viewcode-block" id="main">
+<a class="viewcode-back" href="../../api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.main">[docs]</a>
+<span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">():</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Main function to process SimpleARBD configuration file and run simulation.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">&#39;Process SimpleARBD configuration file&#39;</span><span class="p">)</span>
+    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;config_file&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Path to SimpleARBD configuration file&#39;</span><span class="p">)</span>
+    <span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">&#39;--setup-only&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">&#39;store_true&#39;</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">&#39;Only set up the simulation, do not run it&#39;</span><span class="p">)</span>
+    <span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
+    
+    <span class="c1"># Parse configuration file</span>
+    <span class="k">try</span><span class="p">:</span>
+        <span class="n">config</span> <span class="o">=</span> <span class="n">SimpleArbdConfig</span><span class="p">(</span><span class="n">args</span><span class="o">.</span><span class="n">config_file</span><span class="p">)</span>
+    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error parsing configuration file: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="mi">1</span>
+        
+    <span class="c1"># Create model and engine</span>
+    <span class="n">model</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">create_model</span><span class="p">()</span>
+    <span class="n">engine</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">create_engine</span><span class="p">()</span>
+    
+    <span class="c1"># Set up diffusible and static objects</span>
+    <span class="n">config</span><span class="o">.</span><span class="n">setup_diffusible_objects</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
+    <span class="n">config</span><span class="o">.</span><span class="n">setup_static_objects</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
+    
+    <span class="k">if</span> <span class="ow">not</span> <span class="n">args</span><span class="o">.</span><span class="n">setup_only</span><span class="p">:</span>
+        <span class="c1"># Run simulation</span>
+        <span class="n">config</span><span class="o">.</span><span class="n">run_simulation</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">engine</span><span class="p">)</span>
+    <span class="k">else</span><span class="p">:</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Setup complete. Simulation not started (--setup-only flag used)&quot;</span><span class="p">)</span>
+    
+    <span class="k">return</span> <span class="mi">0</span></div>
+
+
+
+<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
+    <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/structure_from_pdb.html b/_build/html/_modules/arbdmodel/structure_from_pdb.html
new file mode 100644
index 0000000000000000000000000000000000000000..998109a9408d57b05874fc72cff8755c11afcecc
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/structure_from_pdb.html
@@ -0,0 +1,1017 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.structure_from_pdb &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/structure_from_pdb';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.structure_from_pdb</h1><div class="highlight"><pre>
+<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.sim_config</span><span class="w"> </span><span class="kn">import</span> <span class="n">SimConf</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.engine</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydroProRunner</span><span class="p">,</span> <span class="n">APBSRunner</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.grid</span><span class="w"> </span><span class="kn">import</span> <span class="n">writeDx</span><span class="p">,</span> <span class="n">loadGrid</span><span class="p">,</span> <span class="n">Bound_grid</span>
+
+<span class="c1">#Originally SimpleARBD by Chun</span>
+
+<div class="viewcode-block" id="StructureProcessor">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">StructureProcessor</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Process molecular structure files to calculate properties and generate maps for ARBD&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">structure_path</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">num_heavy_cluster</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> 
+                 <span class="n">parameters_folder</span><span class="o">=</span><span class="s2">&quot;./parameters&quot;</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Initialize processor with structure file</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure_path: Path to structure file (.psf/.pdb)</span>
+<span class="sd">            simconf: SimConf object containing configuration parameters</span>
+<span class="sd">            num_heavy_cluster: Number of heavy atom clusters for VDW maps</span>
+<span class="sd">            parameters_folder: Path to parameters folder</span>
+<span class="sd">            work_dir: Working directory</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">structure_path</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">base_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span><span class="o">.</span><span class="n">stem</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">num_heavy_cluster</span> <span class="o">=</span> <span class="n">num_heavy_cluster</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">parameters_folder</span> <span class="o">=</span> <span class="n">parameters_folder</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span> <span class="k">if</span> <span class="n">work_dir</span> <span class="k">else</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span>
+        
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">DefaultSimConf</span>
+            <span class="n">simconf</span> <span class="o">=</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+            
+        <span class="c1"># Extract parameters from simconf</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">temperature</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">viscosity</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">solvent_density</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vmd_path</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;vmd&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;vmd&#39;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">hydro_path</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;hydropro&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">apbs_path</span> <span class="o">=</span> <span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;apbs&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;apbs&#39;</span>
+        
+        <span class="c1"># Create working directory if it doesn&#39;t exist</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parameters_folder</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Attributes for results</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">moment_of_inertia</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aligned_pdb</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aligned_psf</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">charge_dx</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">elec_dx</span> <span class="o">=</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vdw_pot_dxs</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vdw_den_dxs</span> <span class="o">=</span> <span class="p">[]</span>
+        
+<div class="viewcode-block" id="StructureProcessor.process_structure">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.process_structure">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">process_structure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Process structure to get all properties and potential maps&quot;&quot;&quot;</span>
+        <span class="c1"># Step 1: Align structure</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">align_structure</span><span class="p">()</span>
+        
+        <span class="c1"># Step 2: Calculate hydrodynamic properties</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">calculate_hydrodynamic_properties</span><span class="p">()</span>
+        
+        <span class="c1"># Step 3: Generate charge distribution</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">generate_charge_distribution</span><span class="p">()</span>
+        
+        <span class="c1"># Step 4: Generate electrostatic map</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">generate_electrostatic_map</span><span class="p">()</span>
+        
+        <span class="c1"># Step 5: Generate VDW maps</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">generate_vdw_maps</span><span class="p">()</span>
+        
+        <span class="c1"># Step 6: Apply Gaussian smoothing</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">apply_gaussian_smoothing</span><span class="p">()</span>
+        
+        <span class="c1"># Return a dictionary of grid files for use in RigidBodyType</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_grid_files</span><span class="p">()</span></div>
+
+        
+<div class="viewcode-block" id="StructureProcessor.align_structure">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.align_structure">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">align_structure</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Align structure to principal axes using VMD.&quot;&quot;&quot;</span>
+        <span class="c1"># Write alignment TCL script</span>
+        <span class="n">align_tcl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;align.tcl&quot;</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">align_tcl</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span>
+            <span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;&#39;&#39;lassign $argv prefix</span>
+<span class="s1">set seltext all</span>
+
+<span class="s1">proc rotationIsRightHanded {R {tol 0.01}} {</span>
+<span class="s1">    set x [coordtrans $R {1 0 0}]</span>
+<span class="s1">    set y [coordtrans $R {0 1 0}]</span>
+<span class="s1">    set z [coordtrans $R {0 0 1}]</span>
+
+<span class="s1">    set l [veclength [vecsub $z [veccross $x $y]]]</span>
+<span class="s1">    return [expr {$l &lt; $tol}]</span>
+<span class="s1">}</span>
+
+<span class="s1">set ID [mol new $prefix.psf]</span>
+<span class="s1">mol addfile $prefix.pdb waitfor all</span>
+<span class="s1">set all [atomselect $ID all]</span>
+<span class="s1">set sel [atomselect $ID $seltext]</span>
+
+<span class="s1">## Center system on $sel</span>
+<span class="s1">$all moveby [vecinvert [measure center $sel weight mass]]</span>
+
+<span class="s1">set continue 1</span>
+<span class="s1">while { $continue } {</span>
+<span class="s1">    ## Get current moment of inertia to determine rotation to align</span>
+<span class="s1">    lassign [measure inertia $sel moments] com principleAxes</span>
+
+<span class="s1">    ## Convert 3x3 rotation to 4x4 vmd transformation</span>
+<span class="s1">    set R [trans_from_rotate $principleAxes]</span>
+<span class="s1">    ## Fix left-handed principle axes sometimes returned by &#39;measure inertia&#39;</span>
+<span class="s1">    if { ! [rotationIsRightHanded $R] } {</span>
+<span class="s1">        puts &quot;This was true&quot;</span>
+<span class="s1">        # puts &quot;rotation $R is not right handed! Fixing!&quot;</span>
+<span class="s1">        set R [transmult {{1 0 0 0} {0 1 0 0} {0 0 -1 0} {0 0 0 1}} $R]</span>
+<span class="s1">    }</span>
+
+<span class="s1">    puts &quot;My rotation is here: $R&quot;</span>
+<span class="s1">    puts &quot;My second line is here: [lassign [measure inertia $sel moments] com principleAxes]&quot;</span>
+
+<span class="s1">    ## Apply rotation and check that it worked</span>
+<span class="s1">    $all move $R</span>
+
+<span class="s1">    ## Get current moment of inertia to determine rotation to align</span>
+
+<span class="s1">    lassign [measure inertia $sel moments] com principleAxes moments</span>
+<span class="s1">    puts $principleAxes</span>
+<span class="s1">    set goodcount 0</span>
+<span class="s1">    foreach x0 {{1 0 0} {0 1 0} {0 0 1}} {</span>
+<span class="s1">        set x [coordtrans [trans_from_rotate $principleAxes] $x0]</span>
+<span class="s1">        if {[veclength [vecsub $x $x0]] &lt; 0.01} {</span>
+<span class="s1">            incr goodcount</span>
+<span class="s1">        }</span>
+<span class="s1">    }</span>
+<span class="s1">    if { $goodcount == 3 } {</span>
+<span class="s1">        set continue 0</span>
+<span class="s1">    }</span>
+<span class="s1">}</span>
+
+<span class="s1">## Write transformation matrix to return to original conformation</span>
+<span class="s1">set ch [open $prefix.rotate-back.txt w]</span>
+<span class="s1">foreach line [trans_to_rotate [transtranspose $R]] {</span>
+<span class="s1">    puts $ch $line</span>
+<span class="s1">}</span>
+<span class="s1">close $ch</span>
+
+<span class="s1">## Write out moments of inertia</span>
+<span class="s1">set ms &quot;&quot;</span>
+<span class="s1">foreach m $moments { lappend ms [veclength $m] }</span>
+<span class="s1">set ch [open $prefix.inertia.txt w]</span>
+<span class="s1">puts $ch $ms</span>
+<span class="s1">close $ch</span>
+
+<span class="s1">## Write out mass</span>
+<span class="s1">set ch [open $prefix.mass.txt w]</span>
+<span class="s1">puts $ch [measure sumweights $sel weight mass]</span>
+<span class="s1">close $ch</span>
+
+<span class="s1">## Write out dimension</span>
+<span class="s1">set ch [open $prefix.dimension.dat w]</span>
+<span class="s1">set minmax [measure minmax $sel]</span>
+<span class="s1">set x_dim [expr [lindex [lindex $minmax 1] 0] - [lindex [lindex $minmax 0] 0]]</span>
+<span class="s1">set y_dim [expr [lindex [lindex $minmax 1] 1] - [lindex [lindex $minmax 0] 1]]</span>
+<span class="s1">set z_dim [expr [lindex [lindex $minmax 1] 2] - [lindex [lindex $minmax 0] 2]]</span>
+<span class="s1">puts $ch $x_dim</span>
+<span class="s1">puts $ch $y_dim</span>
+<span class="s1">puts $ch $z_dim</span>
+<span class="s1">close $ch</span>
+
+<span class="s1">## Write out psf, pdb of transformed selection</span>
+<span class="s1">$sel writepdb $prefix.aligned.pdb</span>
+<span class="s1">$sel writepsf $prefix.aligned.psf&#39;&#39;&#39;</span><span class="p">)</span>
+
+        <span class="c1"># Run alignment</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">vmd_path</span><span class="si">}</span><span class="s2"> -dispdev text -args </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2"> &lt; </span><span class="si">{</span><span class="n">align_tcl</span><span class="si">}</span><span class="s2">&quot;</span>
+        <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Verify alignment succeeded</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aligned_pdb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.aligned.pdb&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aligned_psf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.aligned.psf&quot;</span>
+        
+        <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">aligned_pdb</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">aligned_psf</span><span class="o">.</span><span class="n">exists</span><span class="p">()):</span>
+            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Alignment failed for </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Read mass and inertia</span>
+        <span class="n">mass_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.mass.txt&quot;</span>
+        <span class="n">inertia_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.inertia.txt&quot;</span>
+        
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">mass_file</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">inertia_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Mass or inertia file not found after alignment&quot;</span><span class="p">)</span>
+            
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">mass_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">mass</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
+            
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">inertia_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">moment_of_inertia</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()]</span>
+            
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Structure aligned: Mass = </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="si">}</span><span class="s2">, Inertia = </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">moment_of_inertia</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+        
+<div class="viewcode-block" id="StructureProcessor.calculate_hydrodynamic_properties">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">calculate_hydrodynamic_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Calculate hydrodynamic properties using HydroPro.&quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">hydro_path</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;HydroPro executable not provided, using default values&quot;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span> <span class="o">=</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span> <span class="o">=</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]</span>
+            <span class="k">return</span>
+            
+        <span class="c1"># Initialize HydroPro runner</span>
+        <span class="n">hydro_runner</span> <span class="o">=</span> <span class="n">HydroProRunner</span><span class="p">(</span>
+            <span class="n">mass</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">mass</span><span class="p">,</span>
+            <span class="n">binary_path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">hydro_path</span><span class="p">,</span>
+            <span class="n">temperature</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="p">,</span>
+            <span class="n">viscosity</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">viscosity</span><span class="p">,</span>
+            <span class="n">solvent_density</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">solvent_density</span><span class="p">,</span>
+            <span class="n">structure_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span>
+        <span class="p">)</span>
+        
+        <span class="c1"># Write config</span>
+        <span class="n">hydro_runner</span><span class="o">.</span><span class="n">write_config</span><span class="p">(</span><span class="n">output_path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;hydropro.dat&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Prepare for HydroPro run</span>
+        <span class="n">hydro_pdb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;hydro.pdb&quot;</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="c1"># Create symlink to aligned PDB</span>
+            <span class="k">if</span> <span class="n">hydro_pdb</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">hydro_pdb</span><span class="p">)</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">symlink</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">aligned_pdb</span><span class="p">,</span> <span class="n">hydro_pdb</span><span class="p">)</span>
+            
+            <span class="c1"># Run HydroPro</span>
+            <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;cd </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="si">}</span><span class="s2"> &amp;&amp; </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">hydro_path</span><span class="si">}</span><span class="s2">&quot;</span>
+            <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+            
+            <span class="c1"># Parse results - handle possible filename truncation in HydroPro</span>
+            <span class="n">results_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">-res.txt&quot;</span>
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">results_file</span><span class="o">.</span><span class="n">exists</span><span class="p">()</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">20</span><span class="p">:</span>
+                <span class="n">short_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="p">[:</span><span class="mi">20</span><span class="p">]</span>
+                <span class="n">results_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">short_name</span><span class="si">}</span><span class="s2">-res.txt&quot;</span>
+                
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">results_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;HydroPro results file not found, checking for any -res.txt file&quot;</span><span class="p">)</span>
+                <span class="n">results_files</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">&quot;*-res.txt&quot;</span><span class="p">))</span>
+                <span class="k">if</span> <span class="n">results_files</span><span class="p">:</span>
+                    <span class="n">results_file</span> <span class="o">=</span> <span class="n">results_files</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="s2">&quot;No HydroPro results file found&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Parse damping coefficients</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span> <span class="o">=</span> <span class="n">hydro_runner</span><span class="o">.</span><span class="n">parse_output</span><span class="p">(</span><span class="n">results_file</span><span class="p">)</span>
+            
+            <span class="c1"># Write to a damping-coeffs.txt file for reference</span>
+            <span class="n">damping_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.damping-coeffs.txt&quot;</span>
+            <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">damping_file</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+                <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
+                
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Hydrodynamic properties: trans_damp=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span><span class="si">}</span><span class="s2">, rot_damp=</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error calculating hydrodynamic properties: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">transdamp</span> <span class="o">=</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">rotdamp</span> <span class="o">=</span> <span class="p">[</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">]</span>
+        <span class="k">finally</span><span class="p">:</span>
+            <span class="c1"># Clean up</span>
+            <span class="k">if</span> <span class="n">hydro_pdb</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">hydro_pdb</span><span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="StructureProcessor.generate_charge_distribution">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">generate_charge_distribution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resolution</span><span class="o">=</span><span class="mf">2.0</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate charge distribution using VMD.&quot;&quot;&quot;</span>
+        <span class="n">aligned_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.aligned&quot;</span>
+        
+        <span class="c1"># Create TCL script for VMD</span>
+        <span class="n">charge_tcl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;charge.tcl&quot;</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">charge_tcl</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&#39;&#39;lassign $argv prefix</span>
+<span class="s1">set resolution </span><span class="si">{</span><span class="n">resolution</span><span class="si">}</span>
+<span class="s1">set ID [mol new $prefix.psf]</span>
+<span class="s1">mol addfile $prefix.pdb</span>
+<span class="s1">set all [atomselect $ID all]</span>
+<span class="s1">set netCharge [measure sumweights $all weight charge]</span>
+
+<span class="s1">## Write out charge density</span>
+<span class="s1">volmap density $all -o $prefix.chargeDensity.dx -res $resolution -weight charge</span>
+<span class="s1">## Write out pqr for subsequent EM calculation</span>
+<span class="s1">$all writepqr $prefix.pqr</span>
+
+<span class="s1">set ch [open $prefix.netCharge.dat w]</span>
+<span class="s1">puts $ch $netCharge</span>
+<span class="s1">close $ch</span>
+
+<span class="s1">set ch [open $prefix.dimension.dat w]</span>
+<span class="s1">set minmax [measure minmax $all]</span>
+<span class="s1">set x_dim [expr [lindex [lindex $minmax 1] 0] - [lindex [lindex $minmax 0] 0]]</span>
+<span class="s1">set y_dim [expr [lindex [lindex $minmax 1] 1] - [lindex [lindex $minmax 0] 1]]</span>
+<span class="s1">set z_dim [expr [lindex [lindex $minmax 1] 2] - [lindex [lindex $minmax 0] 2]]</span>
+<span class="s1">puts $ch $x_dim</span>
+<span class="s1">puts $ch $y_dim</span>
+<span class="s1">puts $ch $z_dim</span>
+<span class="s1">close $ch&#39;&#39;&#39;</span><span class="p">)</span>
+        
+        <span class="c1"># Run VMD to generate charge density</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">vmd_path</span><span class="si">}</span><span class="s2"> -dispdev text -args </span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2"> &lt; </span><span class="si">{</span><span class="n">charge_tcl</span><span class="si">}</span><span class="s2">&quot;</span>
+        <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Fix charge distribution</span>
+        <span class="n">charge_dx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.chargeDensity.dx&quot;</span>
+        <span class="n">charge_out</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.charge.dx&quot;</span>
+        <span class="n">netcharge_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.netCharge.dat&quot;</span>
+        
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">charge_dx</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Charge density file not found: </span><span class="si">{</span><span class="n">charge_dx</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Fix charge distribution - fix scientific notation in file</span>
+        <span class="n">temp_file1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;temp0.dx&quot;</span>
+        <span class="n">temp_file2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;temp1.dx&quot;</span>
+        
+        <span class="c1"># Handle numbers without decimal point in scientific notation</span>
+        <span class="n">cmd_in</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;sed -r &#39;s/^([0-9]+)e/</span><span class="se">\\</span><span class="s2">1.0e/g; s/ ([0-9]+)e/ </span><span class="se">\\</span><span class="s2">1.0e/g&#39; </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">charge_dx</span><span class="p">)</span><span class="si">}</span><span class="s2"> &gt; </span><span class="si">{</span><span class="n">temp_file1</span><span class="si">}</span><span class="s2">&quot;</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">cmd_in</span><span class="p">)</span>
+        <span class="n">cmd_in</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;sed -r &#39;s/^(-[0-9]+)e/</span><span class="se">\\</span><span class="s2">1.0e/g; s/ (-[0-9]+)e/ </span><span class="se">\\</span><span class="s2">1.0e/g&#39; </span><span class="si">{</span><span class="n">temp_file1</span><span class="si">}</span><span class="s2"> &gt; </span><span class="si">{</span><span class="n">temp_file2</span><span class="si">}</span><span class="s2">&quot;</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="n">cmd_in</span><span class="p">)</span>
+        
+        <span class="c1"># Read net charge</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">netcharge_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">fin</span><span class="p">:</span>
+            <span class="n">netCharge</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">fin</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
+        
+        <span class="c1"># Load grid data</span>
+        <span class="n">grid</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="n">delta</span> <span class="o">=</span> <span class="n">loadGrid</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">temp_file2</span><span class="p">))</span>
+        <span class="n">grid</span> <span class="o">=</span> <span class="n">grid</span> <span class="o">*</span> <span class="n">resolution</span><span class="o">**</span><span class="mi">3</span>
+        
+        <span class="c1"># Fix charge to match net charge</span>
+        <span class="n">ids</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">grid</span><span class="p">[:])</span> <span class="o">&gt;</span> <span class="mf">0.01</span><span class="p">)</span>
+        <span class="n">numPoints</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">size</span><span class="p">(</span><span class="n">ids</span><span class="p">)</span>
+        <span class="k">while</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">grid</span><span class="p">)</span> <span class="o">-</span> <span class="n">netCharge</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mf">0.0001</span> <span class="ow">and</span> <span class="n">numPoints</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="n">grid</span><span class="p">[</span><span class="n">ids</span><span class="p">]</span> <span class="o">=</span> <span class="n">grid</span><span class="p">[</span><span class="n">ids</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="n">netCharge</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">grid</span><span class="p">))</span> <span class="o">/</span> <span class="n">numPoints</span>
+        
+        <span class="c1"># Write output</span>
+        <span class="n">writeDx</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">charge_out</span><span class="p">),</span> <span class="n">grid</span><span class="p">,</span> <span class="n">origin</span><span class="p">,</span> <span class="p">[</span><span class="n">delta</span><span class="p">,</span> <span class="n">delta</span><span class="p">,</span> <span class="n">delta</span><span class="p">])</span>
+        
+        <span class="c1"># Clean up temporary files</span>
+        <span class="k">try</span><span class="p">:</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">temp_file1</span><span class="p">)</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">temp_file2</span><span class="p">)</span>
+        <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+            <span class="k">pass</span>
+            
+        <span class="bp">self</span><span class="o">.</span><span class="n">charge_dx</span> <span class="o">=</span> <span class="n">charge_out</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">charge_density_dx</span> <span class="o">=</span> <span class="n">charge_dx</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Charge distribution generated with net charge: </span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">grid</span><span class="p">)</span><span class="si">:</span><span class="s2">.6f</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="StructureProcessor.generate_electrostatic_map">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">generate_electrostatic_map</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buffer</span><span class="o">=</span><span class="mi">50</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate electrostatic potential map using APBS.&quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">apbs_path</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;APBS executable not provided, skipping electrostatic calculations&quot;</span><span class="p">)</span>
+            <span class="k">return</span>
+        
+        <span class="n">aligned_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.aligned&quot;</span>
+        
+        <span class="c1"># Read system dimensions</span>
+        <span class="n">dimension_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.dimension.dat&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">dimension_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Dimension file not found: </span><span class="si">{</span><span class="n">dimension_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">dimension_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">dimensions</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()]</span>
+            
+        <span class="c1"># Initialize APBS runner</span>
+        <span class="n">apbs_runner</span> <span class="o">=</span> <span class="n">APBSRunner</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">apbs_path</span><span class="p">)</span>
+        
+        <span class="c1"># Write APBS configuration using the runner</span>
+        <span class="n">apbs_runner</span><span class="o">.</span><span class="n">write_config</span><span class="p">(</span>
+            <span class="n">structure_name</span><span class="o">=</span><span class="n">aligned_name</span><span class="p">,</span> 
+            <span class="n">xyz_dims</span><span class="o">=</span><span class="n">dimensions</span><span class="p">,</span>
+            <span class="n">salt_conc</span><span class="o">=</span><span class="mf">0.15</span><span class="p">,</span>
+            <span class="n">temperature</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">temperature</span><span class="p">,</span>
+            <span class="n">buffer</span><span class="o">=</span><span class="n">buffer</span>
+        <span class="p">)</span>
+        
+        <span class="c1"># Run APBS</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;cd </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="si">}</span><span class="s2"> &amp;&amp; </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">apbs_path</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.apbs&quot;</span>
+        <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Bound the potential values</span>
+        <span class="n">tmp_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.elec.tmp.dx&quot;</span>
+        <span class="n">out_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.elec.dx&quot;</span>
+        <span class="n">Bound_grid</span><span class="p">(</span>
+            <span class="n">inFile</span><span class="o">=</span><span class="n">tmp_file</span><span class="p">,</span>
+            <span class="n">outFile</span><span class="o">=</span><span class="n">out_file</span><span class="p">,</span>
+            <span class="n">lowerBound</span><span class="o">=-</span><span class="mi">20</span><span class="p">,</span>
+            <span class="n">upperBound</span><span class="o">=</span><span class="mi">20</span>
+        <span class="p">)</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">elec_dx</span> <span class="o">=</span> <span class="n">out_file</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Electrostatic map generated for </span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="StructureProcessor.generate_vdw_maps">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">generate_vdw_maps</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">potResolution</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">denResolution</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Generate VDW maps using VMD.&quot;&quot;&quot;</span>
+        <span class="n">aligned_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.aligned&quot;</span>
+        
+        <span class="c1"># Create VDW TCL script</span>
+        <span class="n">vdw_tcl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;vdw.tcl&quot;</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">vdw_tcl</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&#39;&#39;lassign $argv prefix</span>
+<span class="s1">package require inorganicbuilder</span>
+<span class="s1">set id [mol new $prefix.psf]</span>
+<span class="s1">mol addfile $prefix.pdb</span>
+
+<span class="s1"># Create temp folders</span>
+<span class="s1">set params_folder &quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">parameters_folder</span><span class="si">}</span><span class="s1">&quot;</span>
+<span class="s1">if </span><span class="se">{{</span><span class="s1">![file exists $params_folder]</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">    file mkdir $params_folder</span>
+<span class="se">}}</span>
+
+<span class="s1"># Load parameters</span>
+<span class="s1">global env</span>
+<span class="s1">set statefilename &quot;$params_folder/vdw.spt&quot;</span>
+<span class="s1">set statefile [open $statefilename w]</span>
+<span class="s1">set psffile $env(INORGANICBUILDER_BASEDIR)/spt/parameters/prot/prot-masses.spt</span>
+<span class="s1">puts &quot;loading parameters from $psffile&quot;</span>
+<span class="s1">source $psffile</span>
+<span class="s1">close $statefile</span>
+<span class="s1"># Define selection</span>
+<span class="s1">set sel [atomselect top all]</span>
+
+<span class="s1"># Loop over heavy atom clusters</span>
+<span class="s1">for </span><span class="se">{{</span><span class="s1">set i 0</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span><span class="s1">$i &lt;= </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">num_heavy_cluster</span><span class="si">}</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span><span class="s1">incr i</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">    # Get atom types</span>
+<span class="s1">    set typemap  [dict create]</span>
+<span class="s1">    set typemap_reverse [dict create]</span>
+<span class="s1">    set types [lsort -unique [$sel get type]]</span>
+<span class="s1">    foreach t $types </span><span class="se">{{</span>
+<span class="s1">        set key [subst $t]</span>
+<span class="s1">        set vdw_type [subst $t]</span>
+<span class="s1">        if </span><span class="se">{{</span><span class="s1">![info exists VDW_TYPEMAP($key)]</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            puts &quot;No match for type $key, using default vdW parameters&quot;</span>
+<span class="s1">            set vdw_type &quot;CT&quot;</span>
+<span class="s1">        </span><span class="se">}}</span><span class="s1"> else </span><span class="se">{{</span>
+<span class="s1">            set vdw_type $VDW_TYPEMAP($key)</span>
+<span class="s1">        </span><span class="se">}}</span>
+<span class="s1">        dict set typemap $key $vdw_type</span>
+<span class="s1">        dict set typemap_reverse $vdw_type $key</span>
+<span class="s1">    </span><span class="se">}}</span>
+
+<span class="s1">    # Create VDW potential and density maps</span>
+<span class="s1">    set clust [expr $i % 4]</span>
+<span class="s1">    puts &quot;clust=$clust&quot;</span>
+<span class="s1">    </span>
+<span class="s1">    # Map atom type to VDW cluster</span>
+<span class="s1">    set vdwsel [atomselect top &quot;all&quot;]</span>
+<span class="s1">    set vdwtypes [list]</span>
+<span class="s1">    set vdwatomtypes [list]</span>
+<span class="s1">    set sel_type [$vdwsel get type]</span>
+<span class="s1">    # Remap into VDW types</span>
+<span class="s1">    foreach atype $sel_type </span><span class="se">{{</span>
+<span class="s1">        set vdwtype [dict get $typemap $atype]</span>
+<span class="s1">        set vdwsplit [split $vdwtype &quot;_&quot;]</span>
+<span class="s1">        set vdwgroup [lindex $vdwsplit 0]</span>
+<span class="s1">        </span>
+<span class="s1">        # Determine cluster membership</span>
+<span class="s1">        if </span><span class="se">{{</span><span class="s1">$i == 0</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            lappend vdwtypes &quot;VDW&quot;</span>
+<span class="s1">            lappend vdwatomtypes $vdwtype</span>
+<span class="s1">        </span><span class="se">}}</span><span class="s1"> elseif </span><span class="se">{{</span><span class="s1">([string compare -length 1 $vdwgroup &quot;C&quot;] == 0) &amp;&amp; ($clust == 1)</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            lappend vdwtypes &quot;VDW&quot;</span>
+<span class="s1">            lappend vdwatomtypes $vdwtype</span>
+<span class="s1">        </span><span class="se">}}</span><span class="s1"> elseif </span><span class="se">{{</span><span class="s1">([string compare -length 1 $vdwgroup &quot;N&quot;] == 0 || [string compare -length 2 $vdwgroup &quot;ON&quot;] == 0 || [string compare -length 2 $vdwgroup &quot;SN&quot;] == 0) &amp;&amp; ($clust == 2)</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            lappend vdwtypes &quot;VDW&quot;</span>
+<span class="s1">            lappend vdwatomtypes $vdwtype</span>
+<span class="s1">        </span><span class="se">}}</span><span class="s1"> elseif </span><span class="se">{{</span><span class="s1">([string compare -length 1 $vdwgroup &quot;O&quot;] == 0 || [string compare -length 2 $vdwgroup &quot;OS&quot;] == 0 || [string compare -length 1 $vdwgroup &quot;S&quot;] == 0) &amp;&amp; ($clust == 3)</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            lappend vdwtypes &quot;VDW&quot;</span>
+<span class="s1">            lappend vdwatomtypes $vdwtype</span>
+<span class="s1">        </span><span class="se">}}</span><span class="s1"> else </span><span class="se">{{</span>
+<span class="s1">            lappend vdwtypes &quot;NONE&quot;</span>
+<span class="s1">            lappend vdwatomtypes &quot;NONE&quot;</span>
+<span class="s1">        </span><span class="se">}}</span>
+<span class="s1">    </span><span class="se">}}</span>
+<span class="s1">    $vdwsel set user 0</span>
+<span class="s1">    $vdwsel set beta 1.0</span>
+<span class="s1">    </span>
+<span class="s1">    # Assign user values</span>
+<span class="s1">    for </span><span class="se">{{</span><span class="s1">set j 0</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span><span class="s1">$j &lt; [$vdwsel num]</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span><span class="s1">incr j</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">        set vdwtype [lindex $vdwtypes $j]</span>
+<span class="s1">        if </span><span class="se">{{</span><span class="s1">[string compare $vdwtype &quot;VDW&quot;] == 0</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            set atomtype [lindex $vdwatomtypes $j]</span>
+<span class="s1">            set radius $VDW_RADIUS($atomtype)</span>
+<span class="s1">            set epsilon $VDW_EPSILON($atomtype)</span>
+<span class="s1">            set user [expr $radius * sqrt($epsilon)]</span>
+<span class="s1">            $vdwsel set user $user index $j</span>
+<span class="s1">        </span><span class="se">}}</span>
+<span class="s1">    </span><span class="se">}}</span>
+<span class="s1">    </span>
+<span class="s1">    # Generate density map</span>
+<span class="s1">    volmap density $vdwsel -res </span><span class="si">{</span><span class="n">denResolution</span><span class="si">}</span><span class="s1"> -weight user -o &quot;$prefix.vdw$i.den.dx&quot;</span>
+<span class="s1">    </span>
+<span class="s1">    # Generate potential map</span>
+<span class="s1">    set pot_outfile &quot;$prefix.vdw$i.pot.dx&quot;</span>
+<span class="s1">    if </span><span class="se">{{</span><span class="s1">$i == 0</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">        puts &quot;generating $pot_outfile&quot;</span>
+<span class="s1">        volmap occupancy $vdwsel -res </span><span class="si">{</span><span class="n">potResolution</span><span class="si">}</span><span class="s1"> -o &quot;$pot_outfile&quot;</span>
+<span class="s1">    </span><span class="se">}}</span><span class="s1"> else </span><span class="se">{{</span>
+<span class="s1">        set vdwsel2 [atomselect top &quot;user &gt; 0&quot;]</span>
+<span class="s1">        if </span><span class="se">{{</span><span class="s1">[$vdwsel2 num] &gt; 0</span><span class="se">}}</span><span class="s1"> </span><span class="se">{{</span>
+<span class="s1">            volmap occupancy $vdwsel2 -res </span><span class="si">{</span><span class="n">potResolution</span><span class="si">}</span><span class="s1"> -o &quot;$pot_outfile&quot;</span>
+<span class="s1">        </span><span class="se">}}</span>
+<span class="s1">        $vdwsel2 delete</span>
+<span class="s1">    </span><span class="se">}}</span>
+<span class="se">}}</span>
+<span class="s1">&#39;&#39;&#39;</span><span class="p">)</span>
+        
+        <span class="c1"># Run VMD to generate VDW maps</span>
+        <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;VMDNOCUDA=1 </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">vmd_path</span><span class="si">}</span><span class="s2"> -dispdev text -args </span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2"> &lt; </span><span class="si">{</span><span class="n">vdw_tcl</span><span class="si">}</span><span class="s2">&quot;</span>
+        <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Process all VDW maps</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vdw_pot_dxs</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vdw_den_dxs</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">num_heavy_cluster</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
+            <span class="n">pot_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.vdw</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">.pot.dx&quot;</span>
+            <span class="n">den_file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.vdw</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">.den.dx&quot;</span>
+            
+            <span class="k">if</span> <span class="ow">not</span> <span class="n">pot_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;VDW potential file not found: </span><span class="si">{</span><span class="n">pot_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">continue</span>
+                
+            <span class="c1"># Bound the potential values</span>
+
+            <span class="n">Bound_grid</span><span class="p">(</span><span class="n">inFile</span><span class="o">=</span><span class="n">pot_file</span><span class="p">,</span>
+                <span class="n">outFile</span><span class="o">=</span><span class="n">pot_file</span><span class="p">,</span>
+                <span class="n">lowerBound</span><span class="o">=-</span><span class="mi">20</span><span class="p">,</span>
+                <span class="n">upperBound</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
+            
+            <span class="c1"># Store for later smoothing</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">vdw_pot_dxs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pot_file</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">vdw_den_dxs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">den_file</span><span class="p">)</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;VDW maps generated for </span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="StructureProcessor.apply_gaussian_smoothing">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">apply_gaussian_smoothing</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">gaussianWidth</span><span class="o">=</span><span class="mf">2.5</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Apply Gaussian smoothing to all potential maps.&quot;&quot;&quot;</span>
+        <span class="n">aligned_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">base_name</span><span class="si">}</span><span class="s2">.aligned&quot;</span>
+        
+        <span class="c1"># Create a tcl script for VMD to do the smoothing</span>
+        <span class="n">smooth_tcl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;smooth.tcl&quot;</span>
+        
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">smooth_tcl</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;&#39;&#39;</span>
+<span class="s1"># Get input parameters</span>
+<span class="s1">lassign $</span><span class="se">{{</span><span class="s1">argv</span><span class="se">}}</span><span class="s1"> in_file out_file</span>
+<span class="s1">puts &quot;Smoothing $in_file to $out_file&quot;</span>
+
+<span class="s1"># Load the volumetric data</span>
+<span class="s1">mol new $in_file</span>
+
+<span class="s1"># Apply smoothing</span>
+<span class="s1">set molid [molinfo top]</span>
+<span class="s1">set vol [molinfo $molid get </span><span class="si">{</span><span class="mi">0</span><span class="si">}</span><span class="s1">]</span>
+<span class="s1">volutil smooth $vol -gaussiansigma </span><span class="si">{</span><span class="n">gaussianWidth</span><span class="si">}</span>
+
+<span class="s1"># Save the result</span>
+<span class="s1">volutil save $vol $out_file</span>
+
+<span class="s1"># Exit</span>
+<span class="s1">quit</span>
+<span class="s1">&#39;&#39;&#39;</span><span class="p">)</span>
+            
+        <span class="c1"># Smooth electrostatic map</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">elec_dx</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">elec_dx</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="n">smoothed_elec</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.elec.smoothed.dx&quot;</span>
+            <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">vmd_path</span><span class="si">}</span><span class="s2"> -dispdev text -args </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">elec_dx</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">smoothed_elec</span><span class="si">}</span><span class="s2"> &lt; </span><span class="si">{</span><span class="n">smooth_tcl</span><span class="si">}</span><span class="s2">&quot;</span>
+            <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">elec_smoothed_dx</span> <span class="o">=</span> <span class="n">smoothed_elec</span>
+            
+        <span class="c1"># Smooth VDW potential maps</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">vdw_smoothed_dxs</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">pot_file</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vdw_pot_dxs</span><span class="p">):</span>
+            <span class="k">if</span> <span class="n">pot_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">smoothed_pot</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">aligned_name</span><span class="si">}</span><span class="s2">.vdw</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">.pot.smoothed.dx&quot;</span>
+                <span class="n">cmd</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">vmd_path</span><span class="si">}</span><span class="s2"> -dispdev text -args </span><span class="si">{</span><span class="n">pot_file</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">smoothed_pot</span><span class="si">}</span><span class="s2"> &lt; </span><span class="si">{</span><span class="n">smooth_tcl</span><span class="si">}</span><span class="s2">&quot;</span>
+                <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">vdw_smoothed_dxs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">smoothed_pot</span><span class="p">)</span>
+                
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Applied Gaussian smoothing to potential maps (width=</span><span class="si">{</span><span class="n">gaussianWidth</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span></div>
+
+    
+    
+<div class="viewcode-block" id="StructureProcessor.get_grid_files">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">get_grid_files</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Get dictionary of grid files for use in RigidBodyType.&quot;&quot;&quot;</span>
+        <span class="n">potential_grids</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="n">charge_grids</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="c1"># Add electrostatic grid</span>
+        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;elec_smoothed_dx&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">elec_smoothed_dx</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">elec_smoothed_dx</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="n">potential_grids</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s2">&quot;elec&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">elec_smoothed_dx</span><span class="p">),</span> <span class="mf">0.59616195</span><span class="p">))</span>
+        
+        <span class="c1"># Add charge grid</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">charge_dx</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">charge_dx</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+            <span class="n">charge_grids</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s2">&quot;elec&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">charge_dx</span><span class="p">)))</span>
+        
+        <span class="c1"># Add VDW grids</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">pot_file</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vdw_smoothed_dxs</span><span class="p">):</span>
+            <span class="n">vdw_key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;vdw</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
+            <span class="k">if</span> <span class="n">pot_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">potential_grids</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">vdw_key</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">pot_file</span><span class="p">),</span> <span class="mf">0.59616195</span><span class="p">))</span>
+                
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">den_file</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vdw_den_dxs</span><span class="p">):</span>
+            <span class="n">vdw_key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;vdw</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span>
+            <span class="k">if</span> <span class="n">den_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                <span class="n">charge_grids</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">vdw_key</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">den_file</span><span class="p">)))</span>
+        
+        <span class="k">return</span> <span class="p">{</span>
+            <span class="s2">&quot;potential_grids&quot;</span><span class="p">:</span> <span class="n">potential_grids</span><span class="p">,</span>
+            <span class="s2">&quot;charge_grids&quot;</span><span class="p">:</span> <span class="n">charge_grids</span><span class="p">}</span></div>
+</div>
+
+        
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/arbdmodel/structure_rigidbody.html b/_build/html/_modules/arbdmodel/structure_rigidbody.html
new file mode 100644
index 0000000000000000000000000000000000000000..cc5deaa7d663765d1bc903258c36ce5d9ed8e9cf
--- /dev/null
+++ b/_build/html/_modules/arbdmodel/structure_rigidbody.html
@@ -0,0 +1,926 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../" >
+
+  <head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>arbdmodel.structure_rigidbody &#8212; ARBD Model Documentation</title>
+  
+  
+  
+  <script data-cfasync="false">
+    document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+    document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+  </script>
+  
+  <!-- Loaded before other Sphinx assets -->
+  <link href="../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+  
+  <link href="../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+  <link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+    <link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=03e43079" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+    <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
+    <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
+    <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
+    <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
+    <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
+  
+  <!-- Pre-loaded scripts that we'll load fully later -->
+  <link rel="preload" as="script" href="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+  <script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+    <script src="../../_static/jquery.js?v=5d32c60e"></script>
+    <script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
+    <script src="../../_static/documentation_options.js?v=9eb32ce0"></script>
+    <script src="../../_static/doctools.js?v=9a2dae69"></script>
+    <script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
+    <script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
+    <script src="../../_static/copybutton.js?v=f281be69"></script>
+    <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+    <script src="../../_static/tabs.js?v=3ee01567"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
+    <script>let toggleHintShow = 'Click to show';</script>
+    <script>let toggleHintHide = 'Click to hide';</script>
+    <script>let toggleOpenOnPrint = 'true';</script>
+    <script src="../../_static/togglebutton.js?v=4a39c7ea"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script src="../../_static/design-tabs.js?v=f930bc37"></script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script async="async" src="../../_static/sphinx-thebe.js?v=c100c467"></script>
+    <script>var togglebuttonSelector = '.toggle, .admonition.dropdown';</script>
+    <script>const THEBE_JS_URL = "https://unpkg.com/thebe@0.8.2/lib/index.js"; const thebe_selector = ".thebe,.cell"; const thebe_selector_input = "pre"; const thebe_selector_output = ".output, .cell_output"</script>
+    <script>window.MathJax = {"options": {"processHtmlClass": "tex2jax_process|mathjax_process|math|output_area"}}</script>
+    <script defer="defer" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
+    <script>DOCUMENTATION_OPTIONS.pagename = '_modules/arbdmodel/structure_rigidbody';</script>
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+  <meta name="viewport" content="width=device-width, initial-scale=1"/>
+  <meta name="docsearch:language" content="en"/>
+  </head>
+  
+  
+  <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+  
+  
+  <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+  
+  <div id="pst-scroll-pixel-helper"></div>
+  
+  <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+    <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-primary-sidebar-checkbox"/>
+  <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+  
+  <input type="checkbox"
+          class="sidebar-toggle"
+          id="pst-secondary-sidebar-checkbox"/>
+  <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+  
+  <div class="search-button__wrapper">
+    <div class="search-button__overlay"></div>
+    <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+      action="../../search.html"
+      method="get">
+  <i class="fa-solid fa-magnifying-glass"></i>
+  <input type="search"
+         class="form-control"
+         name="q"
+         id="search-input"
+         placeholder="Search..."
+         aria-label="Search..."
+         autocomplete="off"
+         autocorrect="off"
+         autocapitalize="off"
+         spellcheck="false"/>
+  <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+  </div>
+
+  <div class="pst-async-banner-revealer d-none">
+  <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+  
+    <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+    </header>
+  
+
+  <div class="bd-container">
+    <div class="bd-container__inner bd-page-width">
+      
+      
+      
+        
+      
+      <div class="bd-sidebar-primary bd-sidebar">
+        
+
+  
+  <div class="sidebar-header-items sidebar-primary__section">
+    
+    
+    
+    
+  </div>
+  
+    <div class="sidebar-primary-items__start sidebar-primary__section">
+        <div class="sidebar-primary-item">
+
+  
+    
+  
+
+<a class="navbar-brand logo" href="../../intro.html">
+  
+  
+  
+  
+  
+  
+    <p class="title logo__title">ARBD Model Documentation</p>
+  
+</a></div>
+        <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+   <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass"></i>
+    <span class="search-button__default-text">Search</span>
+    <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+   </button>
+ `);
+ </script></div>
+        <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+    <div class="bd-toc-item navbar-nav active">
+        <p aria-level="2" class="caption" role="heading"><span class="caption-text">Getting Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Tutorials</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">API Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API Reference</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/core/index.html">Core</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/interaction_potentials/index.html">Interaction Potentials</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/polymer_modeling/index.html">Polymer Modeling</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/rigidbody_models/index.html">RigidBody Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/shape-based_models/index.html">Shape-Based Models</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/simulation_engines/index.html">Simulation Engines</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../api/utilities/index.html">Utilities</a></li>
+</ul>
+
+    </div>
+</nav></div>
+    </div>
+  
+  
+  <div class="sidebar-primary-items__end sidebar-primary__section">
+  </div>
+  
+  <div id="rtd-footer-container"></div>
+
+
+      </div>
+      
+      <main id="main-content" class="bd-main" role="main">
+        
+        
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+          <div class="bd-content">
+            <div class="bd-article-container">
+              
+              <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+  
+    <div class="header-article-items__start">
+      
+        <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+  <span class="fa-solid fa-bars"></span>
+</button></div>
+      
+    </div>
+  
+  
+    <div class="header-article-items__end">
+      
+        <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+
+<button onclick="toggleFullScreen()"
+  class="btn btn-sm btn-fullscreen-button"
+  title="Fullscreen mode"
+  data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+  
+
+<span class="btn__icon-container">
+  <i class="fas fa-expand"></i>
+  </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+    <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+    <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+  </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+  <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+  </button>
+`);
+</script>
+
+</div></div>
+      
+    </div>
+  
+</div>
+</div>
+              
+              
+
+<div id="jb-print-docs-body" class="onlyprint">
+    <h1></h1>
+    <!-- Table of contents -->
+    <div id="print-main-content">
+        <div id="jb-print-toc">
+            
+        </div>
+    </div>
+</div>
+
+              
+                
+<div id="searchbox"></div>
+                <article class="bd-article">
+                  
+  <h1>Source code for arbdmodel.structure_rigidbody</h1><div class="highlight"><pre>
+<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.logger</span><span class="w"> </span><span class="kn">import</span> <span class="n">logger</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">RigidBody</span><span class="p">,</span> <span class="n">RigidBodyType</span><span class="p">,</span> <span class="n">DefaultSimConf</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">ArbdModel</span><span class="p">,</span> <span class="n">ArbdEngine</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.structure_from_pdb</span><span class="w"> </span><span class="kn">import</span> <span class="n">StructureProcessor</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">.coords</span><span class="w"> </span><span class="kn">import</span> <span class="n">Generate_coordinates</span><span class="p">,</span> <span class="n">Generate_spanning_vectors</span>
+
+<span class="sd">&quot;&quot;&quot;Structure rigid body modeling module for ARBD.</span>
+
+<span class="sd">This module provides classes for structure-based rigid body modeling in the ARBD package,</span>
+<span class="sd">using a clean implementation that processes molecular structures into grid maps.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="DiffusiveRigidBodyType">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.DiffusiveRigidBodyType">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">DiffusiveRigidBodyType</span><span class="p">(</span><span class="n">RigidBodyType</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;RigidBodyType subclass for structure-based rigid body objects&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">structure_path</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize structure rigid body type from structure files.</span>
+<span class="sd">        Args:</span>
+<span class="sd">            name: Name identifier for this type</span>
+<span class="sd">            structure_path: Path to structure file (.psf/.pdb)</span>
+<span class="sd">            simconf: SimConf object containing configuration parameters</span>
+<span class="sd">            work_dir: Directory to store processed files (default: current directory)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Create work directory if specified</span>
+        <span class="k">if</span> <span class="n">work_dir</span><span class="p">:</span>
+            <span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="n">name</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.</span><span class="w"> </span><span class="kn">import</span> <span class="n">DefaultSimConf</span>
+            <span class="n">simconf</span> <span class="o">=</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+
+        <span class="c1"># Process the structure to get properties and grid maps</span>
+        <span class="n">processor</span> <span class="o">=</span> <span class="n">StructureProcessor</span><span class="p">(</span>
+            <span class="n">structure_path</span><span class="o">=</span><span class="n">structure_path</span><span class="p">,</span>
+            <span class="n">simconf</span><span class="o">=</span><span class="n">simconf</span><span class="p">,</span>
+            <span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span><span class="p">)</span>
+        
+        <span class="c1"># Process the structure to get all properties and grid files</span>
+        <span class="n">processor</span><span class="o">.</span><span class="n">process_structure</span><span class="p">()</span>
+        
+        <span class="c1"># Initialize the parent class with collected data</span>
+        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
+            <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> 
+            <span class="n">mass</span><span class="o">=</span><span class="n">processor</span><span class="o">.</span><span class="n">mass</span><span class="p">,</span>
+            <span class="n">moment_of_inertia</span><span class="o">=</span><span class="n">processor</span><span class="o">.</span><span class="n">moment_of_inertia</span><span class="p">,</span>
+            <span class="n">damping_coefficient</span><span class="o">=</span><span class="n">processor</span><span class="o">.</span><span class="n">transdamp</span><span class="p">,</span>
+            <span class="n">rotational_damping_coefficient</span><span class="o">=</span><span class="n">processor</span><span class="o">.</span><span class="n">rotdamp</span><span class="p">,</span>
+            <span class="n">potential_grids</span><span class="o">=</span><span class="n">processor</span><span class="o">.</span><span class="n">potential_grids</span><span class="p">,</span>
+            <span class="n">charge_grids</span><span class="o">=</span><span class="n">processor</span><span class="o">.</span><span class="n">charge_grids</span><span class="p">,</span>
+            <span class="n">pmf_grids</span><span class="o">=</span><span class="p">[],</span>
+            <span class="o">**</span><span class="n">kwargs</span>
+        <span class="p">)</span>
+        
+        <span class="c1"># Store file paths for reference</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aligned_pdb</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">aligned_pdb</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aligned_psf</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">aligned_psf</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;StructureRigidBodyType &#39;</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39; initialized successfully&quot;</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="StaticObject">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StaticObject">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">StaticObject</span><span class="p">:</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Class representing a static (immobile) object in the simulation&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">structure_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">simconf</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">is_gigantic</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mi">300</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize static object from a structure file.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure_path: Path to structure file (.psf/.pdb)</span>
+<span class="sd">            name: Name for this static object (defaults to structure filename)</span>
+<span class="sd">            simconf: SimConf object containing configuration parameters</span>
+<span class="sd">            work_dir: Directory to store processed files</span>
+<span class="sd">            is_gigantic: Whether this is a gigantic object requiring segmentation</span>
+<span class="sd">            threshold: Size threshold for segmentation (if is_gigantic=True)</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">structure_path</span><span class="p">)</span> <span class="k">if</span> <span class="n">structure_path</span> <span class="k">else</span> <span class="kc">None</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span><span class="o">.</span><span class="n">stem</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span> <span class="k">else</span> <span class="s2">&quot;static_object&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">is_gigantic</span> <span class="o">=</span> <span class="n">is_gigantic</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="n">threshold</span>
+        
+        <span class="c1"># Set up working directory</span>
+        <span class="k">if</span> <span class="n">work_dir</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">work_dir</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;static_</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span>
+        
+        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Default config if not provided</span>
+        <span class="k">if</span> <span class="n">simconf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">simconf</span> <span class="o">=</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">simconf</span> <span class="o">=</span> <span class="n">simconf</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">potential_grids</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">charge_grids</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">elec_grid</span> <span class="o">=</span> <span class="kc">None</span>
+        
+        <span class="c1"># Process the structure if provided</span>
+        <span class="k">if</span> <span class="n">structure_path</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="p">()</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_find_segments_num</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dimensions</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Find number of segments needed for a gigantic object.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            dimensions: List of dimensions [x, y, z]</span>
+<span class="sd">            threshold: Size threshold for segmentation (defaults to self.threshold)</span>
+<span class="sd">            </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            Tuple of (nx, ny, nz) segment counts</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">threshold</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">threshold</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span>
+            
+        <span class="n">in_xyz</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">elm</span><span class="p">)</span> <span class="k">for</span> <span class="n">elm</span> <span class="ow">in</span> <span class="n">dimensions</span><span class="p">]</span>
+        <span class="n">segments</span> <span class="o">=</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="n">elm</span> <span class="o">/</span> <span class="n">threshold</span><span class="p">)</span> <span class="k">for</span> <span class="n">elm</span> <span class="ow">in</span> <span class="n">in_xyz</span><span class="p">]</span>
+        <span class="k">return</span> <span class="n">segments</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">segments</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">segments</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
+    
+<div class="viewcode-block" id="StaticObject.process">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StaticObject.process">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Process the structure file to create potential and density grids&quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;No structure path provided for static object&quot;</span><span class="p">)</span>
+            <span class="k">return</span>
+            
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_gigantic</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_process_gigantic</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_process_standard</span><span class="p">()</span></div>
+
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_process_standard</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Process the structure normally (without segmentation)&quot;&quot;&quot;</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Processing static object: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Create processor and generate maps</span>
+        <span class="n">processor</span> <span class="o">=</span> <span class="n">StructureProcessor</span><span class="p">(</span>
+            <span class="n">structure_path</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span><span class="p">,</span>
+            <span class="n">simconf</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+            <span class="n">work_dir</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span><span class="p">)</span>
+        
+        <span class="n">processor</span><span class="o">.</span><span class="n">process_structure</span><span class="p">()</span>
+        
+        <span class="c1"># Collect grids from the processor</span>
+        <span class="n">grid_files</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">get_grid_files</span><span class="p">()</span>
+        
+        <span class="c1"># Store grids</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">potential_grids</span> <span class="o">=</span> <span class="n">grid_files</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;potential_grids&#39;</span><span class="p">,</span> <span class="p">[])</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">charge_grids</span> <span class="o">=</span> <span class="n">grid_files</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;charge_grids&#39;</span><span class="p">,</span> <span class="p">[])</span>
+        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="s1">&#39;elec_smoothed_dx&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">processor</span><span class="o">.</span><span class="n">elec_smoothed_dx</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">elec_grid</span> <span class="o">=</span> <span class="n">processor</span><span class="o">.</span><span class="n">elec_smoothed_dx</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="nf">_process_gigantic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Process a gigantic structure by segmentation&quot;&quot;&quot;</span>
+        <span class="kn">from</span><span class="w"> </span><span class="nn">subprocess</span><span class="w"> </span><span class="kn">import</span> <span class="n">run</span>
+        <span class="kn">import</span><span class="w"> </span><span class="nn">MDAnalysis</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">mda</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Processing gigantic static object: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Get dimensions by reading the structure file</span>
+        <span class="n">u</span> <span class="o">=</span> <span class="n">mda</span><span class="o">.</span><span class="n">Universe</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span><span class="p">))</span>
+        <span class="n">min_coords</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">atoms</span><span class="o">.</span><span class="n">positions</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">max_coords</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">atoms</span><span class="o">.</span><span class="n">positions</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+        <span class="n">dimensions</span> <span class="o">=</span> <span class="n">max_coords</span> <span class="o">-</span> <span class="n">min_coords</span>
+        
+        <span class="c1"># Calculate segmentation</span>
+        <span class="n">nx</span><span class="p">,</span> <span class="n">ny</span><span class="p">,</span> <span class="n">nz</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find_segments_num</span><span class="p">(</span><span class="n">dimensions</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">threshold</span><span class="p">)</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Segmenting into </span><span class="si">{</span><span class="n">nx</span><span class="si">}</span><span class="s2">x</span><span class="si">{</span><span class="n">ny</span><span class="si">}</span><span class="s2">x</span><span class="si">{</span><span class="n">nz</span><span class="si">}</span><span class="s2"> parts&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Create segment directory</span>
+        <span class="n">segments_dir</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;segments&quot;</span>
+        <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">segments_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Write VMD script for segmentation</span>
+        <span class="n">segment_script</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">work_dir</span> <span class="o">/</span> <span class="s2">&quot;segment.tcl&quot;</span>
+        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">segment_script</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+            <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;&quot;&quot;</span>
+<span class="s2"># Segment structure</span>
+<span class="s2">mol new </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">structure_path</span><span class="si">}</span>
+<span class="s2">set all [atomselect top all]</span>
+<span class="s2">set mM [measure minmax $all]</span>
+<span class="s2">set dimAl [vecsub [lindex $mM 1] [lindex $mM 0]]</span>
+<span class="s2">set min_x [expr [lindex [lindex $mM 0] 0] - 1]</span>
+<span class="s2">set min_y [expr [lindex [lindex $mM 0] 1] - 1]</span>
+<span class="s2">set min_z [expr [lindex [lindex $mM 0] 2] - 1]</span>
+<span class="s2">set dx [expr ([lindex $dimAl 0] + 2)/</span><span class="si">{</span><span class="n">nx</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2">set dy [expr ([lindex $dimAl 1] + 2)/</span><span class="si">{</span><span class="n">ny</span><span class="si">}</span><span class="s2">]</span>
+<span class="s2">set dz [expr ([lindex $dimAl 2] + 2)/</span><span class="si">{</span><span class="n">nz</span><span class="si">}</span><span class="s2">]</span>
+
+<span class="s2">set count 0</span>
+<span class="s2">for </span><span class="se">{{</span><span class="s2">set i 0</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span><span class="s2">$i &lt; </span><span class="si">{</span><span class="n">nx</span><span class="si">}</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span><span class="s2">incr i</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span>
+<span class="s2">  for </span><span class="se">{{</span><span class="s2">set j 0</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span><span class="s2">$j &lt; </span><span class="si">{</span><span class="n">ny</span><span class="si">}</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span><span class="s2">incr j</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span>
+<span class="s2">    for </span><span class="se">{{</span><span class="s2">set k 0</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span><span class="s2">$k &lt; </span><span class="si">{</span><span class="n">nz</span><span class="si">}</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span><span class="s2">incr k</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span>
+<span class="s2">      set outName </span><span class="si">{</span><span class="n">segments_dir</span><span class="si">}</span><span class="s2">/segment_$count</span>
+<span class="s2">      set low_x [expr $min_x + $i * $dx]</span>
+<span class="s2">      set low_y [expr $min_y + $j * $dy]</span>
+<span class="s2">      set low_z [expr $min_z + $k * $dz]</span>
+<span class="s2">      set up_x [expr $min_x + ($i+1) * $dx]</span>
+<span class="s2">      set up_y [expr $min_y + ($j+1) * $dy]</span>
+<span class="s2">      set up_z [expr $min_z + ($k+1) * $dz]</span>
+<span class="s2">      set sel [atomselect top &quot;(x &gt; $low_x and x &lt; $up_x) and (y &gt; $low_y and y &lt; $up_y) and (z &gt; $low_z and z &lt; $up_z)&quot;]</span>
+<span class="s2">      set sel_N [$sel num]</span>
+<span class="s2">      if </span><span class="se">{{</span><span class="s2">$sel_N &gt; 0</span><span class="se">}}</span><span class="s2"> </span><span class="se">{{</span>
+<span class="s2">        $sel writepqr $outName.pqr</span>
+<span class="s2">        $sel writepsf $outName.psf</span>
+<span class="s2">        $sel writepdb $outName.pdb</span>
+<span class="s2">        set count [expr $count + 1]</span>
+<span class="s2">      </span><span class="se">}}</span>
+<span class="s2">    </span><span class="se">}}</span>
+<span class="s2">  </span><span class="se">}}</span>
+<span class="se">}}</span>
+<span class="s2">exit</span>
+<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Run segmentation</span>
+        <span class="n">vmd_path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="o">.</span><span class="n">get_binary</span><span class="p">(</span><span class="s1">&#39;vmd&#39;</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">vmd_path</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;VMD binary not found in configuration&quot;</span><span class="p">)</span>
+            
+        <span class="n">run</span><span class="p">([</span><span class="n">vmd_path</span><span class="p">,</span> <span class="s2">&quot;-dispdev&quot;</span><span class="p">,</span> <span class="s2">&quot;text&quot;</span><span class="p">,</span> <span class="s2">&quot;-e&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">segment_script</span><span class="p">)],</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+        
+        <span class="c1"># Process each segment</span>
+        <span class="n">segments</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">segments_dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">&quot;segment_*.pdb&quot;</span><span class="p">))</span>
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">segments</span><span class="p">)</span><span class="si">}</span><span class="s2"> segments to process&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Process each segment</span>
+        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">segment</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">segments</span><span class="p">):</span>
+            <span class="n">segment_dir</span> <span class="o">=</span> <span class="n">segments_dir</span> <span class="o">/</span> <span class="n">segment</span><span class="o">.</span><span class="n">stem</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">segment_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+            
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Processing segment </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">segments</span><span class="p">)</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">segment</span><span class="o">.</span><span class="n">stem</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="n">segment_processor</span> <span class="o">=</span> <span class="n">StructureProcessor</span><span class="p">(</span>
+                <span class="n">structure_path</span><span class="o">=</span><span class="n">segment</span><span class="p">,</span>
+                <span class="n">simconf</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+                <span class="n">work_dir</span><span class="o">=</span><span class="n">segment_dir</span><span class="p">)</span>
+            
+            <span class="n">segment_processor</span><span class="o">.</span><span class="n">process_structure</span><span class="p">()</span>
+            
+            <span class="c1"># Collect grid maps from this segment</span>
+            <span class="n">grid_files</span> <span class="o">=</span> <span class="n">segment_processor</span><span class="o">.</span><span class="n">get_grid_files</span><span class="p">()</span>
+            
+            <span class="c1"># Store grids from this segment</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">potential_grids</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">grid_files</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;potential_grids&#39;</span><span class="p">,</span> <span class="p">[]))</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">charge_grids</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">grid_files</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;charge_grids&#39;</span><span class="p">,</span> <span class="p">[]))</span>
+            
+            <span class="c1"># Store the first electrostatic grid as the main one</span>
+            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">segment_processor</span><span class="p">,</span> <span class="s1">&#39;elec_smoothed_dx&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">elec_grid</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">elec_grid</span> <span class="o">=</span> <span class="n">segment_processor</span><span class="o">.</span><span class="n">elec_smoothed_dx</span>
+        
+        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Completed processing gigantic static object: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
+
+    
+<div class="viewcode-block" id="StructureRigidBodyModel">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">StructureRigidBodyModel</span><span class="p">(</span><span class="n">ArbdModel</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Model class for structure-based rigid body simulations&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cell_vectors</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">cell_origin</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                 <span class="n">dimensions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">buffer_factor</span><span class="o">=</span><span class="mf">1.2</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">use_boundary</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> 
+                 <span class="n">boundary_params</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize structure model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            diffusible_objects: List of StructureRigidBody instances for diffusible objects</span>
+<span class="sd">            static_objects: List of StructureRigidBody instances for static objects</span>
+<span class="sd">            cell_vectors: List of 3 cell basis vectors defining the simulation box</span>
+<span class="sd">            cell_origin: Cell origin coordinates</span>
+<span class="sd">            dimensions: Explicit dimensions for the simulation box (overrides cell_vectors)</span>
+<span class="sd">            buffer_factor: Factor to scale dimensions derived from cell vectors</span>
+<span class="sd">            configuration: Configuration object, defaults to DefaultSimConf</span>
+<span class="sd">            use_boundary: Whether to create a boundary potential</span>
+<span class="sd">            boundary_params: Optional parameters for boundary potential (well_depth, resolution, etc.)</span>
+<span class="sd">            **kwargs: Additional arguments passed to ArbdModel</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        
+        <span class="bp">self</span><span class="o">.</span><span class="n">simconf</span> <span class="o">=</span> <span class="n">configuration</span> <span class="ow">or</span> <span class="n">DefaultSimConf</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">diffusible_objects</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">static_objects</span> <span class="o">=</span> <span class="p">[]</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">boundary_potential</span> <span class="o">=</span> <span class="kc">None</span>
+
+        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
+            <span class="n">children</span><span class="o">=</span><span class="p">[],</span> 
+            <span class="n">cell_vectors</span><span class="o">=</span><span class="n">cell_vectors</span><span class="p">,</span> 
+            <span class="n">cell_origin</span><span class="o">=</span><span class="n">cell_origin</span><span class="p">,</span>
+            <span class="n">dimensions</span><span class="o">=</span><span class="n">dimensions</span><span class="p">,</span>
+            <span class="n">buffer_factor</span><span class="o">=</span><span class="n">buffer_factor</span><span class="p">,</span>
+            <span class="n">configuration</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+            <span class="o">**</span><span class="n">kwargs</span>
+        <span class="p">)</span>
+        <span class="c1"># Process boundary if requested</span>
+        <span class="k">if</span> <span class="n">use_boundary</span><span class="p">:</span>
+            <span class="c1"># Create boundary potential</span>
+            <span class="kn">from</span><span class="w"> </span><span class="nn">.interactions</span><span class="w"> </span><span class="kn">import</span> <span class="n">BoundaryPotential</span>
+            
+            <span class="c1"># Use provided boundary parameters or defaults</span>
+            <span class="n">bp_params</span> <span class="o">=</span> <span class="n">boundary_params</span> <span class="ow">or</span> <span class="p">{}</span>
+            
+            <span class="n">boundary</span> <span class="o">=</span> <span class="n">BoundaryPotential</span><span class="p">(</span>
+                <span class="n">cell_vectors</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cell_vectors</span><span class="p">,</span>
+                <span class="n">cell_origin</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cell_origin</span><span class="p">,</span>
+                <span class="n">well_depth</span><span class="o">=</span><span class="n">bp_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;well_depth&#39;</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">),</span>
+                <span class="n">resolution</span><span class="o">=</span><span class="n">bp_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;resolution&#39;</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">),</span>
+                <span class="n">blur</span><span class="o">=</span><span class="n">bp_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;blur&#39;</span><span class="p">,</span> <span class="mf">5.0</span><span class="p">)</span>
+            <span class="p">)</span>
+            
+            <span class="c1"># Generate the boundary file and store it</span>
+            <span class="n">boundary_file</span> <span class="o">=</span> <span class="n">boundary</span><span class="o">.</span><span class="n">write_file</span><span class="p">(</span><span class="n">bp_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;output_file&#39;</span><span class="p">,</span> <span class="s1">&#39;boundary.dx&#39;</span><span class="p">))</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">boundary_potential</span> <span class="o">=</span> <span class="n">boundary</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">add_nonbonded_interaction</span><span class="p">()</span>
+            
+
+<div class="viewcode-block" id="StructureRigidBodyModel.add_diffusible_object">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_diffusible_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">structure_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">rb_type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">copies</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">positions</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> 
+                         <span class="n">orientations</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">initial_region</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">random_seed</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                         <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Add a diffusible (mobile) rigid body type to the model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            structure_path: Path to structure files (.psf/.pdb) to create a StructureRigidBodyType</span>
+<span class="sd">            rb_type: Existing RigidBodyType instance (if structure_path not provided)</span>
+<span class="sd">            copies: Number of copies to add</span>
+<span class="sd">            positions: Optional list of positions for each copy</span>
+<span class="sd">            orientations: Optional list of orientations for each copy</span>
+<span class="sd">            name: Optional base name for the rigid bodies</span>
+<span class="sd">            initial_region: Optional dict with vectors defining initial region</span>
+<span class="sd">            random_seed: Optional seed for random number generator</span>
+<span class="sd">            work_dir: Optional working directory for structure processing</span>
+<span class="sd">        </span>
+<span class="sd">        Returns:</span>
+<span class="sd">            List of created RigidBody instances</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Process the structure to create a RigidBodyType if structure_path provided</span>
+        <span class="k">if</span> <span class="n">structure_path</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="c1"># Create a StructureRigidBodyType from the structure files</span>
+            <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">name</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">structure_path</span><span class="p">)</span><span class="o">.</span><span class="n">stem</span>
+                
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Processing structure files for </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2"> from </span><span class="si">{</span><span class="n">structure_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Create work directory</span>
+            <span class="k">if</span> <span class="n">work_dir</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">work_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="o">.</span><span class="n">cwd</span><span class="p">()</span> <span class="o">/</span> <span class="n">name</span>
+                <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">work_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+            
+            <span class="c1"># Create the RigidBodyType</span>
+            <span class="n">rb_type</span> <span class="o">=</span> <span class="n">DiffusiveRigidBodyType</span><span class="p">(</span>
+                <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
+                <span class="n">structure_path</span><span class="o">=</span><span class="n">structure_path</span><span class="p">,</span>
+                <span class="n">simconf</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span>
+                <span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span><span class="p">)</span>
+            
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Created StructureRigidBodyType for </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+        <span class="k">elif</span> <span class="n">rb_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Either structure_path or rb_type must be provided&quot;</span><span class="p">)</span>
+            
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rb_type</span><span class="p">,</span> <span class="n">RigidBodyType</span><span class="p">):</span>
+            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Object must be a RigidBodyType&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Create base name for rigid bodies of this type</span>
+        <span class="n">base_name</span> <span class="o">=</span> <span class="n">name</span> <span class="ow">or</span> <span class="n">rb_type</span><span class="o">.</span><span class="n">name</span>
+        <span class="n">created_bodies</span> <span class="o">=</span> <span class="p">[]</span>
+        
+        <span class="c1"># Generate positions if not provided</span>
+        <span class="k">if</span> <span class="n">positions</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">copies</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
+            <span class="c1"># Set up default initial region if not provided</span>
+            <span class="k">if</span> <span class="n">initial_region</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">max_dim</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span><span class="p">)</span>
+                <span class="n">initial_region</span> <span class="o">=</span> <span class="p">{</span>
+                    <span class="s1">&#39;bv1&#39;</span><span class="p">:</span> <span class="p">[</span><span class="n">max_dim</span><span class="o">*</span><span class="mf">0.8</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
+                    <span class="s1">&#39;bv2&#39;</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">max_dim</span><span class="o">*</span><span class="mf">0.8</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
+                    <span class="s1">&#39;bv3&#39;</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">max_dim</span><span class="o">*</span><span class="mf">0.8</span><span class="p">],</span>
+                    <span class="s1">&#39;origin&#39;</span><span class="p">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
+                <span class="p">}</span>
+                
+            <span class="c1"># Get dimensions for this rigid body type</span>
+            <span class="n">dimensions</span> <span class="o">=</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">]</span>  <span class="c1"># Default</span>
+            
+            <span class="c1"># Try to get actual dimensions from structure</span>
+            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">rb_type</span><span class="p">,</span> <span class="s1">&#39;aligned_pdb&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">rb_type</span><span class="o">.</span><span class="n">aligned_pdb</span><span class="p">:</span>
+                <span class="k">try</span><span class="p">:</span>
+                    <span class="c1"># Try to read dimensions from dimension.dat file in the same directory</span>
+                    <span class="n">dim_file</span> <span class="o">=</span> <span class="n">rb_type</span><span class="o">.</span><span class="n">aligned_pdb</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">rb_type</span><span class="o">.</span><span class="n">aligned_pdb</span><span class="o">.</span><span class="n">stem</span><span class="si">}</span><span class="s2">.dimension.dat&quot;</span>
+                    <span class="k">if</span> <span class="n">dim_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
+                        <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">dim_file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+                            <span class="n">dimensions</span> <span class="o">=</span> <span class="p">[</span><span class="nb">float</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">f</span><span class="o">.</span><span class="n">readlines</span><span class="p">()]</span>
+                        <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Using dimensions from </span><span class="si">{</span><span class="n">dim_file</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">dimensions</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+                <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+                    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not read dimensions from file: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+            
+            <span class="c1"># Generate spanning vectors</span>
+            <span class="n">bv1</span><span class="p">,</span> <span class="n">bv2</span><span class="p">,</span> <span class="n">bv3</span><span class="p">,</span> <span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">,</span> <span class="n">n3</span> <span class="o">=</span> <span class="n">Generate_spanning_vectors</span><span class="p">(</span>
+                <span class="n">initial_region</span><span class="p">[</span><span class="s1">&#39;bv1&#39;</span><span class="p">],</span> 
+                <span class="n">initial_region</span><span class="p">[</span><span class="s1">&#39;bv2&#39;</span><span class="p">],</span> 
+                <span class="n">initial_region</span><span class="p">[</span><span class="s1">&#39;bv3&#39;</span><span class="p">],</span>
+                <span class="n">dimensions</span>
+            <span class="p">)</span>
+            
+            <span class="c1"># Set random seed if provided</span>
+            <span class="k">if</span> <span class="n">random_seed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">prev_state</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">get_state</span><span class="p">()</span>
+                <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="n">random_seed</span><span class="p">)</span>
+            
+            <span class="c1"># Generate coordinates</span>
+            <span class="n">generated_coords</span> <span class="o">=</span> <span class="n">Generate_coordinates</span><span class="p">(</span>
+                <span class="n">bv1</span><span class="p">,</span> <span class="n">bv2</span><span class="p">,</span> <span class="n">bv3</span><span class="p">,</span> <span class="n">n1</span><span class="p">,</span> <span class="n">n2</span><span class="p">,</span> <span class="n">n3</span><span class="p">,</span> <span class="n">copies</span><span class="p">,</span>
+                <span class="n">initial_region</span><span class="p">[</span><span class="s1">&#39;origin&#39;</span><span class="p">],</span> <span class="n">random_seed</span> <span class="ow">or</span> <span class="mi">0</span>
+            <span class="p">)</span>
+            
+            <span class="c1"># Restore random state if we changed it</span>
+            <span class="k">if</span> <span class="n">random_seed</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+                <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">set_state</span><span class="p">(</span><span class="n">prev_state</span><span class="p">)</span>
+            
+            <span class="c1"># Store positions for later use</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">initial_positions</span><span class="p">[</span><span class="n">rb_type</span><span class="o">.</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">generated_coords</span>
+            <span class="n">positions</span> <span class="o">=</span> <span class="n">generated_coords</span>
+            
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Generated </span><span class="si">{</span><span class="n">copies</span><span class="si">}</span><span class="s2"> initial positions for </span><span class="si">{</span><span class="n">rb_type</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
+        
+        <span class="c1"># Set up default orientation if none provided</span>
+        <span class="n">default_orientation</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">eye</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+        
+        <span class="c1"># Add requested number of copies</span>
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">copies</span><span class="p">):</span>
+            <span class="c1"># Create position and orientation for this copy</span>
+            <span class="k">if</span> <span class="n">positions</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">positions</span><span class="p">):</span>
+                <span class="n">position</span> <span class="o">=</span> <span class="n">positions</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="c1"># Generate random position within the model bounds</span>
+                <span class="n">position</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="o">-</span><span class="mf">0.4</span><span class="p">,</span> <span class="mf">0.4</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">dimensions</span>
+                
+            <span class="k">if</span> <span class="n">orientations</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">orientations</span><span class="p">):</span>
+                <span class="n">orientation</span> <span class="o">=</span> <span class="n">orientations</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="n">orientation</span> <span class="o">=</span> <span class="n">default_orientation</span>
+            
+            <span class="c1"># Create a new rigid body</span>
+            <span class="n">rb_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">base_name</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">copies</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">base_name</span>
+            <span class="n">rb</span> <span class="o">=</span> <span class="n">RigidBody</span><span class="p">(</span>
+                <span class="n">type_</span><span class="o">=</span><span class="n">rb_type</span><span class="p">,</span>
+                <span class="n">position</span><span class="o">=</span><span class="n">position</span><span class="p">,</span>
+                <span class="n">orientation</span><span class="o">=</span><span class="n">orientation</span><span class="p">,</span>
+                <span class="n">name</span><span class="o">=</span><span class="n">rb_name</span><span class="p">)</span>
+            
+            <span class="c1"># Add to model</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">diffusible_objects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rb</span><span class="p">)</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">rb</span><span class="p">)</span>
+            <span class="n">created_bodies</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rb</span><span class="p">)</span>
+            
+        <span class="k">return</span> <span class="n">created_bodies</span></div>
+
+
+<div class="viewcode-block" id="StructureRigidBodyModel.add_static_object">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">add_static_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">structure_path</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span><span class="n">is_gigantic</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mi">300</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Add this static object to an ARBD model.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            model: ArbdModel to add this static object to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">obj</span><span class="o">=</span><span class="n">StaticObject</span><span class="p">(</span><span class="n">structure_path</span><span class="o">=</span><span class="n">structure_path</span><span class="p">,</span> <span class="n">work_dir</span><span class="o">=</span><span class="n">work_dir</span><span class="p">,</span>
+                         <span class="n">simconf</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">simconf</span><span class="p">,</span><span class="n">is_gigantic</span><span class="o">=</span><span class="n">is_gigantic</span><span class="p">,</span><span class="n">threshold</span><span class="o">=</span><span class="n">threshold</span><span class="p">)</span>
+        <span class="n">elec_grid</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">elec_grid</span>
+        <span class="n">potential_grids</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">potential_grids</span>
+        <span class="n">charge_grids</span> <span class="o">=</span> <span class="n">obj</span><span class="o">.</span><span class="n">charge_grids</span>
+        <span class="c1"># First add electrostatic grid if available</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">add_nonbonded_interaction</span><span class="p">(</span><span class="n">elec_grid</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">add_nonbonded_interaction</span><span class="p">(</span><span class="n">potential_grids</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">add_nonbonded_interaction</span><span class="p">(</span><span class="n">charge_grids</span><span class="p">)</span>
+
+        <span class="bp">self</span><span class="o">.</span><span class="n">static_objects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span></div>
+</div>
+
+    
+<div class="viewcode-block" id="SimpleArbdEngine">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine">[docs]</a>
+<span class="k">class</span><span class="w"> </span><span class="nc">SimpleArbdEngine</span><span class="p">(</span><span class="n">ArbdEngine</span><span class="p">):</span>
+<span class="w">    </span><span class="sd">&quot;&quot;&quot;Enhanced ARBD engine with additional functionality for structure simulations&quot;&quot;&quot;</span>
+    
+    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extra_bd_file_lines</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Initialize SimpleArbdEngine.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            extra_bd_file_lines: Additional lines for BD configuration file</span>
+<span class="sd">            configuration: SimConf object</span>
+<span class="sd">            **conf_params: Additional configuration parameters</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">extra_bd_file_lines</span><span class="p">,</span> <span class="n">configuration</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        
+<div class="viewcode-block" id="SimpleArbdEngine.write_simulation_files">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">write_simulation_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Write all simulation files.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            model: ArbdModel to simulate</span>
+<span class="sd">            output_name: Base name for output files</span>
+<span class="sd">            configuration: SimConf object</span>
+<span class="sd">            **conf_params: Additional configuration parameters</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Call parent method to write standard files</span>
+        <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">write_simulation_files</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">configuration</span><span class="p">,</span> <span class="o">**</span><span class="n">conf_params</span><span class="p">)</span>
+        
+        <span class="c1"># Additional functionality for structure rigid bodies</span>
+        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s1">&#39;diffusible_objects&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">model</span><span class="o">.</span><span class="n">diffusible_objects</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Writing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">diffusible_objects</span><span class="p">)</span><span class="si">}</span><span class="s2"> diffusible objects&quot;</span><span class="p">)</span>
+            
+        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s1">&#39;static_objects&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">model</span><span class="o">.</span><span class="n">static_objects</span><span class="p">:</span>
+            <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Writing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">static_objects</span><span class="p">)</span><span class="si">}</span><span class="s2"> static objects&quot;</span><span class="p">)</span></div>
+
+            
+<div class="viewcode-block" id="SimpleArbdEngine.run_simulation">
+<a class="viewcode-back" href="../../api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation">[docs]</a>
+    <span class="k">def</span><span class="w"> </span><span class="nf">run_simulation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">output_name</span><span class="p">,</span> <span class="n">replicas</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">gpu</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+<span class="w">        </span><span class="sd">&quot;&quot;&quot;Run ARBD simulation.</span>
+<span class="sd">        </span>
+<span class="sd">        Args:</span>
+<span class="sd">            model: ArbdModel to simulate</span>
+<span class="sd">            output_name: Base name for output files</span>
+<span class="sd">            replicas: Number of replicas to run</span>
+<span class="sd">            gpu: GPU index to use</span>
+<span class="sd">            **kwargs: Additional arguments for simulate method</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># Prepare output directory</span>
+        <span class="n">output_dir</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;output_directory&#39;</span><span class="p">,</span> <span class="s1">&#39;output&#39;</span><span class="p">)</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">output_dir</span><span class="p">):</span>
+            <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">output_dir</span><span class="p">)</span>
+            
+        <span class="c1"># Run simulations</span>
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">replicas</span><span class="p">):</span>
+            <span class="n">replica_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">output_name</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">replicas</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">output_name</span>
+            
+            <span class="c1"># Override GPU index if running multiple replicas</span>
+            <span class="k">if</span> <span class="n">replicas</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+                <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;gpu&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">gpu</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="o">%</span> <span class="mi">8</span>  <span class="c1"># Assuming max 8 GPUs</span>
+                
+            <span class="c1"># Run simulation</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">simulate</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">replica_name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
+</div>
+
+</pre></div>
+
+                </article>
+              
+
+              
+              
+              
+              
+                <footer class="prev-next-footer d-print-none">
+                  
+<div class="prev-next-area">
+</div>
+                </footer>
+              
+            </div>
+            
+            
+              
+            
+          </div>
+          <footer class="bd-footer-content">
+            
+<div class="bd-footer-content__inner container">
+  
+  <div class="footer-item">
+    
+<p class="component-author">
+By ARBD Model Team
+</p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+
+  <p class="copyright">
+    
+      © Copyright 2023.
+      <br/>
+    
+  </p>
+
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+  <div class="footer-item">
+    
+  </div>
+  
+</div>
+          </footer>
+        
+
+      </main>
+    </div>
+  </div>
+  
+  <!-- Scripts loaded after <body> so the DOM is not blocked -->
+  <script src="../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+  <footer class="bd-footer">
+  </footer>
+  </body>
+</html>
\ No newline at end of file
diff --git a/_build/html/_modules/index.html b/_build/html/_modules/index.html
index ccc68df13f8091c0bba93d95034808f616ca6f7e..7add2515093501a5b898d78308f2df16cb5bf2c5 100644
--- a/_build/html/_modules/index.html
+++ b/_build/html/_modules/index.html
@@ -31,19 +31,19 @@
     <link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -60,9 +60,9 @@
     <script src="../_static/copybutton.js?v=f281be69"></script>
     <script src="../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../_static/tabs.js?v=3ee01567"></script>
-    <script src="../_static/js/hoverxref.js"></script>
-    <script src="../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../_static/js/micromodal.min.js"></script>
+    <script src="../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -300,18 +300,32 @@ document.write(`
                 <article class="bd-article">
                   
   <h1>All modules for which code is available</h1>
-<ul><li><a href="arbdmodel/coords.html">arbdmodel.coords</a></li>
+<ul><li><a href="arbdmodel/binary_manager.html">arbdmodel.binary_manager</a></li>
+<li><a href="arbdmodel/coords.html">arbdmodel.coords</a></li>
+<li><a href="arbdmodel/core_objects.html">arbdmodel.core_objects</a></li>
+<li><a href="arbdmodel/engine.html">arbdmodel.engine</a></li>
 <li><a href="arbdmodel/fjc_polymer_model.html">arbdmodel.fjc_polymer_model</a></li>
 <li><a href="arbdmodel/grid.html">arbdmodel.grid</a></li>
 <li><a href="arbdmodel/hps_polymer_model.html">arbdmodel.hps_polymer_model</a></li>
 <li><a href="arbdmodel/ibi.html">arbdmodel.ibi</a></li>
 <li><a href="arbdmodel/interactions.html">arbdmodel.interactions</a></li>
 <li><a href="arbdmodel/kh_polymer_model.html">arbdmodel.kh_polymer_model</a></li>
+<li><a href="arbdmodel/logger.html">arbdmodel.logger</a></li>
+<li><a href="arbdmodel/mesh_process_surface.html">arbdmodel.mesh_process_surface</a></li>
+<li><a href="arbdmodel/mesh_process_volume.html">arbdmodel.mesh_process_volume</a></li>
+<li><a href="arbdmodel/mesh_rigidbody.html">arbdmodel.mesh_rigidbody</a></li>
+<li><a href="arbdmodel/model.html">arbdmodel.model</a></li>
 <li><a href="arbdmodel/mpipi_polymer.html">arbdmodel.mpipi_polymer</a></li>
 <li><a href="arbdmodel/onck_polymer_model.html">arbdmodel.onck_polymer_model</a></li>
+<li><a href="arbdmodel/parmed_bd.html">arbdmodel.parmed_bd</a></li>
 <li><a href="arbdmodel/polymer.html">arbdmodel.polymer</a></li>
+<li><a href="arbdmodel/sali_polymer_model.html">arbdmodel.sali_polymer_model</a></li>
 <li><a href="arbdmodel/shape_cg.html">arbdmodel.shape_cg</a></li>
+<li><a href="arbdmodel/sim_config.html">arbdmodel.sim_config</a></li>
+<li><a href="arbdmodel/simplearbd.html">arbdmodel.simplearbd</a></li>
 <li><a href="arbdmodel/ssdna_two_bead.html">arbdmodel.ssdna_two_bead</a></li>
+<li><a href="arbdmodel/structure_from_pdb.html">arbdmodel.structure_from_pdb</a></li>
+<li><a href="arbdmodel/structure_rigidbody.html">arbdmodel.structure_rigidbody</a></li>
 <li><a href="arbdmodel/version.html">arbdmodel.version</a></li>
 </ul>
 
diff --git a/_build/html/_sources/tutorials/index.md b/_build/html/_sources/tutorials/index.md
index 9e0793fdac81501680e3399a8ec159606bd73e52..ae7fdbe821d5571dda7e2a7e5444f63f208cc63b 100644
--- a/_build/html/_sources/tutorials/index.md
+++ b/_build/html/_sources/tutorials/index.md
@@ -4,12 +4,6 @@ This section contains tutorials and examples for working with the arbdmodel pack
 
 ## Available Tutorials
 
-### 1- basics
-- [1 Basics](1-basics.ipynb)
-
-### 2-polymer_objects
-- [2 Polymer Objects](2-polymer-objects.ipynb)
-
 ### 3-iterative-boltzmann-inversion
 
 - [3 Ibi](3-iterative-boltzmann-inversion/3-ibi.ipynb)
@@ -18,4 +12,5 @@ This section contains tutorials and examples for working with the arbdmodel pack
 
 - [4 Rigid Bodies](4-rigid-bodies/4-rigid-bodies.ipynb)
 
-
+- [1 Basics](1-basics.ipynb)
+- [2 Polymer Objects](2-polymer-objects.ipynb)
diff --git a/_build/html/api/core/core_objects.html b/_build/html/api/core/core_objects.html
index 4ec3da9c5f150e5f470e466e8c919ca3b6263f13..a2dc8819608b9db333e6b3482012074421e88ee0 100644
--- a/_build/html/api/core/core_objects.html
+++ b/_build/html/api/core/core_objects.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,86 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Child"><code class="docutils literal notranslate"><span class="pre">Child</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Clone"><code class="docutils literal notranslate"><span class="pre">Clone</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Clone.get_original_recursively"><code class="docutils literal notranslate"><span class="pre">Clone.get_original_recursively()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Group"><code class="docutils literal notranslate"><span class="pre">Group</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Group.clone"><code class="docutils literal notranslate"><span class="pre">Group.clone()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Group.duplicate"><code class="docutils literal notranslate"><span class="pre">Group.duplicate()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite"><code class="docutils literal notranslate"><span class="pre">GroupSite</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite.add_restraint"><code class="docutils literal notranslate"><span class="pre">GroupSite.add_restraint()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite.get_center"><code class="docutils literal notranslate"><span class="pre">GroupSite.get_center()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite.get_restraints"><code class="docutils literal notranslate"><span class="pre">GroupSite.get_restraints()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent"><code class="docutils literal notranslate"><span class="pre">Parent</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add"><code class="docutils literal notranslate"><span class="pre">Parent.add()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_angle"><code class="docutils literal notranslate"><span class="pre">Parent.add_angle()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_bond"><code class="docutils literal notranslate"><span class="pre">Parent.add_bond()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_bond_angle"><code class="docutils literal notranslate"><span class="pre">Parent.add_bond_angle()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_dihedral"><code class="docutils literal notranslate"><span class="pre">Parent.add_dihedral()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_exclusion"><code class="docutils literal notranslate"><span class="pre">Parent.add_exclusion()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_improper"><code class="docutils literal notranslate"><span class="pre">Parent.add_improper()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_product_potential"><code class="docutils literal notranslate"><span class="pre">Parent.add_product_potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_vector_angle"><code class="docutils literal notranslate"><span class="pre">Parent.add_vector_angle()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.clear_all"><code class="docutils literal notranslate"><span class="pre">Parent.clear_all()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_angles"><code class="docutils literal notranslate"><span class="pre">Parent.get_angles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_bond_angles"><code class="docutils literal notranslate"><span class="pre">Parent.get_bond_angles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_bonds"><code class="docutils literal notranslate"><span class="pre">Parent.get_bonds()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_center"><code class="docutils literal notranslate"><span class="pre">Parent.get_center()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_dihedrals"><code class="docutils literal notranslate"><span class="pre">Parent.get_dihedrals()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_exclusions"><code class="docutils literal notranslate"><span class="pre">Parent.get_exclusions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_impropers"><code class="docutils literal notranslate"><span class="pre">Parent.get_impropers()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_product_potentials"><code class="docutils literal notranslate"><span class="pre">Parent.get_product_potentials()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_restraints"><code class="docutils literal notranslate"><span class="pre">Parent.get_restraints()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_vector_angles"><code class="docutils literal notranslate"><span class="pre">Parent.get_vector_angles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.index"><code class="docutils literal notranslate"><span class="pre">Parent.index()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.insert"><code class="docutils literal notranslate"><span class="pre">Parent.insert()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.remove"><code class="docutils literal notranslate"><span class="pre">Parent.remove()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType"><code class="docutils literal notranslate"><span class="pre">ParticleType</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType.add_grid_potential"><code class="docutils literal notranslate"><span class="pre">ParticleType.add_grid_potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType.excludedAttributes"><code class="docutils literal notranslate"><span class="pre">ParticleType.excludedAttributes</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType.is_same_type"><code class="docutils literal notranslate"><span class="pre">ParticleType.is_same_type()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle"><code class="docutils literal notranslate"><span class="pre">PointParticle</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.add_grid_potential"><code class="docutils literal notranslate"><span class="pre">PointParticle.add_grid_potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.add_restraint"><code class="docutils literal notranslate"><span class="pre">PointParticle.add_restraint()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.duplicate"><code class="docutils literal notranslate"><span class="pre">PointParticle.duplicate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.get_restraints"><code class="docutils literal notranslate"><span class="pre">PointParticle.get_restraints()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody"><code class="docutils literal notranslate"><span class="pre">RigidBody</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody.add_restraint"><code class="docutils literal notranslate"><span class="pre">RigidBody.add_restraint()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody.duplicate"><code class="docutils literal notranslate"><span class="pre">RigidBody.duplicate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody.get_restraints"><code class="docutils literal notranslate"><span class="pre">RigidBody.get_restraints()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBodyType"><code class="docutils literal notranslate"><span class="pre">RigidBodyType</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBodyType.attach_particle"><code class="docutils literal notranslate"><span class="pre">RigidBodyType.attach_particle()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable"><code class="docutils literal notranslate"><span class="pre">Transformable</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.applyOrientation"><code class="docutils literal notranslate"><span class="pre">Transformable.applyOrientation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.get_collapsed_position"><code class="docutils literal notranslate"><span class="pre">Transformable.get_collapsed_position()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.rotate"><code class="docutils literal notranslate"><span class="pre">Transformable.rotate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.transform"><code class="docutils literal notranslate"><span class="pre">Transformable.transform()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.translate"><code class="docutils literal notranslate"><span class="pre">Transformable.translate()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +433,296 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="core-objects">
 <h1>core_objects<a class="headerlink" href="#core-objects" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.core_objects</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.core_objects">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Child">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Child</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parent</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Child"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Child" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Clone">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Clone</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">original</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parent</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">position</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">orientation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Clone"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Clone" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.core_objects.Transformable" title="arbdmodel.core_objects.Transformable"><code class="xref py py-class docutils literal notranslate"><span class="pre">Transformable</span></code></a>, <a class="reference internal" href="#arbdmodel.core_objects.Parent" title="arbdmodel.core_objects.Parent"><code class="xref py py-class docutils literal notranslate"><span class="pre">Parent</span></code></a>, <a class="reference internal" href="#arbdmodel.core_objects.Child" title="arbdmodel.core_objects.Child"><code class="xref py py-class docutils literal notranslate"><span class="pre">Child</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Clone.get_original_recursively">
+<span class="sig-name descname"><span class="pre">get_original_recursively</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Clone.get_original_recursively"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Clone.get_original_recursively" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Group">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Group</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">children</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parent</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">position</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">array([0,</span> <span class="pre">0,</span> <span class="pre">0])</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">orientation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">array([[1,</span> <span class="pre">0,</span> <span class="pre">0],</span> <span class="pre">[0,</span> <span class="pre">1,</span> <span class="pre">0],</span> <span class="pre">[0,</span> <span class="pre">0,</span> <span class="pre">1]])</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">remove_duplicate_bonded_terms</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Group"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Group" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.core_objects.Transformable" title="arbdmodel.core_objects.Transformable"><code class="xref py py-class docutils literal notranslate"><span class="pre">Transformable</span></code></a>, <a class="reference internal" href="#arbdmodel.core_objects.Parent" title="arbdmodel.core_objects.Parent"><code class="xref py py-class docutils literal notranslate"><span class="pre">Parent</span></code></a>, <a class="reference internal" href="#arbdmodel.core_objects.Child" title="arbdmodel.core_objects.Child"><code class="xref py py-class docutils literal notranslate"><span class="pre">Child</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Group.clone">
+<span class="sig-name descname"><span class="pre">clone</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Group.clone"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Group.clone" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Group.duplicate">
+<span class="sig-name descname"><span class="pre">duplicate</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Group.duplicate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Group.duplicate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.GroupSite">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">GroupSite</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">particles</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#GroupSite"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.GroupSite" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Class to represent a collection of particles that can be used by bond potentials. In arbdmodel only</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.GroupSite.add_restraint">
+<span class="sig-name descname"><span class="pre">add_restraint</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">restraint</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#GroupSite.add_restraint"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.GroupSite.add_restraint" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.GroupSite.get_center">
+<span class="sig-name descname"><span class="pre">get_center</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#GroupSite.get_center"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.GroupSite.get_center" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.GroupSite.get_restraints">
+<span class="sig-name descname"><span class="pre">get_restraints</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#GroupSite.get_restraints"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.GroupSite.get_restraints" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Parent</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">children</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">remove_duplicate_bonded_terms</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add">
+<span class="sig-name descname"><span class="pre">add</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_angle">
+<span class="sig-name descname"><span class="pre">add_angle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">angle</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_angle"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_angle" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_bond">
+<span class="sig-name descname"><span class="pre">add_bond</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bond</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exclude</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_bond"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_bond" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_bond_angle">
+<span class="sig-name descname"><span class="pre">add_bond_angle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">l</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bond_angle</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exclude</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_bond_angle"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_bond_angle" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_dihedral">
+<span class="sig-name descname"><span class="pre">add_dihedral</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">l</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dihedral</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_dihedral"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_dihedral" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_exclusion">
+<span class="sig-name descname"><span class="pre">add_exclusion</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_exclusion"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_exclusion" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_improper">
+<span class="sig-name descname"><span class="pre">add_improper</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">l</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dihedral</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_improper"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_improper" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_product_potential">
+<span class="sig-name descname"><span class="pre">add_product_potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">potential_list</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_product_potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_product_potential" title="Link to this definition">#</a></dt>
+<dd><p>potential_list: list of tuples of form (particle_i, particle_j,…, TabulatedPotential)</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.add_vector_angle">
+<span class="sig-name descname"><span class="pre">add_vector_angle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">i</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">j</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">l</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">potential</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.add_vector_angle"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.add_vector_angle" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.clear_all">
+<span class="sig-name descname"><span class="pre">clear_all</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">keep_children</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.clear_all"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.clear_all" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_angles">
+<span class="sig-name descname"><span class="pre">get_angles</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_angles"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_angles" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_bond_angles">
+<span class="sig-name descname"><span class="pre">get_bond_angles</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_bond_angles"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_bond_angles" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_bonds">
+<span class="sig-name descname"><span class="pre">get_bonds</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_bonds"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_bonds" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_center">
+<span class="sig-name descname"><span class="pre">get_center</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">weight</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_center"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_center" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_dihedrals">
+<span class="sig-name descname"><span class="pre">get_dihedrals</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_dihedrals"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_dihedrals" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_exclusions">
+<span class="sig-name descname"><span class="pre">get_exclusions</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_exclusions"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_exclusions" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_impropers">
+<span class="sig-name descname"><span class="pre">get_impropers</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_impropers"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_impropers" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_product_potentials">
+<span class="sig-name descname"><span class="pre">get_product_potentials</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_product_potentials"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_product_potentials" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_restraints">
+<span class="sig-name descname"><span class="pre">get_restraints</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_restraints"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_restraints" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.get_vector_angles">
+<span class="sig-name descname"><span class="pre">get_vector_angles</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.get_vector_angles"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.get_vector_angles" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.index">
+<span class="sig-name descname"><span class="pre">index</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.index"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.index" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.insert">
+<span class="sig-name descname"><span class="pre">insert</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">idx</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">x</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.insert"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.insert" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Parent.remove">
+<span class="sig-name descname"><span class="pre">remove</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">x</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Parent.remove"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Parent.remove" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.ParticleType">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ParticleType</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">charge</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mass</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">diffusivity</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">damping_coefficient</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parent</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rigid_body_potentials</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#ParticleType"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.ParticleType" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Class that hold common attributes that particles can point to</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.ParticleType.add_grid_potential">
+<span class="sig-name descname"><span class="pre">add_grid_potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">gridfile</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scale</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">boundary_condition</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'dirichlet'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#ParticleType.add_grid_potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.ParticleType.add_grid_potential" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.ParticleType.excludedAttributes">
+<span class="sig-name descname"><span class="pre">excludedAttributes</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">('idx',</span> <span class="pre">'type_',</span> <span class="pre">'position',</span> <span class="pre">'orientation',</span> <span class="pre">'children',</span> <span class="pre">'name',</span> <span class="pre">'parent',</span> <span class="pre">'excludedAttributes')</span></em><a class="headerlink" href="#arbdmodel.core_objects.ParticleType.excludedAttributes" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.ParticleType.is_same_type">
+<span class="sig-name descname"><span class="pre">is_same_type</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">consider_parents</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#ParticleType.is_same_type"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.ParticleType.is_same_type" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.PointParticle">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PointParticle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">type_</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">position</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'A'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#PointParticle"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.PointParticle" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.core_objects.Transformable" title="arbdmodel.core_objects.Transformable"><code class="xref py py-class docutils literal notranslate"><span class="pre">Transformable</span></code></a>, <a class="reference internal" href="#arbdmodel.core_objects.Child" title="arbdmodel.core_objects.Child"><code class="xref py py-class docutils literal notranslate"><span class="pre">Child</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.PointParticle.add_grid_potential">
+<span class="sig-name descname"><span class="pre">add_grid_potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">gridfile</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">scale</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">boundary_condition</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'dirichlet'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#PointParticle.add_grid_potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.PointParticle.add_grid_potential" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.PointParticle.add_restraint">
+<span class="sig-name descname"><span class="pre">add_restraint</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">restraint</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#PointParticle.add_restraint"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.PointParticle.add_restraint" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.PointParticle.duplicate">
+<span class="sig-name descname"><span class="pre">duplicate</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#PointParticle.duplicate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.PointParticle.duplicate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.PointParticle.get_restraints">
+<span class="sig-name descname"><span class="pre">get_restraints</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#PointParticle.get_restraints"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.PointParticle.get_restraints" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.RigidBody">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">RigidBody</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">type_</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">position</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">orientation</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'A'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">attached_particles</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#RigidBody"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.RigidBody" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.core_objects.PointParticle" title="arbdmodel.core_objects.PointParticle"><code class="xref py py-class docutils literal notranslate"><span class="pre">PointParticle</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.RigidBody.add_restraint">
+<span class="sig-name descname"><span class="pre">add_restraint</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">restraint</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#RigidBody.add_restraint"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.RigidBody.add_restraint" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.RigidBody.duplicate">
+<span class="sig-name descname"><span class="pre">duplicate</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#RigidBody.duplicate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.RigidBody.duplicate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.RigidBody.get_restraints">
+<span class="sig-name descname"><span class="pre">get_restraints</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#RigidBody.get_restraints"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.RigidBody.get_restraints" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.RigidBodyType">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">RigidBodyType</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parent</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">moment_of_inertia</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rotational_diffusivity</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rotational_damping_coefficient</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">attached_particles</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">potential_grids</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">charge_grids</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pmf_grids</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#RigidBodyType"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.RigidBodyType" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.core_objects.ParticleType" title="arbdmodel.core_objects.ParticleType"><code class="xref py py-class docutils literal notranslate"><span class="pre">ParticleType</span></code></a></p>
+<p>Class that holds common attributes for RigidBody objects</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.RigidBodyType.attach_particle">
+<span class="sig-name descname"><span class="pre">attach_particle</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">particle</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#RigidBodyType.attach_particle"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.RigidBodyType.attach_particle" title="Link to this definition">#</a></dt>
+<dd><p>The particle argument must be a PointParticle. The position/orientation of the attached particle/group is in the RigidBody frame.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Transformable">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">Transformable</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">position</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">orientation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Transformable"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Transformable" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Transformable.applyOrientation">
+<span class="sig-name descname"><span class="pre">applyOrientation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Transformable.applyOrientation"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Transformable.applyOrientation" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Transformable.get_collapsed_position">
+<span class="sig-name descname"><span class="pre">get_collapsed_position</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Transformable.get_collapsed_position"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Transformable.get_collapsed_position" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Transformable.rotate">
+<span class="sig-name descname"><span class="pre">rotate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">R</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">about</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">0,</span> <span class="pre">0)</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Transformable.rotate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Transformable.rotate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Transformable.transform">
+<span class="sig-name descname"><span class="pre">transform</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">R</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">((1,</span> <span class="pre">0,</span> <span class="pre">0),</span> <span class="pre">(0,</span> <span class="pre">1,</span> <span class="pre">0),</span> <span class="pre">(0,</span> <span class="pre">0,</span> <span class="pre">1))</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">center</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">0,</span> <span class="pre">0)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">offset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">0,</span> <span class="pre">0)</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Transformable.transform"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Transformable.transform" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.core_objects.Transformable.translate">
+<span class="sig-name descname"><span class="pre">translate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">offset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">0,</span> <span class="pre">0)</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/core_objects.html#Transformable.translate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.core_objects.Transformable.translate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +762,93 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Child"><code class="docutils literal notranslate"><span class="pre">Child</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Clone"><code class="docutils literal notranslate"><span class="pre">Clone</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Clone.get_original_recursively"><code class="docutils literal notranslate"><span class="pre">Clone.get_original_recursively()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Group"><code class="docutils literal notranslate"><span class="pre">Group</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Group.clone"><code class="docutils literal notranslate"><span class="pre">Group.clone()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Group.duplicate"><code class="docutils literal notranslate"><span class="pre">Group.duplicate()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite"><code class="docutils literal notranslate"><span class="pre">GroupSite</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite.add_restraint"><code class="docutils literal notranslate"><span class="pre">GroupSite.add_restraint()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite.get_center"><code class="docutils literal notranslate"><span class="pre">GroupSite.get_center()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.GroupSite.get_restraints"><code class="docutils literal notranslate"><span class="pre">GroupSite.get_restraints()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent"><code class="docutils literal notranslate"><span class="pre">Parent</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add"><code class="docutils literal notranslate"><span class="pre">Parent.add()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_angle"><code class="docutils literal notranslate"><span class="pre">Parent.add_angle()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_bond"><code class="docutils literal notranslate"><span class="pre">Parent.add_bond()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_bond_angle"><code class="docutils literal notranslate"><span class="pre">Parent.add_bond_angle()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_dihedral"><code class="docutils literal notranslate"><span class="pre">Parent.add_dihedral()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_exclusion"><code class="docutils literal notranslate"><span class="pre">Parent.add_exclusion()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_improper"><code class="docutils literal notranslate"><span class="pre">Parent.add_improper()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_product_potential"><code class="docutils literal notranslate"><span class="pre">Parent.add_product_potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.add_vector_angle"><code class="docutils literal notranslate"><span class="pre">Parent.add_vector_angle()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.clear_all"><code class="docutils literal notranslate"><span class="pre">Parent.clear_all()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_angles"><code class="docutils literal notranslate"><span class="pre">Parent.get_angles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_bond_angles"><code class="docutils literal notranslate"><span class="pre">Parent.get_bond_angles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_bonds"><code class="docutils literal notranslate"><span class="pre">Parent.get_bonds()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_center"><code class="docutils literal notranslate"><span class="pre">Parent.get_center()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_dihedrals"><code class="docutils literal notranslate"><span class="pre">Parent.get_dihedrals()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_exclusions"><code class="docutils literal notranslate"><span class="pre">Parent.get_exclusions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_impropers"><code class="docutils literal notranslate"><span class="pre">Parent.get_impropers()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_product_potentials"><code class="docutils literal notranslate"><span class="pre">Parent.get_product_potentials()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_restraints"><code class="docutils literal notranslate"><span class="pre">Parent.get_restraints()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.get_vector_angles"><code class="docutils literal notranslate"><span class="pre">Parent.get_vector_angles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.index"><code class="docutils literal notranslate"><span class="pre">Parent.index()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.insert"><code class="docutils literal notranslate"><span class="pre">Parent.insert()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Parent.remove"><code class="docutils literal notranslate"><span class="pre">Parent.remove()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType"><code class="docutils literal notranslate"><span class="pre">ParticleType</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType.add_grid_potential"><code class="docutils literal notranslate"><span class="pre">ParticleType.add_grid_potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType.excludedAttributes"><code class="docutils literal notranslate"><span class="pre">ParticleType.excludedAttributes</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.ParticleType.is_same_type"><code class="docutils literal notranslate"><span class="pre">ParticleType.is_same_type()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle"><code class="docutils literal notranslate"><span class="pre">PointParticle</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.add_grid_potential"><code class="docutils literal notranslate"><span class="pre">PointParticle.add_grid_potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.add_restraint"><code class="docutils literal notranslate"><span class="pre">PointParticle.add_restraint()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.duplicate"><code class="docutils literal notranslate"><span class="pre">PointParticle.duplicate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.PointParticle.get_restraints"><code class="docutils literal notranslate"><span class="pre">PointParticle.get_restraints()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody"><code class="docutils literal notranslate"><span class="pre">RigidBody</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody.add_restraint"><code class="docutils literal notranslate"><span class="pre">RigidBody.add_restraint()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody.duplicate"><code class="docutils literal notranslate"><span class="pre">RigidBody.duplicate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBody.get_restraints"><code class="docutils literal notranslate"><span class="pre">RigidBody.get_restraints()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBodyType"><code class="docutils literal notranslate"><span class="pre">RigidBodyType</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.RigidBodyType.attach_particle"><code class="docutils literal notranslate"><span class="pre">RigidBodyType.attach_particle()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable"><code class="docutils literal notranslate"><span class="pre">Transformable</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.applyOrientation"><code class="docutils literal notranslate"><span class="pre">Transformable.applyOrientation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.get_collapsed_position"><code class="docutils literal notranslate"><span class="pre">Transformable.get_collapsed_position()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.rotate"><code class="docutils literal notranslate"><span class="pre">Transformable.rotate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.transform"><code class="docutils literal notranslate"><span class="pre">Transformable.transform()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.core_objects.Transformable.translate"><code class="docutils literal notranslate"><span class="pre">Transformable.translate()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/core/index.html b/_build/html/api/core/index.html
index 5b3d6093b26f8334221e9702617a68220868b2e6..0c02e018ec07b3478c350ebea9df9ced8ec1dcc5 100644
--- a/_build/html/api/core/index.html
+++ b/_build/html/api/core/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/core/model.html b/_build/html/api/core/model.html
index 288d9b903f5200c38f721648dfd22480e9fe9ad5..39446e2634e455ff61ca937533d114ef03b53d63 100644
--- a/_build/html/api/core/model.html
+++ b/_build/html/api/core/model.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,36 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel"><code class="docutils literal notranslate"><span class="pre">ArbdModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.add"><code class="docutils literal notranslate"><span class="pre">ArbdModel.add()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.add_group_site"><code class="docutils literal notranslate"><span class="pre">ArbdModel.add_group_site()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.add_nonbonded_interaction"><code class="docutils literal notranslate"><span class="pre">ArbdModel.add_nonbonded_interaction()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom"><code class="docutils literal notranslate"><span class="pre">ArbdModel.assign_IBI_degrees_of_freedom()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.clear_all"><code class="docutils literal notranslate"><span class="pre">ArbdModel.clear_all()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.dimensions_from_structure"><code class="docutils literal notranslate"><span class="pre">ArbdModel.dimensions_from_structure()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.extend"><code class="docutils literal notranslate"><span class="pre">ArbdModel.extend()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.getParticleTypesAndCounts"><code class="docutils literal notranslate"><span class="pre">ArbdModel.getParticleTypesAndCounts()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.load_target_IBI_distributions"><code class="docutils literal notranslate"><span class="pre">ArbdModel.load_target_IBI_distributions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.prepare_for_simulation"><code class="docutils literal notranslate"><span class="pre">ArbdModel.prepare_for_simulation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.run_IBI"><code class="docutils literal notranslate"><span class="pre">ArbdModel.run_IBI()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.simulate"><code class="docutils literal notranslate"><span class="pre">ArbdModel.simulate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.update"><code class="docutils literal notranslate"><span class="pre">ArbdModel.update()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.useNonbondedScheme"><code class="docutils literal notranslate"><span class="pre">ArbdModel.useNonbondedScheme()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel"><code class="docutils literal notranslate"><span class="pre">PdbModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel.write_pdb"><code class="docutils literal notranslate"><span class="pre">PdbModel.write_pdb()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel.write_pqr"><code class="docutils literal notranslate"><span class="pre">PdbModel.write_pqr()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel.write_psf"><code class="docutils literal notranslate"><span class="pre">PdbModel.write_psf()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +383,136 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="model">
 <h1>model<a class="headerlink" href="#model" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.model</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.model">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ArbdModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">children</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cell_vectors</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cell_origin</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dimensions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">remove_duplicate_bonded_terms</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buffer_factor</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dummy_types</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">()</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.model.PdbModel" title="arbdmodel.model.PdbModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">PdbModel</span></code></a></p>
+<p>Advanced model class for ARBD simulations with improved cell vector handling.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.add">
+<span class="sig-name descname"><span class="pre">add</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">obj</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.add"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.add" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.add_group_site">
+<span class="sig-name descname"><span class="pre">add_group_site</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">particles</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.add_group_site"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.add_group_site" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.add_nonbonded_interaction">
+<span class="sig-name descname"><span class="pre">add_nonbonded_interaction</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">nonbonded_potential</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">typeA</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">typeB</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.add_nonbonded_interaction"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.add_nonbonded_interaction" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom">
+<span class="sig-name descname"><span class="pre">assign_IBI_degrees_of_freedom</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.assign_IBI_degrees_of_freedom"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom" title="Link to this definition">#</a></dt>
+<dd><p>Convenience routine that adds degrees of freedom to
+corresponding IBI potentials</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.clear_all">
+<span class="sig-name descname"><span class="pre">clear_all</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">keep_children</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.clear_all"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.clear_all" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.dimensions_from_structure">
+<span class="sig-name descname"><span class="pre">dimensions_from_structure</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">padding_factor</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.5</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">isotropic</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.dimensions_from_structure"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.dimensions_from_structure" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.extend">
+<span class="sig-name descname"><span class="pre">extend</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other_model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">copy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.extend"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.extend" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.getParticleTypesAndCounts">
+<span class="sig-name descname"><span class="pre">getParticleTypesAndCounts</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.getParticleTypesAndCounts"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.getParticleTypesAndCounts" title="Link to this definition">#</a></dt>
+<dd><p>Includes rigid body-attached particles</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.load_target_IBI_distributions">
+<span class="sig-name descname"><span class="pre">load_target_IBI_distributions</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.load_target_IBI_distributions"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.load_target_IBI_distributions" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.prepare_for_simulation">
+<span class="sig-name descname"><span class="pre">prepare_for_simulation</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.prepare_for_simulation"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.prepare_for_simulation" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.run_IBI">
+<span class="sig-name descname"><span class="pre">run_IBI</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">iterations</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'./'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">replicas</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">run_minimization</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">first_iteration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">target_universe</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">target_trajectory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.run_IBI"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.run_IBI" title="Link to this definition">#</a></dt>
+<dd><p>Run Iterative Boltzmann Inversion (IBI) to optimize coarse-grained potentials.</p>
+<p>This method performs IBI iterations to match target distributions. For each iteration,
+it writes CG potentials, runs simulations, and extracts distributions from the resulting
+trajectories to update the potentials for the next iteration.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>iterations</strong> (<a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.13)"><em>int</em></a>) – Number of IBI iterations to run</p></li>
+<li><p><strong>directory</strong> (<a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><em>str</em></a><em>, </em><em>optional</em>) – Directory to store output files, defaults to current directory</p></li>
+<li><p><strong>engine</strong> (<a class="reference internal" href="../simulation_engines/engine.html#arbdmodel.engine.ArbdEngine" title="arbdmodel.engine.ArbdEngine"><em>ArbdEngine</em></a><em>, </em><em>optional</em>) – Simulation engine to use. If None, creates a default engine with 5e6 steps
+and 1e4 output period</p></li>
+<li><p><strong>replicas</strong> (<a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.13)"><em>int</em></a><em>, </em><em>optional</em>) – Number of replica simulations to run per iteration, defaults to 1</p></li>
+<li><p><strong>run_minimization</strong> (<a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.13)"><em>bool</em></a><em>, </em><em>optional</em>) – Whether to run a brief minimization before the first iteration, defaults to True</p></li>
+<li><p><strong>first_iteration</strong> (<a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.13)"><em>int</em></a><em>, </em><em>optional</em>) – Starting iteration number, useful for continuing previous IBI runs, defaults to 1</p></li>
+<li><p><strong>target_universe</strong> (<em>MDAnalysis.Universe</em><em>, </em><em>optional</em>) – Universe object containing target structure and trajectory</p></li>
+<li><p><strong>target_trajectory</strong> (<a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.13)"><em>str</em></a><em> or </em><a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.13)"><em>list</em></a><em>, </em><em>optional</em>) – Target trajectory file(s) to use if target_universe is provided</p></li>
+</ul>
+</dd>
+<dt class="field-even">Raises<span class="colon">:</span></dt>
+<dd class="field-even"><ul class="simple">
+<li><p><a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/exceptions.html#ValueError" title="(in Python v3.13)"><strong>ValueError</strong></a> – If the model does not have any IBI potentials assigned</p></li>
+<li><p><a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/exceptions.html#NotImplementedError" title="(in Python v3.13)"><strong>NotImplementedError</strong></a> – If the system does not have an orthorhombic unit cell</p></li>
+</ul>
+</dd>
+</dl>
+<p class="rubric">Notes</p>
+<p>The method requires bonded_ibi_potentials and nonbonded_ibi_potentials to be
+defined in the model. Use assign_IBI_degrees_of_freedom() before calling this method.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.simulate">
+<span class="sig-name descname"><span class="pre">simulate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.simulate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.simulate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.update">
+<span class="sig-name descname"><span class="pre">update</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">group</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">copy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.update"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.update" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.ArbdModel.useNonbondedScheme">
+<span class="sig-name descname"><span class="pre">useNonbondedScheme</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">nbScheme</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">typeA</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">typeB</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#ArbdModel.useNonbondedScheme"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.ArbdModel.useNonbondedScheme" title="Link to this definition">#</a></dt>
+<dd><p>deprecated</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.model.PdbModel">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PdbModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">children</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dimensions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">remove_duplicate_bonded_terms</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#PdbModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.PdbModel" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="core_objects.html#arbdmodel.core_objects.Transformable" title="arbdmodel.core_objects.Transformable"><code class="xref py py-class docutils literal notranslate"><span class="pre">Transformable</span></code></a>, <a class="reference internal" href="core_objects.html#arbdmodel.core_objects.Parent" title="arbdmodel.core_objects.Parent"><code class="xref py py-class docutils literal notranslate"><span class="pre">Parent</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.PdbModel.write_pdb">
+<span class="sig-name descname"><span class="pre">write_pdb</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">beta_from_fixed</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#PdbModel.write_pdb"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.PdbModel.write_pdb" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.PdbModel.write_pqr">
+<span class="sig-name descname"><span class="pre">write_pqr</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#PdbModel.write_pqr"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.PdbModel.write_pqr" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.model.PdbModel.write_psf">
+<span class="sig-name descname"><span class="pre">write_psf</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/model.html#PdbModel.write_psf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.model.PdbModel.write_psf" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +552,43 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel"><code class="docutils literal notranslate"><span class="pre">ArbdModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.add"><code class="docutils literal notranslate"><span class="pre">ArbdModel.add()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.add_group_site"><code class="docutils literal notranslate"><span class="pre">ArbdModel.add_group_site()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.add_nonbonded_interaction"><code class="docutils literal notranslate"><span class="pre">ArbdModel.add_nonbonded_interaction()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom"><code class="docutils literal notranslate"><span class="pre">ArbdModel.assign_IBI_degrees_of_freedom()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.clear_all"><code class="docutils literal notranslate"><span class="pre">ArbdModel.clear_all()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.dimensions_from_structure"><code class="docutils literal notranslate"><span class="pre">ArbdModel.dimensions_from_structure()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.extend"><code class="docutils literal notranslate"><span class="pre">ArbdModel.extend()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.getParticleTypesAndCounts"><code class="docutils literal notranslate"><span class="pre">ArbdModel.getParticleTypesAndCounts()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.load_target_IBI_distributions"><code class="docutils literal notranslate"><span class="pre">ArbdModel.load_target_IBI_distributions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.prepare_for_simulation"><code class="docutils literal notranslate"><span class="pre">ArbdModel.prepare_for_simulation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.run_IBI"><code class="docutils literal notranslate"><span class="pre">ArbdModel.run_IBI()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.simulate"><code class="docutils literal notranslate"><span class="pre">ArbdModel.simulate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.update"><code class="docutils literal notranslate"><span class="pre">ArbdModel.update()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.ArbdModel.useNonbondedScheme"><code class="docutils literal notranslate"><span class="pre">ArbdModel.useNonbondedScheme()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel"><code class="docutils literal notranslate"><span class="pre">PdbModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel.write_pdb"><code class="docutils literal notranslate"><span class="pre">PdbModel.write_pdb()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel.write_pqr"><code class="docutils literal notranslate"><span class="pre">PdbModel.write_pqr()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.model.PdbModel.write_psf"><code class="docutils literal notranslate"><span class="pre">PdbModel.write_psf()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/core/sim_config.html b/_build/html/api/core/sim_config.html
index 4a317e9b6d288e55a619b31c5dc476d5f1153c50..744c946af50de4b8f313e12ef1cc401099bff1f7 100644
--- a/_build/html/api/core/sim_config.html
+++ b/_build/html/api/core/sim_config.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,25 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.DefaultSimConf"><code class="docutils literal notranslate"><span class="pre">DefaultSimConf</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.DefaultSimConf.temperature"><code class="docutils literal notranslate"><span class="pre">DefaultSimConf.temperature</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf"><code class="docutils literal notranslate"><span class="pre">SimConf</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.combine"><code class="docutils literal notranslate"><span class="pre">SimConf.combine()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.get_binary"><code class="docutils literal notranslate"><span class="pre">SimConf.get_binary()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.items"><code class="docutils literal notranslate"><span class="pre">SimConf.items()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.set_binary"><code class="docutils literal notranslate"><span class="pre">SimConf.set_binary()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.temperature"><code class="docutils literal notranslate"><span class="pre">SimConf.temperature</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -352,6 +373,67 @@ document.write(`
 <h1>sim_config<a class="headerlink" href="#sim-config" title="Link to this heading">#</a></h1>
 <p>Simulation configuration module. Provides SimConf and DefaultSimConf
 classes for configuring simulation parameters.</p>
+<p id="module-arbdmodel.sim_config">Simulation configuration module. Provides SimConf and DefaultSimConf
+classes for configuring simulation parameters.</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.DefaultSimConf">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DefaultSimConf</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">integrator</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'MD'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timestep</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2e-05</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thermostat</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'Langevin'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">barostat</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">temperature</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">295</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pressure</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">50</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pairlist_distance</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">decomp_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">40</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seed</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">restart_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gpu</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">viscosity</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.01</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solvent_density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_heavy_cluster</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">3</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sim_config.html#DefaultSimConf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sim_config.DefaultSimConf" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.sim_config.SimConf" title="arbdmodel.sim_config.SimConf"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimConf</span></code></a></p>
+<p>Generic class describing properties for a simulation with default binary paths</p>
+<dl class="py property">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.DefaultSimConf.temperature">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">temperature</span></span><a class="headerlink" href="#arbdmodel.sim_config.DefaultSimConf.temperature" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.SimConf">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SimConf</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">integrator</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timestep</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thermostat</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">barostat</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">temperature</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pressure</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pairlist_distance</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">decomp_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gpu</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seed</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">restart_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rigid_body_integrator</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rigid_body_grid_grid_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">viscosity</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solvent_density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_heavy_cluster</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">arbd_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">namd_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">vmd_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">hydropro_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">apbs_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gmsh_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sim_config.html#SimConf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sim_config.SimConf" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Class describing properties for a (ARBD or NAMD) simulation</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.SimConf.combine">
+<span class="sig-name descname"><span class="pre">combine</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">other</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">policy</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'override'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">warn</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sim_config.html#SimConf.combine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sim_config.SimConf.combine" title="Link to this definition">#</a></dt>
+<dd><p>Creates a new SimConf object whose properties are
+initialized to be from “self”, but are overridden with
+properties in “other”, provided they are not None</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.SimConf.get_binary">
+<span class="sig-name descname"><span class="pre">get_binary</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sim_config.html#SimConf.get_binary"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sim_config.SimConf.get_binary" title="Link to this definition">#</a></dt>
+<dd><p>Get the path to a specific binary with improved error handling.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>name</strong> – The name of the binary (e.g., ‘arbd’, ‘hydropro’)</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Path to the binary if found, None otherwise</p>
+</dd>
+</dl>
+<p>This method does not raise exceptions when binaries are not found, allowing
+for graceful handling of missing optional dependencies.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.SimConf.items">
+<span class="sig-name descname"><span class="pre">items</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sim_config.html#SimConf.items"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sim_config.SimConf.items" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.SimConf.set_binary">
+<span class="sig-name descname"><span class="pre">set_binary</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sim_config.html#SimConf.set_binary"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sim_config.SimConf.set_binary" title="Link to this definition">#</a></dt>
+<dd><p>Set the path to a specific binary.</p>
+</dd></dl>
+
+<dl class="py property">
+<dt class="sig sig-object py" id="arbdmodel.sim_config.SimConf.temperature">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">temperature</span></span><a class="headerlink" href="#arbdmodel.sim_config.SimConf.temperature" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -391,6 +473,32 @@ classes for configuring simulation parameters.</p>
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.DefaultSimConf"><code class="docutils literal notranslate"><span class="pre">DefaultSimConf</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.DefaultSimConf.temperature"><code class="docutils literal notranslate"><span class="pre">DefaultSimConf.temperature</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf"><code class="docutils literal notranslate"><span class="pre">SimConf</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.combine"><code class="docutils literal notranslate"><span class="pre">SimConf.combine()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.get_binary"><code class="docutils literal notranslate"><span class="pre">SimConf.get_binary()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.items"><code class="docutils literal notranslate"><span class="pre">SimConf.items()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.set_binary"><code class="docutils literal notranslate"><span class="pre">SimConf.set_binary()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sim_config.SimConf.temperature"><code class="docutils literal notranslate"><span class="pre">SimConf.temperature</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/index.html b/_build/html/api/index.html
index 362e8a4d7ab380fa6e05152d80b48054c0615ba0..1fa2ea59524b1f75a2c4cc623ba731e2d4d45073 100644
--- a/_build/html/api/index.html
+++ b/_build/html/api/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../_static/copybutton.js?v=f281be69"></script>
     <script src="../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../_static/tabs.js?v=3ee01567"></script>
-    <script src="../_static/js/hoverxref.js"></script>
-    <script src="../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../_static/js/micromodal.min.js"></script>
+    <script src="../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/interaction_potentials/ibi.html b/_build/html/api/interaction_potentials/ibi.html
index 3801754a9bf06b682a9998e61df3f2084c58908a..2b68869596205923953f5ca90b6cb5f9e69fd35d 100644
--- a/_build/html/api/interaction_potentials/ibi.html
+++ b/_build/html/api/interaction_potentials/ibi.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/interaction_potentials/index.html b/_build/html/api/interaction_potentials/index.html
index a113e418c96adac24300a50ad0867e68dd1f8d22..48ad74db3b1a3307b629d5285d928c56dd79acb9 100644
--- a/_build/html/api/interaction_potentials/index.html
+++ b/_build/html/api/interaction_potentials/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/interaction_potentials/interactions.html b/_build/html/api/interaction_potentials/interactions.html
index bd633f9d1322f1b1836fab7292a05c089d7eae64..537d965a5c68341edcd4ae0e4ad0fd55f2e1974e 100644
--- a/_build/html/api/interaction_potentials/interactions.html
+++ b/_build/html/api/interaction_potentials/interactions.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -354,6 +354,11 @@ document.write(`
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.AbstractPotential.write_file"><code class="docutils literal notranslate"><span class="pre">AbstractPotential.write_file()</span></code></a></li>
 </ul>
 </li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.BoundaryPotential"><code class="docutils literal notranslate"><span class="pre">BoundaryPotential</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.BoundaryPotential.potential"><code class="docutils literal notranslate"><span class="pre">BoundaryPotential.potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.BoundaryPotential.write_file"><code class="docutils literal notranslate"><span class="pre">BoundaryPotential.write_file()</span></code></a></li>
+</ul>
+</li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.HalfHarmonic"><code class="docutils literal notranslate"><span class="pre">HalfHarmonic</span></code></a><ul class="nav section-nav flex-column">
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.HalfHarmonic.potential"><code class="docutils literal notranslate"><span class="pre">HalfHarmonic.potential()</span></code></a></li>
 </ul>
@@ -461,6 +466,27 @@ document.write(`
 
 </dd></dl>
 
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.interactions.BoundaryPotential">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">BoundaryPotential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cell_vectors</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cell_origin</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">well_depth</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">blur</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">5.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'boundary.dx'</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/interactions.html#BoundaryPotential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.interactions.BoundaryPotential" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.interactions.AbstractPotential" title="arbdmodel.interactions.AbstractPotential"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractPotential</span></code></a></p>
+<p>Boundary potential for confining simulations.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.interactions.BoundaryPotential.potential">
+<span class="sig-name descname"><span class="pre">potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">r</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">types</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/interactions.html#BoundaryPotential.potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.interactions.BoundaryPotential.potential" title="Link to this definition">#</a></dt>
+<dd><p>Calculate potential at positions.</p>
+<p>This isn’t used directly for grid potentials in ARBD, but implemented
+for consistency with the AbstractPotential interface.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.interactions.BoundaryPotential.write_file">
+<span class="sig-name descname"><span class="pre">write_file</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">filename</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">types</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/interactions.html#BoundaryPotential.write_file"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.interactions.BoundaryPotential.write_file" title="Link to this definition">#</a></dt>
+<dd><p>Write boundary potential to grid file.</p>
+</dd></dl>
+
+</dd></dl>
+
 <dl class="py class">
 <dt class="sig sig-object py" id="arbdmodel.interactions.HalfHarmonic">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">HalfHarmonic</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">range_</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">None)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_force</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_potential</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">zero</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'last'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/interactions.html#HalfHarmonic"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.interactions.HalfHarmonic" title="Link to this definition">#</a></dt>
@@ -717,6 +743,11 @@ document.write(`
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.AbstractPotential.write_file"><code class="docutils literal notranslate"><span class="pre">AbstractPotential.write_file()</span></code></a></li>
 </ul>
 </li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.BoundaryPotential"><code class="docutils literal notranslate"><span class="pre">BoundaryPotential</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.BoundaryPotential.potential"><code class="docutils literal notranslate"><span class="pre">BoundaryPotential.potential()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.BoundaryPotential.write_file"><code class="docutils literal notranslate"><span class="pre">BoundaryPotential.write_file()</span></code></a></li>
+</ul>
+</li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.HalfHarmonic"><code class="docutils literal notranslate"><span class="pre">HalfHarmonic</span></code></a><ul class="nav section-nav flex-column">
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.interactions.HalfHarmonic.potential"><code class="docutils literal notranslate"><span class="pre">HalfHarmonic.potential()</span></code></a></li>
 </ul>
diff --git a/_build/html/api/polymer_modeling/fjc_polymer_model.html b/_build/html/api/polymer_modeling/fjc_polymer_model.html
index 8babd4b9dd5d1df29c6510559c0ea606bb7b501b..64a5b45512e8fc57f5690e8a14876faf2e8a8c0f 100644
--- a/_build/html/api/polymer_modeling/fjc_polymer_model.html
+++ b/_build/html/api/polymer_modeling/fjc_polymer_model.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/polymer_modeling/hps_polymer_model.html b/_build/html/api/polymer_modeling/hps_polymer_model.html
index 5f13b6fd7d98625a9b64da9c39476bb81e4a0999..8b1e2842379dc66b94d65b2501673ffb0bf94366 100644
--- a/_build/html/api/polymer_modeling/hps_polymer_model.html
+++ b/_build/html/api/polymer_modeling/hps_polymer_model.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/polymer_modeling/index.html b/_build/html/api/polymer_modeling/index.html
index d64c0d2c13d32e4ebf0b48f7eaf388ebad1cf96c..aff54d1930cca49815ea5fec3f84749d5f135a99 100644
--- a/_build/html/api/polymer_modeling/index.html
+++ b/_build/html/api/polymer_modeling/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/polymer_modeling/kh_polymer_model.html b/_build/html/api/polymer_modeling/kh_polymer_model.html
index 362ac003db232545b823677f4b26192fc60af5e4..7da886fc925c29b37aeaa7e7efcf1a05c3d33604 100644
--- a/_build/html/api/polymer_modeling/kh_polymer_model.html
+++ b/_build/html/api/polymer_modeling/kh_polymer_model.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/polymer_modeling/mpipi_polymer.html b/_build/html/api/polymer_modeling/mpipi_polymer.html
index 7e755840719e5a7a621949ccd0dfb64ca25e903d..5dad403b28fad6c0c0a234d3e5b3d42480ec5dca 100644
--- a/_build/html/api/polymer_modeling/mpipi_polymer.html
+++ b/_build/html/api/polymer_modeling/mpipi_polymer.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/polymer_modeling/onck_polymer_model.html b/_build/html/api/polymer_modeling/onck_polymer_model.html
index 12b4a00ba5137314698b43e62f177860a1063ba8..4cbc83c3ccba60db0cb36e1f3f9e851b3cd0e28e 100644
--- a/_build/html/api/polymer_modeling/onck_polymer_model.html
+++ b/_build/html/api/polymer_modeling/onck_polymer_model.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/polymer_modeling/polymer.html b/_build/html/api/polymer_modeling/polymer.html
index e613c5a705bee456898b074293747f76941cff78..3c00dc073280c440ff894ff1fa43a90b20414af3 100644
--- a/_build/html/api/polymer_modeling/polymer.html
+++ b/_build/html/api/polymer_modeling/polymer.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -484,7 +484,7 @@ connection, location_in_self, location_in_other</p>
 <dl class="py class">
 <dt class="sig sig-object py" id="arbdmodel.polymer.PolymerBeads">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PolymerBeads</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">polymer</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sequence</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">monomers_per_bead_group</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rest_length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/polymer.html#PolymerBeads"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.polymer.PolymerBeads" title="Link to this definition">#</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Group</span></code></p>
+<dd><p>Bases: <a class="reference internal" href="../core/core_objects.html#arbdmodel.core_objects.Group" title="arbdmodel.core_objects.Group"><code class="xref py py-class docutils literal notranslate"><span class="pre">Group</span></code></a></p>
 <p>Abstract class for bead-based models that are built from Polymer objects</p>
 <dl class="py property">
 <dt class="sig sig-object py" id="arbdmodel.polymer.PolymerBeads.monomers_per_bead_group">
@@ -558,7 +558,7 @@ connection, location_in_self, location_in_other</p>
 <dl class="py class">
 <dt class="sig sig-object py" id="arbdmodel.polymer.PolymerModel">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">PolymerModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">polymers</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sequences</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">monomers_per_bead_group</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/polymer.html#PolymerModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.polymer.PolymerModel" title="Link to this definition">#</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdModel</span></code></p>
+<dd><p>Bases: <a class="reference internal" href="../core/model.html#arbdmodel.model.ArbdModel" title="arbdmodel.model.ArbdModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdModel</span></code></a></p>
 <dl class="py method">
 <dt class="sig sig-object py" id="arbdmodel.polymer.PolymerModel.generate_beads">
 <span class="sig-name descname"><span class="pre">generate_beads</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/polymer.html#PolymerModel.generate_beads"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.polymer.PolymerModel.generate_beads" title="Link to this definition">#</a></dt>
diff --git a/_build/html/api/polymer_modeling/sali_polymer_model.html b/_build/html/api/polymer_modeling/sali_polymer_model.html
index 89061134341234ab0e1c5ed26e1a4b627eafd750..1feeb534e607b5fcf5ee9fb59232955ecbc29cb2 100644
--- a/_build/html/api/polymer_modeling/sali_polymer_model.html
+++ b/_build/html/api/polymer_modeling/sali_polymer_model.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,27 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.LinearBond"><code class="docutils literal notranslate"><span class="pre">LinearBond</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.LinearBond.potential"><code class="docutils literal notranslate"><span class="pre">LinearBond.potential()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliBeadsFromPolymer"><code class="docutils literal notranslate"><span class="pre">SaliBeadsFromPolymer</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliModel"><code class="docutils literal notranslate"><span class="pre">SaliModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliModel.generate_beads"><code class="docutils literal notranslate"><span class="pre">SaliModel.generate_beads()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliModel.update_splines"><code class="docutils literal notranslate"><span class="pre">SaliModel.update_splines()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliNonbonded"><code class="docutils literal notranslate"><span class="pre">SaliNonbonded</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliNonbonded.potential"><code class="docutils literal notranslate"><span class="pre">SaliNonbonded.potential()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +374,51 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="sali-polymer-model">
 <h1>sali_polymer_model<a class="headerlink" href="#sali-polymer-model" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.sali_polymer_model</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.sali_polymer_model">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.LinearBond">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">LinearBond</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">k</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">r0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rRange</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">50)</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">maxForce</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_potential</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">prefix</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'potentials/'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#LinearBond"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.LinearBond" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../interaction_potentials/interactions.html#arbdmodel.interactions.HarmonicBond" title="arbdmodel.interactions.HarmonicBond"><code class="xref py py-class docutils literal notranslate"><span class="pre">HarmonicBond</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.LinearBond.potential">
+<span class="sig-name descname"><span class="pre">potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dr</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#LinearBond.potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.LinearBond.potential" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.SaliBeadsFromPolymer">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SaliBeadsFromPolymer</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">polymer</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sequence</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#SaliBeadsFromPolymer"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.SaliBeadsFromPolymer" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/core_objects.html#arbdmodel.core_objects.Group" title="arbdmodel.core_objects.Group"><code class="xref py py-class docutils literal notranslate"><span class="pre">Group</span></code></a></p>
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.SaliModel">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SaliModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">polymers</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sequences</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">debye_length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">damping_coefficient</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">DEBUG</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#SaliModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.SaliModel" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/model.html#arbdmodel.model.ArbdModel" title="arbdmodel.model.ArbdModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdModel</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.SaliModel.generate_beads">
+<span class="sig-name descname"><span class="pre">generate_beads</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#SaliModel.generate_beads"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.SaliModel.generate_beads" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.SaliModel.update_splines">
+<span class="sig-name descname"><span class="pre">update_splines</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">coords</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#SaliModel.update_splines"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.SaliModel.update_splines" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.SaliNonbonded">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SaliNonbonded</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.1</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#SaliNonbonded"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.SaliNonbonded" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../interaction_potentials/interactions.html#arbdmodel.interactions.AbstractPotential" title="arbdmodel.interactions.AbstractPotential"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractPotential</span></code></a></p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.sali_polymer_model.SaliNonbonded.potential">
+<span class="sig-name descname"><span class="pre">potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">r</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/sali_polymer_model.html#SaliNonbonded.potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.sali_polymer_model.SaliNonbonded.potential" title="Link to this definition">#</a></dt>
+<dd><p>Constant force excluded volume</p>
+</dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +458,34 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.LinearBond"><code class="docutils literal notranslate"><span class="pre">LinearBond</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.LinearBond.potential"><code class="docutils literal notranslate"><span class="pre">LinearBond.potential()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliBeadsFromPolymer"><code class="docutils literal notranslate"><span class="pre">SaliBeadsFromPolymer</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliModel"><code class="docutils literal notranslate"><span class="pre">SaliModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliModel.generate_beads"><code class="docutils literal notranslate"><span class="pre">SaliModel.generate_beads()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliModel.update_splines"><code class="docutils literal notranslate"><span class="pre">SaliModel.update_splines()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliNonbonded"><code class="docutils literal notranslate"><span class="pre">SaliNonbonded</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.sali_polymer_model.SaliNonbonded.potential"><code class="docutils literal notranslate"><span class="pre">SaliNonbonded.potential()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/polymer_modeling/ssdna_two_bead.html b/_build/html/api/polymer_modeling/ssdna_two_bead.html
index 59c77b01cd5324cbecafa14385591ecff8db10df..9cddcd48dc13841fd0d52475835e442c07c62e30 100644
--- a/_build/html/api/polymer_modeling/ssdna_two_bead.html
+++ b/_build/html/api/polymer_modeling/ssdna_two_bead.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -379,17 +379,17 @@ document.write(`
 <dd><p>Bases: <a class="reference internal" href="polymer.html#arbdmodel.polymer.PolymerBeads" title="arbdmodel.polymer.PolymerBeads"><code class="xref py py-class docutils literal notranslate"><span class="pre">PolymerBeads</span></code></a></p>
 <dl class="py attribute">
 <dt class="sig sig-object py" id="arbdmodel.ssdna_two_bead.DnaStrandBeads.b">
-<span class="sig-name descname"><span class="pre">b</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;arbdmodel.PointParticle</span> <span class="pre">&quot;B&quot;</span> <span class="pre">of</span> <span class="pre">&lt;&lt;class</span> <span class="pre">'arbdmodel.ParticleType'&gt;</span> <span class="pre">B&gt;&gt;</span></em><a class="headerlink" href="#arbdmodel.ssdna_two_bead.DnaStrandBeads.b" title="Link to this definition">#</a></dt>
+<span class="sig-name descname"><span class="pre">b</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;arbdmodel.core_objects.PointParticle</span> <span class="pre">&quot;B&quot;</span> <span class="pre">of</span> <span class="pre">&lt;&lt;class</span> <span class="pre">'arbdmodel.core_objects.ParticleType'&gt;</span> <span class="pre">B&gt;&gt;</span></em><a class="headerlink" href="#arbdmodel.ssdna_two_bead.DnaStrandBeads.b" title="Link to this definition">#</a></dt>
 <dd></dd></dl>
 
 <dl class="py attribute">
 <dt class="sig sig-object py" id="arbdmodel.ssdna_two_bead.DnaStrandBeads.nt">
-<span class="sig-name descname"><span class="pre">nt</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;arbdmodel.Group</span> <span class="pre">object&gt;</span></em><a class="headerlink" href="#arbdmodel.ssdna_two_bead.DnaStrandBeads.nt" title="Link to this definition">#</a></dt>
+<span class="sig-name descname"><span class="pre">nt</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;arbdmodel.core_objects.Group</span> <span class="pre">object&gt;</span></em><a class="headerlink" href="#arbdmodel.ssdna_two_bead.DnaStrandBeads.nt" title="Link to this definition">#</a></dt>
 <dd></dd></dl>
 
 <dl class="py attribute">
 <dt class="sig sig-object py" id="arbdmodel.ssdna_two_bead.DnaStrandBeads.p">
-<span class="sig-name descname"><span class="pre">p</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;arbdmodel.PointParticle</span> <span class="pre">&quot;P&quot;</span> <span class="pre">of</span> <span class="pre">&lt;&lt;class</span> <span class="pre">'arbdmodel.ParticleType'&gt;</span> <span class="pre">P&gt;&gt;</span></em><a class="headerlink" href="#arbdmodel.ssdna_two_bead.DnaStrandBeads.p" title="Link to this definition">#</a></dt>
+<span class="sig-name descname"><span class="pre">p</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">&lt;arbdmodel.core_objects.PointParticle</span> <span class="pre">&quot;P&quot;</span> <span class="pre">of</span> <span class="pre">&lt;&lt;class</span> <span class="pre">'arbdmodel.core_objects.ParticleType'&gt;</span> <span class="pre">P&gt;&gt;</span></em><a class="headerlink" href="#arbdmodel.ssdna_two_bead.DnaStrandBeads.p" title="Link to this definition">#</a></dt>
 <dd></dd></dl>
 
 </dd></dl>
diff --git a/_build/html/api/rigidbody_models/index.html b/_build/html/api/rigidbody_models/index.html
index 1bb772d34fe8dbbe9e45090a8fc2ac5baaf874fc..05bb82ed4904227335e1ef61f7b875738b2f6496 100644
--- a/_build/html/api/rigidbody_models/index.html
+++ b/_build/html/api/rigidbody_models/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/rigidbody_models/mesh_process_surface.html b/_build/html/api/rigidbody_models/mesh_process_surface.html
index 5655316cbbfd1fb49c737938d0e5c701d9322bf0..7a72f906f33d6121c29559b523c71109ef3ad646 100644
--- a/_build/html/api/rigidbody_models/mesh_process_surface.html
+++ b/_build/html/api/rigidbody_models/mesh_process_surface.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,25 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.MICRON_TO_ANGSTROM"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.MICRON_TO_ANGSTROM</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.calculate_damping()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.generate_potential_grid()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.get_attached_particles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.save_aligned_mesh()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.save_aligned_mesh_both_formats()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.save_as_pdb()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.write_no_enter_potential_dx()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.process_surface_mesh"><code class="docutils literal notranslate"><span class="pre">process_surface_mesh()</span></code></a></li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +372,81 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="mesh-process-surface">
 <h1>mesh_process_surface<a class="headerlink" href="#mesh-process-surface" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.mesh_process_surface</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.mesh_process_surface">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SurfaceMeshProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mesh_file</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">19.3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">unit_scale</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10000</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Process surface meshes to calculate inertia, hydrodynamics and generate potential fields</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.MICRON_TO_ANGSTROM">
+<span class="sig-name descname"><span class="pre">MICRON_TO_ANGSTROM</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">10000</span></em><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.MICRON_TO_ANGSTROM" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping">
+<span class="sig-name descname"><span class="pre">calculate_damping</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.calculate_damping"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping" title="Link to this definition">#</a></dt>
+<dd><p>Calculate hydrodynamic properties using HydroPro</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid">
+<span class="sig-name descname"><span class="pre">generate_potential_grid</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">spacing</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buffer</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">20.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_potential</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000.0</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.generate_potential_grid"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid" title="Link to this definition">#</a></dt>
+<dd><p>Generate potential grid for ARBD</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles">
+<span class="sig-name descname"><span class="pre">get_attached_particles</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.get_attached_particles"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh">
+<span class="sig-name descname"><span class="pre">save_aligned_mesh</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.save_aligned_mesh"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh" title="Link to this definition">#</a></dt>
+<dd><p>Save the aligned mesh to a new .msh file</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats">
+<span class="sig-name descname"><span class="pre">save_aligned_mesh_both_formats</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">base_filename</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.save_aligned_mesh_both_formats"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats" title="Link to this definition">#</a></dt>
+<dd><p>Save the aligned mesh in both MSH and PDB formats</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb">
+<span class="sig-name descname"><span class="pre">save_as_pdb</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.save_as_pdb"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb" title="Link to this definition">#</a></dt>
+<dd><p>Save the aligned mesh as a PDB file (coordinates in Ã…)</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx">
+<span class="sig-name descname"><span class="pre">write_no_enter_potential_dx</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#SurfaceMeshProcessor.write_no_enter_potential_dx"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_surface.process_surface_mesh">
+<span class="sig-name descname"><span class="pre">process_surface_mesh</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mesh_file</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">19.3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">temperature</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">303</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">viscosity</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.01</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">solvent_density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_dx</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'surface_potential.dx'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_mesh</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'aligned_surface.msh'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">binary_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_surface.html#process_surface_mesh"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_surface.process_surface_mesh" title="Link to this definition">#</a></dt>
+<dd><p>Process surface mesh file and calculate all properties</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>mesh_file</strong> – Path to .msh file containing surface triangles</p></li>
+<li><p><strong>density</strong> – Material density in g/cm³</p></li>
+<li><p><strong>temperature</strong> – Temperature in Kelvin</p></li>
+<li><p><strong>viscosity</strong> – Solvent viscosity in poise</p></li>
+<li><p><strong>solvent_density</strong> – Solvent density in g/cm³</p></li>
+<li><p><strong>output_dx</strong> – Optional path to output potential DX file</p></li>
+<li><p><strong>output_mesh</strong> – Optional path to save aligned mesh</p></li>
+<li><p><strong>binary_path</strong> – Path to HydroPro executable</p></li>
+<li><p><strong>expected_mass</strong> – Optional expected mass in amu to calibrate calculations</p></li>
+<li><p><strong>expected_aspect_ratio</strong> – Optional expected aspect ratio to calibrate inertia</p></li>
+<li><p><strong>**kwargs</strong> – Additional arguments for potential generation</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +486,32 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.MICRON_TO_ANGSTROM"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.MICRON_TO_ANGSTROM</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.calculate_damping()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.generate_potential_grid()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.get_attached_particles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.save_aligned_mesh()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.save_aligned_mesh_both_formats()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.save_as_pdb()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx"><code class="docutils literal notranslate"><span class="pre">SurfaceMeshProcessor.write_no_enter_potential_dx()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_surface.process_surface_mesh"><code class="docutils literal notranslate"><span class="pre">process_surface_mesh()</span></code></a></li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/rigidbody_models/mesh_process_volume.html b/_build/html/api/rigidbody_models/mesh_process_volume.html
index 86590eeab15f031c0599d07677c4f0114b594e1a..1487ed12a0ab8f7f869c60d3bb39083c534dbe21 100644
--- a/_build/html/api/rigidbody_models/mesh_process_volume.html
+++ b/_build/html/api/rigidbody_models/mesh_process_volume.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,24 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor"><code class="docutils literal notranslate"><span class="pre">MeshProcessor</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.MICRON_TO_ANGSTROM"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.MICRON_TO_ANGSTROM</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.calculate_damping()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.generate_potential_grid()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.get_attached_particles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.save_aligned_mesh()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.save_as_pdb()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.write_no_enter_potential()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.process_mesh_file"><code class="docutils literal notranslate"><span class="pre">process_mesh_file()</span></code></a></li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +371,75 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="mesh-process-volume">
 <h1>mesh_process_volume<a class="headerlink" href="#mesh-process-volume" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.mesh_process_volume</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.mesh_process_volume">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">MeshProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mesh_file</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">19.3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">unit_scale</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10000</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">expected_mass</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Process gmsh files to calculate inertia, hydrodynamics and generate potential fields</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.MICRON_TO_ANGSTROM">
+<span class="sig-name descname"><span class="pre">MICRON_TO_ANGSTROM</span></span><em class="property"><span class="w"> </span><span class="p"><span class="pre">=</span></span><span class="w"> </span><span class="pre">10000</span></em><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.MICRON_TO_ANGSTROM" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping">
+<span class="sig-name descname"><span class="pre">calculate_damping</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor.calculate_damping"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping" title="Link to this definition">#</a></dt>
+<dd><p>Calculate hydrodynamic properties using HydroPro</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid">
+<span class="sig-name descname"><span class="pre">generate_potential_grid</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">spacing</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buffer</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">20.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">k</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_potential</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000.0</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor.generate_potential_grid"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid" title="Link to this definition">#</a></dt>
+<dd><p>Generate potential grid for ARBD</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles">
+<span class="sig-name descname"><span class="pre">get_attached_particles</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor.get_attached_particles"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh">
+<span class="sig-name descname"><span class="pre">save_aligned_mesh</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor.save_aligned_mesh"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb">
+<span class="sig-name descname"><span class="pre">save_as_pdb</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor.save_as_pdb"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb" title="Link to this definition">#</a></dt>
+<dd><p>Save the aligned mesh as a PDB file (coordinates in Ã…)</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential">
+<span class="sig-name descname"><span class="pre">write_no_enter_potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#MeshProcessor.write_no_enter_potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential" title="Link to this definition">#</a></dt>
+<dd><p>Generate and write potential field to DX file so particles do not fall inside rigidbody.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.mesh_process_volume.process_mesh_file">
+<span class="sig-name descname"><span class="pre">process_mesh_file</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mesh_file</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">19.3</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_process_volume.html#process_mesh_file"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_process_volume.process_mesh_file" title="Link to this definition">#</a></dt>
+<dd><p>Process mesh file and calculate all properties</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>mesh_file</strong> – Path to .msh file</p></li>
+<li><p><strong>density</strong> – Material density in g/cm³</p></li>
+<li><p><strong>temperature</strong> – Temperature in Kelvin</p></li>
+<li><p><strong>viscosity</strong> – Solvent viscosity in poise</p></li>
+<li><p><strong>solvent_density</strong> – Solvent density in g/cm³</p></li>
+<li><p><strong>output_dx</strong> – Optional path to output potential DX file</p></li>
+<li><p><strong>output_mesh</strong> – Optional path to save aligned mesh</p></li>
+<li><p><strong>binary_path</strong> – Path to HydroPro executable</p></li>
+<li><p><strong>expected_mass</strong> – Optional expected mass in amu to calibrate calculations</p></li>
+<li><p><strong>expected_aspect_ratio</strong> – Optional expected aspect ratio to calibrate inertia</p></li>
+<li><p><strong>**kwargs</strong> – Additional arguments for potential generation</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +479,31 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor"><code class="docutils literal notranslate"><span class="pre">MeshProcessor</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.MICRON_TO_ANGSTROM"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.MICRON_TO_ANGSTROM</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.calculate_damping()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.generate_potential_grid()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.get_attached_particles()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.save_aligned_mesh()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.save_as_pdb()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential"><code class="docutils literal notranslate"><span class="pre">MeshProcessor.write_no_enter_potential()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_process_volume.process_mesh_file"><code class="docutils literal notranslate"><span class="pre">process_mesh_file()</span></code></a></li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/rigidbody_models/mesh_rigidbody.html b/_build/html/api/rigidbody_models/mesh_rigidbody.html
index 027e61043554d60af7c51285ef2c2a16477a8f8d..e7fabf249dc9adf83ad1d677dbdb9048176d46c9 100644
--- a/_build/html/api/rigidbody_models/mesh_rigidbody.html
+++ b/_build/html/api/rigidbody_models/mesh_rigidbody.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,14 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_rigidbody.MeshRigidBodyType"><code class="docutils literal notranslate"><span class="pre">MeshRigidBodyType</span></code></a></li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +361,13 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="mesh-rigidbody">
 <h1>mesh_rigidbody<a class="headerlink" href="#mesh-rigidbody" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.mesh_rigidbody</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.mesh_rigidbody">
+<dt class="sig sig-object py" id="arbdmodel.mesh_rigidbody.MeshRigidBodyType">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">MeshRigidBodyType</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">mesh_file</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">density</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">19.3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">unit_scale</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">use_surface</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/mesh_rigidbody.html#MeshRigidBodyType"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.mesh_rigidbody.MeshRigidBodyType" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/core_objects.html#arbdmodel.core_objects.RigidBodyType" title="arbdmodel.core_objects.RigidBodyType"><code class="xref py py-class docutils literal notranslate"><span class="pre">RigidBodyType</span></code></a></p>
+<p>RigidBodyType subclass for shape rigid body objects</p>
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +407,21 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.mesh_rigidbody.MeshRigidBodyType"><code class="docutils literal notranslate"><span class="pre">MeshRigidBodyType</span></code></a></li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/rigidbody_models/simplearbd.html b/_build/html/api/rigidbody_models/simplearbd.html
index a4c675714717cad3bb96225f8cf291ea9ddd31e5..33270f143dceef2ee07c18436fe0bba8fee2372d 100644
--- a/_build/html/api/rigidbody_models/simplearbd.html
+++ b/_build/html/api/rigidbody_models/simplearbd.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,22 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.create_engine"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.create_engine()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.create_model"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.create_model()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.run_simulation"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.run_simulation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.setup_diffusible_objects()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.setup_static_objects()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.main"><code class="docutils literal notranslate"><span class="pre">main()</span></code></a></li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +369,85 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="simplearbd">
 <h1>simplearbd<a class="headerlink" href="#simplearbd" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.simplearbd</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.simplearbd">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.SimpleArbdConfig">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SimpleArbdConfig</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">config_path</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#SimpleArbdConfig"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.SimpleArbdConfig" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Parse and manage SimpleARBD configuration file.</p>
+<p>This class provides a modern, clean interface for reading SimpleARBD
+configuration files and setting up the simulation.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.SimpleArbdConfig.create_engine">
+<span class="sig-name descname"><span class="pre">create_engine</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#SimpleArbdConfig.create_engine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.SimpleArbdConfig.create_engine" title="Link to this definition">#</a></dt>
+<dd><p>Create a SimpleArbdEngine from the configuration.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Returns<span class="colon">:</span></dt>
+<dd class="field-odd"><p>SimpleArbdEngine instance</p>
+</dd>
+<dt class="field-even">Return type<span class="colon">:</span></dt>
+<dd class="field-even"><p><a class="reference internal" href="structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine" title="arbdmodel.structure_rigidbody.SimpleArbdEngine"><em>SimpleArbdEngine</em></a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.SimpleArbdConfig.create_model">
+<span class="sig-name descname"><span class="pre">create_model</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#SimpleArbdConfig.create_model"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.SimpleArbdConfig.create_model" title="Link to this definition">#</a></dt>
+<dd><p>Create a StructureRigidBodyModel from the configuration.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Returns<span class="colon">:</span></dt>
+<dd class="field-odd"><p>StructureRigidBodyModel instance</p>
+</dd>
+<dt class="field-even">Return type<span class="colon">:</span></dt>
+<dd class="field-even"><p><a class="reference internal" href="structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel" title="arbdmodel.structure_rigidbody.StructureRigidBodyModel"><em>StructureRigidBodyModel</em></a></p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.SimpleArbdConfig.run_simulation">
+<span class="sig-name descname"><span class="pre">run_simulation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">engine</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#SimpleArbdConfig.run_simulation"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.SimpleArbdConfig.run_simulation" title="Link to this definition">#</a></dt>
+<dd><p>Run the simulation.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>model</strong> (<a class="reference internal" href="structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel" title="arbdmodel.structure_rigidbody.StructureRigidBodyModel"><em>StructureRigidBodyModel</em></a>) – StructureRigidBodyModel to simulate</p></li>
+<li><p><strong>engine</strong> (<a class="reference internal" href="structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine" title="arbdmodel.structure_rigidbody.SimpleArbdEngine"><em>SimpleArbdEngine</em></a>) – SimpleArbdEngine to use for simulation</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects">
+<span class="sig-name descname"><span class="pre">setup_diffusible_objects</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#SimpleArbdConfig.setup_diffusible_objects"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects" title="Link to this definition">#</a></dt>
+<dd><p>Set up diffusible objects in the model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>model</strong> (<a class="reference internal" href="structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel" title="arbdmodel.structure_rigidbody.StructureRigidBodyModel"><em>StructureRigidBodyModel</em></a>) – StructureRigidBodyModel to add diffusible objects to</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects">
+<span class="sig-name descname"><span class="pre">setup_static_objects</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#SimpleArbdConfig.setup_static_objects"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects" title="Link to this definition">#</a></dt>
+<dd><p>Set up static objects in the model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>model</strong> (<a class="reference internal" href="structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel" title="arbdmodel.structure_rigidbody.StructureRigidBodyModel"><em>StructureRigidBodyModel</em></a>) – StructureRigidBodyModel to add static objects to</p>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.simplearbd.main">
+<span class="sig-name descname"><span class="pre">main</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/simplearbd.html#main"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.simplearbd.main" title="Link to this definition">#</a></dt>
+<dd><p>Main function to process SimpleARBD configuration file and run simulation.</p>
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +487,29 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.create_engine"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.create_engine()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.create_model"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.create_model()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.run_simulation"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.run_simulation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.setup_diffusible_objects()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects"><code class="docutils literal notranslate"><span class="pre">SimpleArbdConfig.setup_static_objects()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.simplearbd.main"><code class="docutils literal notranslate"><span class="pre">main()</span></code></a></li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/rigidbody_models/structure_from_pdb.html b/_build/html/api/rigidbody_models/structure_from_pdb.html
index be472a34fc1f9a7e4eed109e0515a0924629cfa6..0c5538e4dc25170b20c63bef858b9086e006bc00 100644
--- a/_build/html/api/rigidbody_models/structure_from_pdb.html
+++ b/_build/html/api/rigidbody_models/structure_from_pdb.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,24 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor"><code class="docutils literal notranslate"><span class="pre">StructureProcessor</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.align_structure"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.align_structure()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.apply_gaussian_smoothing()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.calculate_hydrodynamic_properties()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.generate_charge_distribution()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.generate_electrostatic_map()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.generate_vdw_maps()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.get_grid_files()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.process_structure"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.process_structure()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +371,61 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="structure-from-pdb">
 <h1>structure_from_pdb<a class="headerlink" href="#structure-from-pdb" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.structure_from_pdb</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.structure_from_pdb">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">StructureProcessor</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_heavy_cluster</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parameters_folder</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'./parameters'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Process molecular structure files to calculate properties and generate maps for ARBD</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.align_structure">
+<span class="sig-name descname"><span class="pre">align_structure</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.align_structure"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.align_structure" title="Link to this definition">#</a></dt>
+<dd><p>Align structure to principal axes using VMD.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing">
+<span class="sig-name descname"><span class="pre">apply_gaussian_smoothing</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">gaussianWidth</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2.5</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.apply_gaussian_smoothing"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing" title="Link to this definition">#</a></dt>
+<dd><p>Apply Gaussian smoothing to all potential maps.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties">
+<span class="sig-name descname"><span class="pre">calculate_hydrodynamic_properties</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.calculate_hydrodynamic_properties"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties" title="Link to this definition">#</a></dt>
+<dd><p>Calculate hydrodynamic properties using HydroPro.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution">
+<span class="sig-name descname"><span class="pre">generate_charge_distribution</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2.0</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.generate_charge_distribution"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution" title="Link to this definition">#</a></dt>
+<dd><p>Generate charge distribution using VMD.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map">
+<span class="sig-name descname"><span class="pre">generate_electrostatic_map</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">buffer</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">50</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.generate_electrostatic_map"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map" title="Link to this definition">#</a></dt>
+<dd><p>Generate electrostatic potential map using APBS.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps">
+<span class="sig-name descname"><span class="pre">generate_vdw_maps</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">potResolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">denResolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.generate_vdw_maps"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps" title="Link to this definition">#</a></dt>
+<dd><p>Generate VDW maps using VMD.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files">
+<span class="sig-name descname"><span class="pre">get_grid_files</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.get_grid_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files" title="Link to this definition">#</a></dt>
+<dd><p>Get dictionary of grid files for use in RigidBodyType.</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_from_pdb.StructureProcessor.process_structure">
+<span class="sig-name descname"><span class="pre">process_structure</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_from_pdb.html#StructureProcessor.process_structure"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_from_pdb.StructureProcessor.process_structure" title="Link to this definition">#</a></dt>
+<dd><p>Process structure to get all properties and potential maps</p>
+</dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +465,31 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor"><code class="docutils literal notranslate"><span class="pre">StructureProcessor</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.align_structure"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.align_structure()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.apply_gaussian_smoothing()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.calculate_hydrodynamic_properties()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.generate_charge_distribution()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.generate_electrostatic_map()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.generate_vdw_maps()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.get_grid_files()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_from_pdb.StructureProcessor.process_structure"><code class="docutils literal notranslate"><span class="pre">StructureProcessor.process_structure()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/rigidbody_models/structure_rigidbody.html b/_build/html/api/rigidbody_models/structure_rigidbody.html
index f45c9795d28a9dff48cebae4147d6e8009f7a0bd..67ab6610aa9ffa085fe79e6be64ae3e1c1ccaf20 100644
--- a/_build/html/api/rigidbody_models/structure_rigidbody.html
+++ b/_build/html/api/rigidbody_models/structure_rigidbody.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,28 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.DiffusiveRigidBodyType"><code class="docutils literal notranslate"><span class="pre">DiffusiveRigidBodyType</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine"><code class="docutils literal notranslate"><span class="pre">SimpleArbdEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation"><code class="docutils literal notranslate"><span class="pre">SimpleArbdEngine.run_simulation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">SimpleArbdEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StaticObject"><code class="docutils literal notranslate"><span class="pre">StaticObject</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StaticObject.process"><code class="docutils literal notranslate"><span class="pre">StaticObject.process()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel"><code class="docutils literal notranslate"><span class="pre">StructureRigidBodyModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object"><code class="docutils literal notranslate"><span class="pre">StructureRigidBodyModel.add_diffusible_object()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object"><code class="docutils literal notranslate"><span class="pre">StructureRigidBodyModel.add_static_object()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +375,108 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="structure-rigidbody">
 <h1>structure_rigidbody<a class="headerlink" href="#structure-rigidbody" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.structure_rigidbody</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.structure_rigidbody">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.DiffusiveRigidBodyType">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">DiffusiveRigidBodyType</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">structure_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#DiffusiveRigidBodyType"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.DiffusiveRigidBodyType" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/core_objects.html#arbdmodel.core_objects.RigidBodyType" title="arbdmodel.core_objects.RigidBodyType"><code class="xref py py-class docutils literal notranslate"><span class="pre">RigidBodyType</span></code></a></p>
+<p>RigidBodyType subclass for structure-based rigid body objects</p>
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.SimpleArbdEngine">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SimpleArbdEngine</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">extra_bd_file_lines</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#SimpleArbdEngine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../simulation_engines/engine.html#arbdmodel.engine.ArbdEngine" title="arbdmodel.engine.ArbdEngine"><code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdEngine</span></code></a></p>
+<p>Enhanced ARBD engine with additional functionality for structure simulations</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation">
+<span class="sig-name descname"><span class="pre">run_simulation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">replicas</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gpu</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#SimpleArbdEngine.run_simulation"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation" title="Link to this definition">#</a></dt>
+<dd><p>Run ARBD simulation.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>model</strong> – ArbdModel to simulate</p></li>
+<li><p><strong>output_name</strong> – Base name for output files</p></li>
+<li><p><strong>replicas</strong> – Number of replicas to run</p></li>
+<li><p><strong>gpu</strong> – GPU index to use</p></li>
+<li><p><strong>**kwargs</strong> – Additional arguments for simulate method</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files">
+<span class="sig-name descname"><span class="pre">write_simulation_files</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#SimpleArbdEngine.write_simulation_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files" title="Link to this definition">#</a></dt>
+<dd><p>Write all simulation files.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>model</strong> – ArbdModel to simulate</p></li>
+<li><p><strong>output_name</strong> – Base name for output files</p></li>
+<li><p><strong>configuration</strong> – SimConf object</p></li>
+<li><p><strong>**conf_params</strong> – Additional configuration parameters</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.StaticObject">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">StaticObject</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_gigantic</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">threshold</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">300</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#StaticObject"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.StaticObject" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Class representing a static (immobile) object in the simulation</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.StaticObject.process">
+<span class="sig-name descname"><span class="pre">process</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#StaticObject.process"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.StaticObject.process" title="Link to this definition">#</a></dt>
+<dd><p>Process the structure file to create potential and density grids</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.StructureRigidBodyModel">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">StructureRigidBodyModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cell_vectors</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cell_origin</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dimensions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buffer_factor</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">use_boundary</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">boundary_params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#StructureRigidBodyModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/model.html#arbdmodel.model.ArbdModel" title="arbdmodel.model.ArbdModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdModel</span></code></a></p>
+<p>Model class for structure-based rigid body simulations</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object">
+<span class="sig-name descname"><span class="pre">add_diffusible_object</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rb_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">copies</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">positions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">orientations</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">initial_region</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">random_seed</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#StructureRigidBodyModel.add_diffusible_object"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object" title="Link to this definition">#</a></dt>
+<dd><p>Add a diffusible (mobile) rigid body type to the model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>structure_path</strong> – Path to structure files (.psf/.pdb) to create a StructureRigidBodyType</p></li>
+<li><p><strong>rb_type</strong> – Existing RigidBodyType instance (if structure_path not provided)</p></li>
+<li><p><strong>copies</strong> – Number of copies to add</p></li>
+<li><p><strong>positions</strong> – Optional list of positions for each copy</p></li>
+<li><p><strong>orientations</strong> – Optional list of orientations for each copy</p></li>
+<li><p><strong>name</strong> – Optional base name for the rigid bodies</p></li>
+<li><p><strong>initial_region</strong> – Optional dict with vectors defining initial region</p></li>
+<li><p><strong>random_seed</strong> – Optional seed for random number generator</p></li>
+<li><p><strong>work_dir</strong> – Optional working directory for structure processing</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>List of created RigidBody instances</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object">
+<span class="sig-name descname"><span class="pre">add_static_object</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">is_gigantic</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">threshold</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">300</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/structure_rigidbody.html#StructureRigidBodyModel.add_static_object"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object" title="Link to this definition">#</a></dt>
+<dd><p>Add this static object to an ARBD model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>model</strong> – ArbdModel to add this static object to</p>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +516,35 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.DiffusiveRigidBodyType"><code class="docutils literal notranslate"><span class="pre">DiffusiveRigidBodyType</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine"><code class="docutils literal notranslate"><span class="pre">SimpleArbdEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation"><code class="docutils literal notranslate"><span class="pre">SimpleArbdEngine.run_simulation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">SimpleArbdEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StaticObject"><code class="docutils literal notranslate"><span class="pre">StaticObject</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StaticObject.process"><code class="docutils literal notranslate"><span class="pre">StaticObject.process()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel"><code class="docutils literal notranslate"><span class="pre">StructureRigidBodyModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object"><code class="docutils literal notranslate"><span class="pre">StructureRigidBodyModel.add_diffusible_object()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object"><code class="docutils literal notranslate"><span class="pre">StructureRigidBodyModel.add_static_object()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/shape-based_models/index.html b/_build/html/api/shape-based_models/index.html
index 3f9b017dbb97e7b516840f97e7a61f6a267b71e6..ef2d81fb859653795956daca1c5ac55c60dc1b93 100644
--- a/_build/html/api/shape-based_models/index.html
+++ b/_build/html/api/shape-based_models/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/shape-based_models/shape_cg.html b/_build/html/api/shape-based_models/shape_cg.html
index 195482f350900b2fc7c39a17f5430047490d50de..45673d830a4a8a6ef3f67045769590d59e9bdfb9 100644
--- a/_build/html/api/shape-based_models/shape_cg.html
+++ b/_build/html/api/shape-based_models/shape_cg.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -346,8 +346,35 @@ document.write(`
             </div>
             <nav aria-label="Page">
                 <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.calc_atom_sasa"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.calc_atom_sasa()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.generate_protein"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.generate_protein()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_protein"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.get_coarse_protein()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_types"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.get_coarse_types()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.add_confinement"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.add_confinement()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.add_protein_nb_interactions"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.add_protein_nb_interactions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.add_proteins"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.add_proteins()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.calculate_total_mass"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.calculate_total_mass()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.concentration_to_debye_length"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.concentration_to_debye_length()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.from_protein_list"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.from_protein_list()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.generate_random_protein_positions"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.generate_random_protein_positions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.get_protein_types"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.get_protein_types()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.run_from_minimized"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.run_from_minimized()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.run_minimization"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.run_minimization()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.setup_and_run"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.setup_and_run()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGNonbonded"><code class="docutils literal notranslate"><span class="pre">ShapeCGNonbonded</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGNonbonded.filename"><code class="docutils literal notranslate"><span class="pre">ShapeCGNonbonded.filename()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGNonbonded.potential"><code class="docutils literal notranslate"><span class="pre">ShapeCGNonbonded.potential()</span></code></a></li>
+</ul>
+</li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.find_shape_based_sites"><code class="docutils literal notranslate"><span class="pre">find_shape_based_sites()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.get_particle_assignments"><code class="docutils literal notranslate"><span class="pre">get_particle_assignments()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.read_files"><code class="docutils literal notranslate"><span class="pre">read_files()</span></code></a></li>
 </ul>
             </nav>
         </div>
@@ -364,14 +391,379 @@ document.write(`
 <p>Shape-based coarse-grained modeling module for protein simulations.</p>
 <p>This module provides classes for creating shape-based coarse-grained models
 of proteins for use in molecular dynamics simulations.</p>
-<dl class="py function" id="module-arbdmodel.shape_cg">
+<p id="module-arbdmodel.shape_cg">Shape-based coarse-grained modeling module for protein simulations.</p>
+<p>This module provides classes for creating shape-based coarse-grained models
+of proteins for use in molecular dynamics simulations.</p>
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGFactory">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ShapeCGFactory</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">psf</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pdb</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">disordered_residues</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'SHCG'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGFactory"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGFactory" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Factory class for creating coarse-grained protein models.</p>
+<p>This class creates reduced-resolution models of proteins based on
+their shape, with customizable resolution and properties.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGFactory.calc_atom_sasa">
+<span class="sig-name descname"><span class="pre">calc_atom_sasa</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">atom_slice</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGFactory.calc_atom_sasa"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGFactory.calc_atom_sasa" title="Link to this definition">#</a></dt>
+<dd><p>Calculate solvent accessible surface area for atoms.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>atom_slice</strong> – Slice or indices for atoms to calculate SASA</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Tuple of (normalized SASA, atomic radii)</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGFactory.generate_protein">
+<span class="sig-name descname"><span class="pre">generate_protein</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">position</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">orientation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">index</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGFactory.generate_protein"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGFactory.generate_protein" title="Link to this definition">#</a></dt>
+<dd><p>Generate a new protein instance at the specified position and orientation.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>position</strong> – 3D position for the protein</p></li>
+<li><p><strong>orientation</strong> – Optional orientation matrix</p></li>
+<li><p><strong>index</strong> – Unique index for this protein instance</p></li>
+<li><p><strong>num_CG_sites</strong> – Number of CG sites to use</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Group containing the positioned protein</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGFactory.get_coarse_protein">
+<span class="sig-name descname"><span class="pre">get_coarse_protein</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGFactory.get_coarse_protein"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_protein" title="Link to this definition">#</a></dt>
+<dd><p>Generate a coarse-grained protein model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>num_CG_sites</strong> – Number of sites to represent the protein (default: based on mass)</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Group containing the coarse-grained protein</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGFactory.get_coarse_types">
+<span class="sig-name descname"><span class="pre">get_coarse_types</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGFactory.get_coarse_types"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_types" title="Link to this definition">#</a></dt>
+<dd><p>Get particle types used in the coarse-grained model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>num_CG_sites</strong> – Number of sites to represent the protein</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>List of ParticleType objects</p>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ShapeCGModel</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_factories</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">box_size</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/model.html#arbdmodel.model.ArbdModel" title="arbdmodel.model.ArbdModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdModel</span></code></a></p>
+<p>Model class for shape-based coarse-grained protein simulations.</p>
+<p>This class handles creating and simulating systems with multiple
+shape-based coarse-grained proteins.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.add_confinement">
+<span class="sig-name descname"><span class="pre">add_confinement</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_group</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">radius</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.add_confinement"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.add_confinement" title="Link to this definition">#</a></dt>
+<dd><p>Add spherical confinement to all protein particles.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_group</strong> – Group containing proteins</p></li>
+<li><p><strong>radius</strong> – Confinement radius</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.add_protein_nb_interactions">
+<span class="sig-name descname"><span class="pre">add_protein_nb_interactions</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">prot_types</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nt_sigma</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">debye_length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.add_protein_nb_interactions"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.add_protein_nb_interactions" title="Link to this definition">#</a></dt>
+<dd><p>Add nonbonded interactions between protein particles.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>prot_types</strong> – List of protein particle types</p></li>
+<li><p><strong>nt_sigma</strong> – Sigma parameter for nucleic acid interactions</p></li>
+<li><p><strong>debye_length</strong> – Debye length for electrostatics (default: calculated from 150 mM)</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.add_proteins">
+<span class="sig-name descname"><span class="pre">add_proteins</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">protein_positions</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nt_sigma</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.add_proteins"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.add_proteins" title="Link to this definition">#</a></dt>
+<dd><p>Add proteins to the simulation model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p></li>
+<li><p><strong>protein_positions</strong> – List of positions for all proteins</p></li>
+<li><p><strong>num_CG_sites</strong> – Number of CG sites per protein</p></li>
+<li><p><strong>nt_sigma</strong> – Sigma parameter for nucleic acid interactions</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Group containing all added proteins</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.calculate_total_mass">
+<span class="sig-name descname"><span class="pre">calculate_total_mass</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.calculate_total_mass"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.calculate_total_mass" title="Link to this definition">#</a></dt>
+<dd><p>Calculate total mass of proteins.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Total mass in daltons</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.concentration_to_debye_length">
+<span class="sig-name descname"><span class="pre">concentration_to_debye_length</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">c</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">temperature</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">295</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.concentration_to_debye_length"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.concentration_to_debye_length" title="Link to this definition">#</a></dt>
+<dd><p>Convert salt concentration to Debye length.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>c</strong> – Salt concentration in mM</p></li>
+<li><p><strong>temperature</strong> – Temperature in K</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Debye length in Angstroms</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.from_protein_list">
+<em class="property"><span class="pre">classmethod</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">from_protein_list</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">pdb_list</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pdb_paths</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.from_protein_list"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.from_protein_list" title="Link to this definition">#</a></dt>
+<dd><p>Create a model from a list of protein PDB IDs.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>pdb_list</strong> – List of protein PDB IDs</p></li>
+<li><p><strong>pdb_paths</strong> – Optional dictionary mapping PDB IDs to PSF/PDB file paths</p></li>
+<li><p><strong>**kwargs</strong> – Additional arguments for the ShapeCGModel constructor</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>ShapeCGModel instance</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.generate_random_protein_positions">
+<span class="sig-name descname"><span class="pre">generate_random_protein_positions</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">radius</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seed</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.generate_random_protein_positions"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.generate_random_protein_positions" title="Link to this definition">#</a></dt>
+<dd><p>Generate random positions for proteins within a spherical volume.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p></li>
+<li><p><strong>radius</strong> – Radius of the sphere</p></li>
+<li><p><strong>seed</strong> – Random seed (default: None)</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>List of 3D positions</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.get_protein_types">
+<span class="sig-name descname"><span class="pre">get_protein_types</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.get_protein_types"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.get_protein_types" title="Link to this definition">#</a></dt>
+<dd><p>Get all protein types for the given protein counts.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p></li>
+<li><p><strong>num_CG_sites</strong> – Number of CG sites per protein</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>List of all protein particle types</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.run_from_minimized">
+<span class="sig-name descname"><span class="pre">run_from_minimized</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">radius</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">200</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">salt_concentration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">150</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gpu</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dry_run</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100000000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timestep</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.0002</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">minimization_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.run_from_minimized"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.run_from_minimized" title="Link to this definition">#</a></dt>
+<dd><p>Run a full simulation starting from a minimized configuration.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p></li>
+<li><p><strong>radius</strong> – Confinement radius</p></li>
+<li><p><strong>num_CG_sites</strong> – Number of CG sites per protein</p></li>
+<li><p><strong>salt_concentration</strong> – Salt concentration in mM</p></li>
+<li><p><strong>gpu</strong> – GPU index to use</p></li>
+<li><p><strong>dry_run</strong> – If True, don’t actually run the simulation</p></li>
+<li><p><strong>num_steps</strong> – Number of simulation steps</p></li>
+<li><p><strong>output_period</strong> – Steps between outputs</p></li>
+<li><p><strong>timestep</strong> – Simulation timestep</p></li>
+<li><p><strong>minimization_file</strong> – Path to minimization restart file</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Final simulation state</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.run_minimization">
+<span class="sig-name descname"><span class="pre">run_minimization</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">radius</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">200</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gpu</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timestep</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.0002</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'run_1'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.run_minimization"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.run_minimization" title="Link to this definition">#</a></dt>
+<dd><p>Run a minimization simulation with minimal CG sites.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p></li>
+<li><p><strong>radius</strong> – Confinement radius</p></li>
+<li><p><strong>gpu</strong> – GPU index to use</p></li>
+<li><p><strong>num_steps</strong> – Number of minimization steps</p></li>
+<li><p><strong>output_period</strong> – Steps between outputs</p></li>
+<li><p><strong>timestep</strong> – Simulation timestep</p></li>
+<li><p><strong>directory</strong> – Output directory</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Path to restart file</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGModel.setup_and_run">
+<span class="sig-name descname"><span class="pre">setup_and_run</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">protein_counts</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">radius</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">200</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_CG_sites</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">salt_concentration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">150</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">gpu</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dry_run</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100000000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_period</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timestep</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.0002</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">positions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">restart_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGModel.setup_and_run"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGModel.setup_and_run" title="Link to this definition">#</a></dt>
+<dd><p>Set up and run a simulation with the specified parameters.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>protein_counts</strong> – Dictionary mapping protein names to counts</p></li>
+<li><p><strong>radius</strong> – Confinement radius</p></li>
+<li><p><strong>num_CG_sites</strong> – Number of CG sites per protein</p></li>
+<li><p><strong>salt_concentration</strong> – Salt concentration in mM</p></li>
+<li><p><strong>gpu</strong> – GPU index to use</p></li>
+<li><p><strong>dry_run</strong> – If True, don’t actually run the simulation</p></li>
+<li><p><strong>num_steps</strong> – Number of simulation steps</p></li>
+<li><p><strong>output_period</strong> – Steps between outputs</p></li>
+<li><p><strong>timestep</strong> – Simulation timestep</p></li>
+<li><p><strong>positions</strong> – Optional pre-defined positions for proteins</p></li>
+<li><p><strong>restart_file</strong> – Optional restart file path</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Final simulation state</p>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGNonbonded">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ShapeCGNonbonded</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">debye_length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">10</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">resolution</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">rMin</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">5</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">range_</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">(0,</span> <span class="pre">50)</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGNonbonded"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGNonbonded" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../interaction_potentials/interactions.html#arbdmodel.interactions.AbstractPotential" title="arbdmodel.interactions.AbstractPotential"><code class="xref py py-class docutils literal notranslate"><span class="pre">AbstractPotential</span></code></a></p>
+<p>Nonbonded potential for shape-based coarse grained models.</p>
+<p>The potential includes electrostatic and Lennard-Jones components.</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGNonbonded.filename">
+<span class="sig-name descname"><span class="pre">filename</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">types</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGNonbonded.filename"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGNonbonded.filename" title="Link to this definition">#</a></dt>
+<dd><p>Get filename for potential lookup table.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>types</strong> – Tuple of particle types</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Filename string</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.ShapeCGNonbonded.potential">
+<span class="sig-name descname"><span class="pre">potential</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">r</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">types</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#ShapeCGNonbonded.potential"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.ShapeCGNonbonded.potential" title="Link to this definition">#</a></dt>
+<dd><p>Calculate the potential energy at distance r.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>r</strong> – Array of distances</p></li>
+<li><p><strong>types</strong> – Tuple of (typeA, typeB) particle types</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Array of potential energies</p>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py function">
 <dt class="sig sig-object py" id="arbdmodel.shape_cg.find_shape_based_sites">
 <span class="sig-name descname"><span class="pre">find_shape_based_sites</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fine_positions</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">N_cg</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">learning_schedule</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">seed</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1234</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#find_shape_based_sites"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.find_shape_based_sites" title="Link to this definition">#</a></dt>
-<dd></dd></dl>
+<dd><p>Find optimal placement of coarse-grained sites based on structure shape.</p>
+<p>This function uses a competitive learning algorithm to determine optimal
+placement of coarse-grained sites within a molecular structure, considering
+both geometry and optional weights (like atom masses).</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>fine_positions</strong> – Array of atomic positions, shape (n_atoms, 3)</p></li>
+<li><p><strong>N_cg</strong> – Number of coarse-grained sites to create</p></li>
+<li><p><strong>num_steps</strong> – Number of learning steps (default: 400*N_cg)</p></li>
+<li><p><strong>learning_schedule</strong> – Custom schedule for learning parameters (default: None)</p></li>
+<li><p><strong>weights</strong> – Optional weights for each atom (default: uniform)</p></li>
+<li><p><strong>seed</strong> – Random seed for reproducibility</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Array of positions for coarse-grained sites, shape (N_cg, 3)</p>
+</dd>
+</dl>
+</dd></dl>
 
 <dl class="py function">
 <dt class="sig sig-object py" id="arbdmodel.shape_cg.get_particle_assignments">
 <span class="sig-name descname"><span class="pre">get_particle_assignments</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fine_sites</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">coarse_sites</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">max_distance</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">20</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#get_particle_assignments"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.get_particle_assignments" title="Link to this definition">#</a></dt>
+<dd><p>Assign fine-grained particles to coarse-grained sites.</p>
+<p>This function maps each atom to its closest coarse-grained site,
+using a KD-tree for efficient distance calculations.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>fine_sites</strong> – Array of atomic positions, shape (n_atoms, 3)</p></li>
+<li><p><strong>coarse_sites</strong> – Array of coarse-grained site positions, shape (n_cg, 3)</p></li>
+<li><p><strong>max_distance</strong> – Maximum distance to consider for assignments</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Array of assignments, indicating which CG site each atom belongs to</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.shape_cg.read_files">
+<span class="sig-name descname"><span class="pre">read_files</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">psf</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pdb</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parameter_files</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">system_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'charmm'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/shape_cg.html#read_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.shape_cg.read_files" title="Link to this definition">#</a></dt>
 <dd></dd></dl>
 
 </section>
@@ -422,8 +814,35 @@ of proteins for use in molecular dynamics simulations.</p>
   </div>
   <nav class="bd-toc-nav page-toc">
     <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.calc_atom_sasa"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.calc_atom_sasa()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.generate_protein"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.generate_protein()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_protein"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.get_coarse_protein()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_types"><code class="docutils literal notranslate"><span class="pre">ShapeCGFactory.get_coarse_types()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.add_confinement"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.add_confinement()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.add_protein_nb_interactions"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.add_protein_nb_interactions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.add_proteins"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.add_proteins()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.calculate_total_mass"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.calculate_total_mass()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.concentration_to_debye_length"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.concentration_to_debye_length()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.from_protein_list"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.from_protein_list()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.generate_random_protein_positions"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.generate_random_protein_positions()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.get_protein_types"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.get_protein_types()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.run_from_minimized"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.run_from_minimized()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.run_minimization"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.run_minimization()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGModel.setup_and_run"><code class="docutils literal notranslate"><span class="pre">ShapeCGModel.setup_and_run()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGNonbonded"><code class="docutils literal notranslate"><span class="pre">ShapeCGNonbonded</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGNonbonded.filename"><code class="docutils literal notranslate"><span class="pre">ShapeCGNonbonded.filename()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.ShapeCGNonbonded.potential"><code class="docutils literal notranslate"><span class="pre">ShapeCGNonbonded.potential()</span></code></a></li>
+</ul>
+</li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.find_shape_based_sites"><code class="docutils literal notranslate"><span class="pre">find_shape_based_sites()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.get_particle_assignments"><code class="docutils literal notranslate"><span class="pre">get_particle_assignments()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.shape_cg.read_files"><code class="docutils literal notranslate"><span class="pre">read_files()</span></code></a></li>
 </ul>
   </nav></div>
 
diff --git a/_build/html/api/simulation_engines/engine.html b/_build/html/api/simulation_engines/engine.html
index 44f15561f3a4cde819dc9ec62ac2142b14e9ba73..b963931b11a8ba59cffe1329d112f0f273c932cb 100644
--- a/_build/html/api/simulation_engines/engine.html
+++ b/_build/html/api/simulation_engines/engine.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,44 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.APBSRunner"><code class="docutils literal notranslate"><span class="pre">APBSRunner</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.APBSRunner.run_calculation"><code class="docutils literal notranslate"><span class="pre">APBSRunner.run_calculation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.APBSRunner.write_config"><code class="docutils literal notranslate"><span class="pre">APBSRunner.write_config()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine"><code class="docutils literal notranslate"><span class="pre">ArbdEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine.default_binary"><code class="docutils literal notranslate"><span class="pre">ArbdEngine.default_binary</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine.get_default_conf"><code class="docutils literal notranslate"><span class="pre">ArbdEngine.get_default_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">ArbdEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner"><code class="docutils literal notranslate"><span class="pre">HydroProRunner</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner.parse_output"><code class="docutils literal notranslate"><span class="pre">HydroProRunner.parse_output()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner.run_calculation"><code class="docutils literal notranslate"><span class="pre">HydroProRunner.run_calculation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner.write_config"><code class="docutils literal notranslate"><span class="pre">HydroProRunner.write_config()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine"><code class="docutils literal notranslate"><span class="pre">NamdEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.default_binary"><code class="docutils literal notranslate"><span class="pre">NamdEngine.default_binary</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.get_default_conf"><code class="docutils literal notranslate"><span class="pre">NamdEngine.get_default_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.write_conf"><code class="docutils literal notranslate"><span class="pre">NamdEngine.write_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">NamdEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine"><code class="docutils literal notranslate"><span class="pre">SimEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.default_binary"><code class="docutils literal notranslate"><span class="pre">SimEngine.default_binary</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.get_default_conf"><code class="docutils literal notranslate"><span class="pre">SimEngine.get_default_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.simulate"><code class="docutils literal notranslate"><span class="pre">SimEngine.simulate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">SimEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +391,186 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="engine">
 <h1>engine<a class="headerlink" href="#engine" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.engine</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.engine">
+<dt class="sig sig-object py" id="arbdmodel.engine.APBSRunner">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">APBSRunner</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">binary_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">psize_script</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#APBSRunner"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.APBSRunner" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Interface to APBS for electrostatics calculations</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.APBSRunner.run_calculation">
+<span class="sig-name descname"><span class="pre">run_calculation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">xyz_dims</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'.'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">salt_conc</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.15</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">temperature</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">300</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#APBSRunner.run_calculation"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.APBSRunner.run_calculation" title="Link to this definition">#</a></dt>
+<dd><p>Run APBS calculation.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>structure_name</strong> – Base name of structure files</p></li>
+<li><p><strong>xyz_dims</strong> – [x, y, z] dimensions</p></li>
+<li><p><strong>work_dir</strong> – Working directory</p></li>
+<li><p><strong>salt_conc</strong> – Salt concentration in M</p></li>
+<li><p><strong>temperature</strong> – Temperature in K</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Path to output potential file</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.APBSRunner.write_config">
+<span class="sig-name descname"><span class="pre">write_config</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">xyz_dims</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">salt_conc</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.15</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">temperature</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">300</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buffer</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">50</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">large_system</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'Off'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#APBSRunner.write_config"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.APBSRunner.write_config" title="Link to this definition">#</a></dt>
+<dd><p>Write APBS configuration file.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>structure_name</strong> – Base name of structure files</p></li>
+<li><p><strong>xyz_dims</strong> – [x, y, z] dimensions</p></li>
+<li><p><strong>salt_conc</strong> – Salt concentration in M</p></li>
+<li><p><strong>temperature</strong> – Temperature in K</p></li>
+<li><p><strong>buffer</strong> – Grid buffer size in Å</p></li>
+<li><p><strong>large_system</strong> – ‘On’ or ‘Off’ for large system mode</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.engine.ArbdEngine">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ArbdEngine</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">extra_bd_file_lines</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#ArbdEngine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.ArbdEngine" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.engine.SimEngine" title="arbdmodel.engine.SimEngine"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimEngine</span></code></a></p>
+<p>Interface to ARBD simulation engine</p>
+<dl class="py property">
+<dt class="sig sig-object py" id="arbdmodel.engine.ArbdEngine.default_binary">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">default_binary</span></span><a class="headerlink" href="#arbdmodel.engine.ArbdEngine.default_binary" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.ArbdEngine.get_default_conf">
+<span class="sig-name descname"><span class="pre">get_default_conf</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#ArbdEngine.get_default_conf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.ArbdEngine.get_default_conf" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.ArbdEngine.write_simulation_files">
+<span class="sig-name descname"><span class="pre">write_simulation_files</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#ArbdEngine.write_simulation_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.ArbdEngine.write_simulation_files" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.engine.HydroProRunner">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">HydroProRunner</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mass</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">simconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">structure_name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'hydrocal'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cal_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'shape'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#HydroProRunner"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.HydroProRunner" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Interface to HydroPro for hydrodynamic calculations</p>
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.HydroProRunner.parse_output">
+<span class="sig-name descname"><span class="pre">parse_output</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_file</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#HydroProRunner.parse_output"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.HydroProRunner.parse_output" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.HydroProRunner.run_calculation">
+<span class="sig-name descname"><span class="pre">run_calculation</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">work_dir</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'.'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#HydroProRunner.run_calculation"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.HydroProRunner.run_calculation" title="Link to this definition">#</a></dt>
+<dd><p>Run HydroPro calculation.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>structure_name</strong> – Base name of structure files</p></li>
+<li><p><strong>mass</strong> – Mass in AMU</p></li>
+<li><p><strong>work_dir</strong> – Working directory for calculation</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p><ul class="simple">
+<li><p>translation_damping: [Dx, Dy, Dz]</p></li>
+<li><p>rotation_damping: [Rx, Ry, Rz]</p></li>
+</ul>
+</p>
+</dd>
+<dt class="field-odd">Return type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>Dictionary containing</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.HydroProRunner.write_config">
+<span class="sig-name descname"><span class="pre">write_config</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'hydropro.dat'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">aer</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2.9</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nsig</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">6</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sig_min</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">sig_max</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">specific_volume</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0.702</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#HydroProRunner.write_config"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.HydroProRunner.write_config" title="Link to this definition">#</a></dt>
+<dd><p>Write HydroPro configuration file with explicit parameters.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>output_path</strong> – Path to write config file</p></li>
+<li><p><strong>cal_type</strong> – shape(0) or mesh(1)</p></li>
+<li><p><strong>structure_name</strong> – Name of the molecule/structure</p></li>
+<li><p><strong>mass</strong> – Molecular weight in Daltons (amu)</p></li>
+<li><p><strong>aer</strong> – Atomic Element Radius in Angstroms</p></li>
+<li><p><strong>nsig</strong> – Number of values of the shell thickness</p></li>
+<li><p><strong>sig_min</strong> – Minimum radius of beads in the shell (Angstroms)</p></li>
+<li><p><strong>sig_max</strong> – Maximum radius of beads in the shell (Angstroms)</p></li>
+<li><p><strong>specific_volume</strong> – Partial specific volume in cm³/g</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.engine.NamdEngine">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">NamdEngine</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#NamdEngine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.NamdEngine" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#arbdmodel.engine.SimEngine" title="arbdmodel.engine.SimEngine"><code class="xref py py-class docutils literal notranslate"><span class="pre">SimEngine</span></code></a></p>
+<p>Partial interface to NAMD simulation engine</p>
+<dl class="py property">
+<dt class="sig sig-object py" id="arbdmodel.engine.NamdEngine.default_binary">
+<em class="property"><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">default_binary</span></span><a class="headerlink" href="#arbdmodel.engine.NamdEngine.default_binary" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.NamdEngine.get_default_conf">
+<span class="sig-name descname"><span class="pre">get_default_conf</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#NamdEngine.get_default_conf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.NamdEngine.get_default_conf" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.NamdEngine.write_conf">
+<span class="sig-name descname"><span class="pre">write_conf</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">minimization_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">4800</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_steps</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1000000.0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'output'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">update_dimensions</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">extrabonds</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#NamdEngine.write_conf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.NamdEngine.write_conf" title="Link to this definition">#</a></dt>
+<dd><p>Write a NAMD configuration file (developed for the mrdna package)</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.NamdEngine.write_simulation_files">
+<span class="sig-name descname"><span class="pre">write_simulation_files</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">write_pqr</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">copy_ff_from</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">PosixPath('/Users/pinyili/Documents/research/arbdmodel-simple/arbdmodel/resources/charmm36.nbfix')</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#NamdEngine.write_simulation_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.NamdEngine.write_simulation_files" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="py class">
+<dt class="sig sig-object py" id="arbdmodel.engine.SimEngine">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">SimEngine</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#SimEngine"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.SimEngine" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="hxr-hoverxref hxr-tooltip reference external" href="https://docs.python.org/3/library/functions.html#object" title="(in Python v3.13)"><code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></a></p>
+<p>Abstract class for running a simulation of a model</p>
+<dl class="py property">
+<dt class="sig sig-object py" id="arbdmodel.engine.SimEngine.default_binary">
+<em class="property"><span class="pre">abstract</span><span class="w"> </span><span class="pre">property</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">default_binary</span></span><a class="headerlink" href="#arbdmodel.engine.SimEngine.default_binary" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.SimEngine.get_default_conf">
+<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">get_default_conf</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#SimEngine.get_default_conf"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.SimEngine.get_default_conf" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.SimEngine.simulate">
+<span class="sig-name descname"><span class="pre">simulate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'output'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'.'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">log_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">binary</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_procs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dry_run</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">configuration</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">replicas</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#SimEngine.simulate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.SimEngine.simulate" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.engine.SimEngine.write_simulation_files">
+<em class="property"><span class="pre">abstract</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">write_simulation_files</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">model</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/engine.html#SimEngine.write_simulation_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.engine.SimEngine.write_simulation_files" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +610,51 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.APBSRunner"><code class="docutils literal notranslate"><span class="pre">APBSRunner</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.APBSRunner.run_calculation"><code class="docutils literal notranslate"><span class="pre">APBSRunner.run_calculation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.APBSRunner.write_config"><code class="docutils literal notranslate"><span class="pre">APBSRunner.write_config()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine"><code class="docutils literal notranslate"><span class="pre">ArbdEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine.default_binary"><code class="docutils literal notranslate"><span class="pre">ArbdEngine.default_binary</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine.get_default_conf"><code class="docutils literal notranslate"><span class="pre">ArbdEngine.get_default_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.ArbdEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">ArbdEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner"><code class="docutils literal notranslate"><span class="pre">HydroProRunner</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner.parse_output"><code class="docutils literal notranslate"><span class="pre">HydroProRunner.parse_output()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner.run_calculation"><code class="docutils literal notranslate"><span class="pre">HydroProRunner.run_calculation()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.HydroProRunner.write_config"><code class="docutils literal notranslate"><span class="pre">HydroProRunner.write_config()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine"><code class="docutils literal notranslate"><span class="pre">NamdEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.default_binary"><code class="docutils literal notranslate"><span class="pre">NamdEngine.default_binary</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.get_default_conf"><code class="docutils literal notranslate"><span class="pre">NamdEngine.get_default_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.write_conf"><code class="docutils literal notranslate"><span class="pre">NamdEngine.write_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.NamdEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">NamdEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine"><code class="docutils literal notranslate"><span class="pre">SimEngine</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.default_binary"><code class="docutils literal notranslate"><span class="pre">SimEngine.default_binary</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.get_default_conf"><code class="docutils literal notranslate"><span class="pre">SimEngine.get_default_conf()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.simulate"><code class="docutils literal notranslate"><span class="pre">SimEngine.simulate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.engine.SimEngine.write_simulation_files"><code class="docutils literal notranslate"><span class="pre">SimEngine.write_simulation_files()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/simulation_engines/index.html b/_build/html/api/simulation_engines/index.html
index 550c28923e8b14d77c07b9c1f5decccc78cdd46b..2dec772f8a93eed9e1686cd7f157d8db0dcdff31 100644
--- a/_build/html/api/simulation_engines/index.html
+++ b/_build/html/api/simulation_engines/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/simulation_engines/parmed_bd.html b/_build/html/api/simulation_engines/parmed_bd.html
index 055e44c41ba80f4d945bd5aabada302f17bbfeec..c99edfd8f447345fac7e5e3226c42f3f934362ee 100644
--- a/_build/html/api/simulation_engines/parmed_bd.html
+++ b/_build/html/api/simulation_engines/parmed_bd.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,25 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd"><code class="docutils literal notranslate"><span class="pre">ParmedArbd</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.parmed_structure"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.parmed_structure</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.atom_types"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.atom_types</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.atoms_map"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.atoms_map</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.convert_sod_to_mg()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.create_dual_topology()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.create_dual_topology_model()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.load_structure"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.load_structure()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.simulate"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.simulate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.write_restraint_files"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.write_restraint_files()</span></code></a></li>
+</ul>
+</li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,6 +372,145 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="parmed-bd">
 <h1>parmed_bd<a class="headerlink" href="#parmed-bd" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.parmed_bd</span></code>.</p>
+<dl class="py class" id="module-arbdmodel.parmed_bd">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd">
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">ParmedArbd</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parmed_structure</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">psf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pdb</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parameter_files</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">system_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'charmm'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">integrator</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'MD'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cutoff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">12</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd" title="Link to this definition">#</a></dt>
+<dd><p>Bases: <a class="reference internal" href="../core/model.html#arbdmodel.model.ArbdModel" title="arbdmodel.model.ArbdModel"><code class="xref py py-class docutils literal notranslate"><span class="pre">ArbdModel</span></code></a></p>
+<p>Class for converting ParmEd structures to ARBD models for simulation.</p>
+<p>This class facilitates the conversion of molecular structures loaded with ParmEd
+into ARBD simulation models, preserving bonded and non-bonded interactions.
+It also supports creating dual topology models for free energy calculations.</p>
+<dl class="py attribute">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.parmed_structure">
+<span class="sig-name descname"><span class="pre">parmed_structure</span></span><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.parmed_structure" title="Link to this definition">#</a></dt>
+<dd><p>The original ParmEd structure</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.atom_types">
+<span class="sig-name descname"><span class="pre">atom_types</span></span><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.atom_types" title="Link to this definition">#</a></dt>
+<dd><p>Dictionary mapping atom type names to ParticleType objects</p>
+</dd></dl>
+
+<dl class="py attribute">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.atoms_map">
+<span class="sig-name descname"><span class="pre">atoms_map</span></span><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.atoms_map" title="Link to this definition">#</a></dt>
+<dd><p>Mapping from ParmEd atoms to ARBD atoms</p>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg">
+<em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">convert_sod_to_mg</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">structure</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd.convert_sod_to_mg"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg" title="Link to this definition">#</a></dt>
+<dd><p>Convert sodium ions to magnesium ions in a structure.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><p><strong>structure</strong> – ParmEd structure to modify</p>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Modified structure</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.create_dual_topology">
+<em class="property"><span class="pre">static</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">create_dual_topology</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">p1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">u1</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">u2</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd.create_dual_topology"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology" title="Link to this definition">#</a></dt>
+<dd><p>Create a dual topology structure from two ParmEd structures.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>p1</strong> – First ParmEd structure</p></li>
+<li><p><strong>p2</strong> – Second ParmEd structure</p></li>
+<li><p><strong>u1</strong> – Optional MDAnalysis universe for p1</p></li>
+<li><p><strong>u2</strong> – Optional MDAnalysis universe for p2</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Tuple of (combined structure, restraint pairs, base pair bonds)</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model">
+<em class="property"><span class="pre">classmethod</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">create_dual_topology_model</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">p1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">p2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">u1</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">u2</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd.create_dual_topology_model"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model" title="Link to this definition">#</a></dt>
+<dd><p>Create a dual topology ARBD model from two ParmEd structures.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>p1</strong> – First ParmEd structure</p></li>
+<li><p><strong>p2</strong> – Second ParmEd structure</p></li>
+<li><p><strong>u1</strong> – Optional MDAnalysis universe for p1</p></li>
+<li><p><strong>u2</strong> – Optional MDAnalysis universe for p2</p></li>
+<li><p><strong>**kwargs</strong> – Additional arguments for ParmedArbd</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>ParmedArbd model with dual topology</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.load_structure">
+<span class="sig-name descname"><span class="pre">load_structure</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parmed_structure</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">psf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pdb</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">parameter_files</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">system_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'charmm'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd.load_structure"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.load_structure" title="Link to this definition">#</a></dt>
+<dd><p>Load a ParmEd structure or read from PSF/PDB files.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>parmed_structure</strong> – Existing ParmEd structure object (optional)</p></li>
+<li><p><strong>psf</strong> – Path to PSF file (optional if parmed_structure is provided)</p></li>
+<li><p><strong>pdb</strong> – Path to PDB file (optional if parmed_structure is provided)</p></li>
+<li><p><strong>parameter_files</strong> – List of parameter files (optional)</p></li>
+<li><p><strong>system_type</strong> – Type of system (‘charmm’, etc.)</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>self for method chaining</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.simulate">
+<span class="sig-name descname"><span class="pre">simulate</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">output_name</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">output_directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'output'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">log_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">directory</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'.'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">binary</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_procs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dry_run</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">conf_params</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd.simulate"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.simulate" title="Link to this definition">#</a></dt>
+<dd><p>Run simulation with the ARBD model.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>output_name</strong> – Base name for output files</p></li>
+<li><p><strong>output_directory</strong> – Directory for output files</p></li>
+<li><p><strong>log_file</strong> – File for logging</p></li>
+<li><p><strong>directory</strong> – Working directory</p></li>
+<li><p><strong>binary</strong> – Path to simulation binary</p></li>
+<li><p><strong>num_procs</strong> – Number of processors to use</p></li>
+<li><p><strong>dry_run</strong> – If True, don’t actually run</p></li>
+<li><p><strong>**conf_params</strong> – Additional configuration parameters</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>Result of the simulation</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py method">
+<dt class="sig sig-object py" id="arbdmodel.parmed_bd.ParmedArbd.write_restraint_files">
+<span class="sig-name descname"><span class="pre">write_restraint_files</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">fep_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'dual.fep.exb'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">min_fep_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'dual.min.fep.exb'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bp_file</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'dual.bp.exb'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/parmed_bd.html#ParmedArbd.write_restraint_files"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.parmed_bd.ParmedArbd.write_restraint_files" title="Link to this definition">#</a></dt>
+<dd><p>Write restraint files for dual topology simulations.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>fep_file</strong> – Output file for FEP restraints</p></li>
+<li><p><strong>min_fep_file</strong> – Output file for minimization FEP restraints</p></li>
+<li><p><strong>bp_file</strong> – Output file for base pair restraints</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
+
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -390,6 +550,32 @@ document.write(`
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd"><code class="docutils literal notranslate"><span class="pre">ParmedArbd</span></code></a><ul class="nav section-nav flex-column">
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.parmed_structure"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.parmed_structure</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.atom_types"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.atom_types</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.atoms_map"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.atoms_map</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.convert_sod_to_mg()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.create_dual_topology()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.create_dual_topology_model()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.load_structure"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.load_structure()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.simulate"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.simulate()</span></code></a></li>
+<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.parmed_bd.ParmedArbd.write_restraint_files"><code class="docutils literal notranslate"><span class="pre">ParmedArbd.write_restraint_files()</span></code></a></li>
+</ul>
+</li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/utilities/binary_manager.html b/_build/html/api/utilities/binary_manager.html
index 494db2d1d7217f9889750a32a8ac015ae0792356..cdf5ceaef2b137d1fba3e181ec878f861559b782 100644
--- a/_build/html/api/utilities/binary_manager.html
+++ b/_build/html/api/utilities/binary_manager.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,14 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.binary_manager.initialize_binary_paths"><code class="docutils literal notranslate"><span class="pre">initialize_binary_paths()</span></code></a></li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -352,6 +362,15 @@ document.write(`
 <h1>binary_manager<a class="headerlink" href="#binary-manager" title="Link to this heading">#</a></h1>
 <p>Binary path management module for simulation engines and processors.
 This module provides a singleton object to manage paths to external binaries.</p>
+<p id="module-arbdmodel.binary_manager">Binary path management module for simulation engines and processors.
+This module provides a singleton object to manage paths to external binaries.</p>
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.binary_manager.initialize_binary_paths">
+<span class="sig-name descname"><span class="pre">initialize_binary_paths</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/binary_manager.html#initialize_binary_paths"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.binary_manager.initialize_binary_paths" title="Link to this definition">#</a></dt>
+<dd><p>Initialize binary paths from environment variables.
+This function should be called during package initialization.</p>
+</dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -391,6 +410,21 @@ This module provides a singleton object to manage paths to external binaries.</p
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.binary_manager.initialize_binary_paths"><code class="docutils literal notranslate"><span class="pre">initialize_binary_paths()</span></code></a></li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/utilities/coords.html b/_build/html/api/utilities/coords.html
index 4dbcefa903896e1b490235a1784205de325e3888..1e2da889a84bd5f1f6a30235ba76c176297186e4 100644
--- a/_build/html/api/utilities/coords.html
+++ b/_build/html/api/utilities/coords.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -346,6 +346,9 @@ document.write(`
             </div>
             <nav aria-label="Page">
                 <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.Generate_coordinates"><code class="docutils literal notranslate"><span class="pre">Generate_coordinates()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.Generate_spanning_vectors"><code class="docutils literal notranslate"><span class="pre">Generate_spanning_vectors()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.calculate_dimensions_from_cell_vectors"><code class="docutils literal notranslate"><span class="pre">calculate_dimensions_from_cell_vectors()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.minimizeRmsd"><code class="docutils literal notranslate"><span class="pre">minimizeRmsd()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.quaternion_exp"><code class="docutils literal notranslate"><span class="pre">quaternion_exp()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.quaternion_from_matrix"><code class="docutils literal notranslate"><span class="pre">quaternion_from_matrix()</span></code></a></li>
@@ -374,6 +377,37 @@ document.write(`
 <h1>coords<a class="headerlink" href="#coords" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.coords</span></code>.</p>
 <dl class="py function" id="module-arbdmodel.coords">
+<dt class="sig sig-object py" id="arbdmodel.coords.Generate_coordinates">
+<span class="sig-name descname"><span class="pre">Generate_coordinates</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bv1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bv2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bv3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">n3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">num_copy</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">origin</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">replica_index</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/coords.html#Generate_coordinates"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.coords.Generate_coordinates" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.coords.Generate_spanning_vectors">
+<span class="sig-name descname"><span class="pre">Generate_spanning_vectors</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">bv1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bv2</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">bv3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dimensions</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buff</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">5</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/coords.html#Generate_spanning_vectors"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.coords.Generate_spanning_vectors" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.coords.calculate_dimensions_from_cell_vectors">
+<span class="sig-name descname"><span class="pre">calculate_dimensions_from_cell_vectors</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cell_vectors</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cell_origin</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">buffer_factor</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1.2</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/coords.html#calculate_dimensions_from_cell_vectors"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.coords.calculate_dimensions_from_cell_vectors" title="Link to this definition">#</a></dt>
+<dd><p>Calculate simulation box dimensions from cell basis vectors with buffer.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters<span class="colon">:</span></dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>cell_vectors</strong> – List of 3 cell basis vectors [[x1,y1,z1], [x2,y2,z2], [x3,y3,z3]]</p></li>
+<li><p><strong>cell_origin</strong> – Cell origin coordinates [x,y,z], defaults to [0,0,0]</p></li>
+<li><p><strong>buffer_factor</strong> – Factor to scale the dimensions for additional buffer space</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns<span class="colon">:</span></dt>
+<dd class="field-even"><p>3D box dimensions as a tuple (x_dim, y_dim, z_dim)</p>
+</dd>
+<dt class="field-odd">Return type<span class="colon">:</span></dt>
+<dd class="field-odd"><p>dimensions</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="py function">
 <dt class="sig sig-object py" id="arbdmodel.coords.minimizeRmsd">
 <span class="sig-name descname"><span class="pre">minimizeRmsd</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">coordsB</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">coordsA</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">weights</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/coords.html#minimizeRmsd"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.coords.minimizeRmsd" title="Link to this definition">#</a></dt>
 <dd></dd></dl>
@@ -486,6 +520,9 @@ document.write(`
   </div>
   <nav class="bd-toc-nav page-toc">
     <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.Generate_coordinates"><code class="docutils literal notranslate"><span class="pre">Generate_coordinates()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.Generate_spanning_vectors"><code class="docutils literal notranslate"><span class="pre">Generate_spanning_vectors()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.calculate_dimensions_from_cell_vectors"><code class="docutils literal notranslate"><span class="pre">calculate_dimensions_from_cell_vectors()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.minimizeRmsd"><code class="docutils literal notranslate"><span class="pre">minimizeRmsd()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.quaternion_exp"><code class="docutils literal notranslate"><span class="pre">quaternion_exp()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.coords.quaternion_from_matrix"><code class="docutils literal notranslate"><span class="pre">quaternion_from_matrix()</span></code></a></li>
diff --git a/_build/html/api/utilities/grid.html b/_build/html/api/utilities/grid.html
index e8780d4a7736a8b83625c299e94cb0106d5b5b22..6916b5a51aaf50cbef038be38d22438a0f5bada1 100644
--- a/_build/html/api/utilities/grid.html
+++ b/_build/html/api/utilities/grid.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -346,6 +346,8 @@ document.write(`
             </div>
             <nav aria-label="Page">
                 <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.Bound_grid"><code class="docutils literal notranslate"><span class="pre">Bound_grid()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.Create_null"><code class="docutils literal notranslate"><span class="pre">Create_null()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.TestAverageGrids"><code class="docutils literal notranslate"><span class="pre">TestAverageGrids</span></code></a><ul class="nav section-nav flex-column">
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.TestAverageGrids.test_average_grids"><code class="docutils literal notranslate"><span class="pre">TestAverageGrids.test_average_grids()</span></code></a></li>
 </ul>
@@ -359,11 +361,13 @@ document.write(`
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.gaussian_kernel"><code class="docutils literal notranslate"><span class="pre">gaussian_kernel()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.get_slice_enclosing_smaller_grid"><code class="docutils literal notranslate"><span class="pre">get_slice_enclosing_smaller_grid()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.isotropic_kernel"><code class="docutils literal notranslate"><span class="pre">isotropic_kernel()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.loadGrid"><code class="docutils literal notranslate"><span class="pre">loadGrid()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.neighborhood_average"><code class="docutils literal notranslate"><span class="pre">neighborhood_average()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.replace_false_with_distance"><code class="docutils literal notranslate"><span class="pre">replace_false_with_distance()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.slab_potential_z"><code class="docutils literal notranslate"><span class="pre">slab_potential_z()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.spherical_confinement"><code class="docutils literal notranslate"><span class="pre">spherical_confinement()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.writeDx"><code class="docutils literal notranslate"><span class="pre">writeDx()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.write_confine_dx"><code class="docutils literal notranslate"><span class="pre">write_confine_dx()</span></code></a></li>
 </ul>
             </nav>
         </div>
@@ -378,7 +382,19 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="grid">
 <h1>grid<a class="headerlink" href="#grid" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.grid</span></code>.</p>
-<dl class="py class" id="module-arbdmodel.grid">
+<dl class="py function" id="module-arbdmodel.grid">
+<dt class="sig sig-object py" id="arbdmodel.grid.Bound_grid">
+<span class="sig-name descname"><span class="pre">Bound_grid</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">inFile</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">outFile</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">lowerBound</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">upperBound</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#Bound_grid"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.Bound_grid" title="Link to this definition">#</a></dt>
+<dd><p>Apply bounds to grid values</p>
+</dd></dl>
+
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.grid.Create_null">
+<span class="sig-name descname"><span class="pre">Create_null</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">grid_path</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'null.dx'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#Create_null"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.Create_null" title="Link to this definition">#</a></dt>
+<dd><p>Create null potential grid</p>
+</dd></dl>
+
+<dl class="py class">
 <dt class="sig sig-object py" id="arbdmodel.grid.TestAverageGrids">
 <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">TestAverageGrids</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">methodName</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'runTest'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#TestAverageGrids"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.TestAverageGrids" title="Link to this definition">#</a></dt>
 <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">TestCase</span></code></p>
@@ -552,6 +568,12 @@ It should accept a scalar or an array-like object and return a scalar or an arra
 </div>
 </dd></dl>
 
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.grid.loadGrid">
+<span class="sig-name descname"><span class="pre">loadGrid</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">file</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#loadGrid"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.loadGrid" title="Link to this definition">#</a></dt>
+<dd><p>Load grid data from DX file</p>
+</dd></dl>
+
 <dl class="py function">
 <dt class="sig sig-object py" id="arbdmodel.grid.neighborhood_average">
 <span class="sig-name descname"><span class="pre">neighborhood_average</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">grid</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">neighborhood</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fill_value</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'mirror'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#neighborhood_average"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.neighborhood_average" title="Link to this definition">#</a></dt>
@@ -604,6 +626,11 @@ It should accept a scalar or an array-like object and return a scalar or an arra
 <span class="sig-name descname"><span class="pre">writeDx</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">outfile</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">data</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">origin</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">delta</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fmt</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'%.12f'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#writeDx"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.writeDx" title="Link to this definition">#</a></dt>
 <dd></dd></dl>
 
+<dl class="py function">
+<dt class="sig sig-object py" id="arbdmodel.grid.write_confine_dx">
+<span class="sig-name descname"><span class="pre">write_confine_dx</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">radius</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">100</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/grid.html#write_confine_dx"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.grid.write_confine_dx" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -652,6 +679,8 @@ It should accept a scalar or an array-like object and return a scalar or an arra
   </div>
   <nav class="bd-toc-nav page-toc">
     <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.Bound_grid"><code class="docutils literal notranslate"><span class="pre">Bound_grid()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.Create_null"><code class="docutils literal notranslate"><span class="pre">Create_null()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.TestAverageGrids"><code class="docutils literal notranslate"><span class="pre">TestAverageGrids</span></code></a><ul class="nav section-nav flex-column">
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.TestAverageGrids.test_average_grids"><code class="docutils literal notranslate"><span class="pre">TestAverageGrids.test_average_grids()</span></code></a></li>
 </ul>
@@ -665,11 +694,13 @@ It should accept a scalar or an array-like object and return a scalar or an arra
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.gaussian_kernel"><code class="docutils literal notranslate"><span class="pre">gaussian_kernel()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.get_slice_enclosing_smaller_grid"><code class="docutils literal notranslate"><span class="pre">get_slice_enclosing_smaller_grid()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.isotropic_kernel"><code class="docutils literal notranslate"><span class="pre">isotropic_kernel()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.loadGrid"><code class="docutils literal notranslate"><span class="pre">loadGrid()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.neighborhood_average"><code class="docutils literal notranslate"><span class="pre">neighborhood_average()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.replace_false_with_distance"><code class="docutils literal notranslate"><span class="pre">replace_false_with_distance()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.slab_potential_z"><code class="docutils literal notranslate"><span class="pre">slab_potential_z()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.spherical_confinement"><code class="docutils literal notranslate"><span class="pre">spherical_confinement()</span></code></a></li>
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.writeDx"><code class="docutils literal notranslate"><span class="pre">writeDx()</span></code></a></li>
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.grid.write_confine_dx"><code class="docutils literal notranslate"><span class="pre">write_confine_dx()</span></code></a></li>
 </ul>
   </nav></div>
 
diff --git a/_build/html/api/utilities/index.html b/_build/html/api/utilities/index.html
index 7690f4ecec8585895f2f9317710f6ff41fd76545..4ce4aa5d8948d249a1cfeb912f46af5b89c85dd4 100644
--- a/_build/html/api/utilities/index.html
+++ b/_build/html/api/utilities/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/api/utilities/logger.html b/_build/html/api/utilities/logger.html
index 96466df61ded6b5f350c2c0bc9e9ecbd26fb2ff3..b2019818b85ebaa370635bf6ed2d0b831a843568 100644
--- a/_build/html/api/utilities/logger.html
+++ b/_build/html/api/utilities/logger.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -323,7 +323,9 @@ document.write(`
   </button>
 `);
 </script>
-
+<button class="sidebar-toggle secondary-toggle btn btn-sm" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+    <span class="fa-solid fa-list"></span>
+</button>
 </div></div>
       
     </div>
@@ -339,6 +341,14 @@ document.write(`
     <div id="print-main-content">
         <div id="jb-print-toc">
             
+            <div>
+                <h2> Contents </h2>
+            </div>
+            <nav aria-label="Page">
+                <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.logger.get_resource_path"><code class="docutils literal notranslate"><span class="pre">get_resource_path()</span></code></a></li>
+</ul>
+            </nav>
         </div>
     </div>
 </div>
@@ -351,18 +361,11 @@ document.write(`
   <section class="tex2jax_ignore mathjax_ignore" id="logger">
 <h1>logger<a class="headerlink" href="#logger" title="Link to this heading">#</a></h1>
 <p>Module documentation for <code class="docutils literal notranslate"><span class="pre">arbdmodel.logger</span></code>.</p>
-<p id="module-arbdmodel.logger">Instances of the Logger class represent a single logging channel. A
-“logging channel” indicates an area of an application. Exactly how an
-“area” is defined is up to the application developer. Since an
-application can have any number of areas, logging channels are identified
-by a unique string. Application areas can be nested (e.g. an area
-of “input processing” might include sub-areas “read CSV files”, “read
-XLS files” and “read Gnumeric files”). To cater for this natural nesting,
-channel names are organized into a namespace hierarchy where levels are
-separated by periods, much like the Java or Python package namespace. So
-in the instance given above, channel names might be “input” for the upper
-level, and “input.csv”, “input.xls” and “input.gnu” for the sub-levels.
-There is no arbitrary limit to the depth of nesting.</p>
+<dl class="py function" id="module-arbdmodel.logger">
+<dt class="sig sig-object py" id="arbdmodel.logger.get_resource_path">
+<span class="sig-name descname"><span class="pre">get_resource_path</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">relative_path</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/arbdmodel/logger.html#get_resource_path"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#arbdmodel.logger.get_resource_path" title="Link to this definition">#</a></dt>
+<dd></dd></dl>
+
 </section>
 
     <script type="text/x-thebe-config">
@@ -402,6 +405,21 @@ There is no arbitrary limit to the depth of nesting.</p>
             
             
               
+                <div class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
+
+
+  <div class="sidebar-secondary-item">
+  <div class="page-toc tocsection onthispage">
+    <i class="fa-solid fa-list"></i> Contents
+  </div>
+  <nav class="bd-toc-nav page-toc">
+    <ul class="visible nav section-nav flex-column">
+<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arbdmodel.logger.get_resource_path"><code class="docutils literal notranslate"><span class="pre">get_resource_path()</span></code></a></li>
+</ul>
+  </nav></div>
+
+</div></div>
+              
             
           </div>
           <footer class="bd-footer-content">
diff --git a/_build/html/api/utilities/version.html b/_build/html/api/utilities/version.html
index 63b2cdfefc749166d64c1dfc04f91aa4ffd9e879..4ffe2535c2cd64764a3bda79974f171e5bea75d5 100644
--- a/_build/html/api/utilities/version.html
+++ b/_build/html/api/utilities/version.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../../_static/copybutton.js?v=f281be69"></script>
     <script src="../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../../_static/tabs.js?v=3ee01567"></script>
-    <script src="../../_static/js/hoverxref.js"></script>
-    <script src="../../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../../_static/js/micromodal.min.js"></script>
+    <script src="../../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/genindex.html b/_build/html/genindex.html
index 7da555ba2814bac5428d56fe564a41564223f9a6..de0f0c4473dd11545e1e9c02370e3894d8dd9632 100644
--- a/_build/html/genindex.html
+++ b/_build/html/genindex.html
@@ -31,19 +31,19 @@
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -60,9 +60,9 @@
     <script src="_static/copybutton.js?v=f281be69"></script>
     <script src="_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="_static/tabs.js?v=3ee01567"></script>
-    <script src="_static/js/hoverxref.js"></script>
-    <script src="_static/js/tooltipster.bundle.min.js"></script>
-    <script src="_static/js/micromodal.min.js"></script>
+    <script src="_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -334,19 +334,102 @@ document.write(`
 </li>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.AbstractPotential">AbstractPotential (class in arbdmodel.interactions)</a>
 </li>
-      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.add_grid_potential">add_grid_potential() (PolymerGroup method)</a>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.add">add() (ArbdModel method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add">(Parent method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_angle">add_angle() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_bond">add_bond() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_bond_angle">add_bond_angle() (Parent method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.add_confinement">add_confinement() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object">add_diffusible_object() (StructureRigidBodyModel method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_dihedral">add_dihedral() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_exclusion">add_exclusion() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.ParticleType.add_grid_potential">add_grid_potential() (ParticleType method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.PointParticle.add_grid_potential">(PointParticle method)</a>
+</li>
+        <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.add_grid_potential">(PolymerGroup method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.add_group_site">add_group_site() (ArbdModel method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_improper">add_improper() (Parent method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.add_location">add_location() (PolymerSection method)</a>
 </li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.add_nonbonded_interaction">add_nonbonded_interaction() (ArbdModel method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_product_potential">add_product_potential() (Parent method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.add_protein_nb_interactions">add_protein_nb_interactions() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.add_proteins">add_proteins() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.GroupSite.add_restraint">add_restraint() (GroupSite method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.PointParticle.add_restraint">(PointParticle method)</a>
+</li>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.RigidBody.add_restraint">(RigidBody method)</a>
+</li>
+      </ul></li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.add_smaller_grid">add_smaller_grid() (in module arbdmodel.grid)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object">add_static_object() (StructureRigidBodyModel method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.add_vector_angle">add_vector_angle() (Parent method)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.align_structure">align_structure() (StructureProcessor method)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AngleDof">AngleDof (class in arbdmodel.ibi)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.APBSRunner">APBSRunner (class in arbdmodel.engine)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing">apply_gaussian_smoothing() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Transformable.applyOrientation">applyOrientation() (Transformable method)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine">ArbdEngine (class in arbdmodel.engine)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel">ArbdModel (class in arbdmodel.model)</a>
 </li>
       <li>
+    arbdmodel.binary_manager
+
+      <ul>
+        <li><a href="api/utilities/binary_manager.html#module-arbdmodel.binary_manager">module</a>
+</li>
+      </ul></li>
+      <li>
     arbdmodel.coords
 
       <ul>
         <li><a href="api/utilities/coords.html#module-arbdmodel.coords">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.core_objects
+
+      <ul>
+        <li><a href="api/core/core_objects.html#module-arbdmodel.core_objects">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.engine
+
+      <ul>
+        <li><a href="api/simulation_engines/engine.html#module-arbdmodel.engine">module</a>
 </li>
       </ul></li>
       <li>
@@ -363,6 +446,8 @@ document.write(`
         <li><a href="api/utilities/grid.html#module-arbdmodel.grid">module</a>
 </li>
       </ul></li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li>
     arbdmodel.hps_polymer_model
 
@@ -384,8 +469,6 @@ document.write(`
         <li><a href="api/interaction_potentials/interactions.html#module-arbdmodel.interactions">module</a>
 </li>
       </ul></li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li>
     arbdmodel.kh_polymer_model
 
@@ -398,6 +481,34 @@ document.write(`
 
       <ul>
         <li><a href="api/utilities/logger.html#module-arbdmodel.logger">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.mesh_process_surface
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#module-arbdmodel.mesh_process_surface">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.mesh_process_volume
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_volume.html#module-arbdmodel.mesh_process_volume">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.mesh_rigidbody
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_rigidbody.html#module-arbdmodel.mesh_rigidbody">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.model
+
+      <ul>
+        <li><a href="api/core/model.html#module-arbdmodel.model">module</a>
 </li>
       </ul></li>
       <li>
@@ -412,6 +523,13 @@ document.write(`
 
       <ul>
         <li><a href="api/polymer_modeling/onck_polymer_model.html#module-arbdmodel.onck_polymer_model">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.parmed_bd
+
+      <ul>
+        <li><a href="api/simulation_engines/parmed_bd.html#module-arbdmodel.parmed_bd">module</a>
 </li>
       </ul></li>
       <li>
@@ -419,6 +537,13 @@ document.write(`
 
       <ul>
         <li><a href="api/polymer_modeling/polymer.html#module-arbdmodel.polymer">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.sali_polymer_model
+
+      <ul>
+        <li><a href="api/polymer_modeling/sali_polymer_model.html#module-arbdmodel.sali_polymer_model">module</a>
 </li>
       </ul></li>
       <li>
@@ -426,6 +551,20 @@ document.write(`
 
       <ul>
         <li><a href="api/shape-based_models/shape_cg.html#module-arbdmodel.shape_cg">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.sim_config
+
+      <ul>
+        <li><a href="api/core/sim_config.html#module-arbdmodel.sim_config">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.simplearbd
+
+      <ul>
+        <li><a href="api/rigidbody_models/simplearbd.html#module-arbdmodel.simplearbd">module</a>
 </li>
       </ul></li>
       <li>
@@ -433,6 +572,20 @@ document.write(`
 
       <ul>
         <li><a href="api/polymer_modeling/ssdna_two_bead.html#module-arbdmodel.ssdna_two_bead">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.structure_from_pdb
+
+      <ul>
+        <li><a href="api/rigidbody_models/structure_from_pdb.html#module-arbdmodel.structure_from_pdb">module</a>
+</li>
+      </ul></li>
+      <li>
+    arbdmodel.structure_rigidbody
+
+      <ul>
+        <li><a href="api/rigidbody_models/structure_rigidbody.html#module-arbdmodel.structure_rigidbody">module</a>
 </li>
       </ul></li>
       <li>
@@ -442,6 +595,14 @@ document.write(`
         <li><a href="api/utilities/version.html#module-arbdmodel.version">module</a>
 </li>
       </ul></li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom">assign_IBI_degrees_of_freedom() (ArbdModel method)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.atom_types">atom_types (ParmedArbd attribute)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.atoms_map">atoms_map (ParmedArbd attribute)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.RigidBodyType.attach_particle">attach_particle() (RigidBodyType method)</a>
+</li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.average_grids">average_grids() (in module arbdmodel.grid)</a>
 </li>
   </ul></td>
@@ -452,11 +613,15 @@ document.write(`
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/polymer_modeling/ssdna_two_bead.html#arbdmodel.ssdna_two_bead.DnaStrandBeads.b">b (DnaStrandBeads attribute)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.BondAngleDof">BondAngleDof (class in arbdmodel.ibi)</a>
 </li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.BondDof">BondDof (class in arbdmodel.ibi)</a>
+</li>
+      <li><a href="api/utilities/grid.html#arbdmodel.grid.Bound_grid">Bound_grid() (in module arbdmodel.grid)</a>
+</li>
+      <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.BoundaryPotential">BoundaryPotential (class in arbdmodel.interactions)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -464,11 +629,39 @@ document.write(`
 <h2 id="C">C</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGFactory.calc_atom_sasa">calc_atom_sasa() (ShapeCGFactory method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping">calculate_damping() (MeshProcessor method)</a>
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping">(SurfaceMeshProcessor method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/utilities/coords.html#arbdmodel.coords.calculate_dimensions_from_cell_vectors">calculate_dimensions_from_cell_vectors() (in module arbdmodel.coords)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties">calculate_hydrodynamic_properties() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.calculate_total_mass">calculate_total_mass() (ShapeCGModel method)</a>
+</li>
       <li><a href="api/utilities/version.html#arbdmodel.version.call_git_describe">call_git_describe() (in module arbdmodel.version)</a>
 </li>
       <li><a href="api/utilities/version.html#arbdmodel.version.check_git_repository">check_git_repository() (in module arbdmodel.version)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Child">Child (class in arbdmodel.core_objects)</a>
 </li>
       <li><a href="api/utilities/version.html#arbdmodel.version.Citation">Citation (class in arbdmodel.version)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.clear_all">clear_all() (ArbdModel method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.clear_all">(Parent method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Clone">Clone (class in arbdmodel.core_objects)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Group.clone">clone() (Group method)</a>
+</li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.SimConf.combine">combine() (SimConf method)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AngleDof.compute_volume">compute_volume() (AngleDof method)</a>
 
@@ -484,6 +677,8 @@ document.write(`
       </ul></li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.concentration_to_debye_length">concentration_to_debye_length() (ShapeCGModel method)</a>
+</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.ConnectableElement">ConnectableElement (class in arbdmodel.polymer)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.Connection">Connection (class in arbdmodel.polymer)</a>
@@ -497,10 +692,22 @@ document.write(`
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.contour_to_position">contour_to_position() (PolymerSection method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.contour_to_tangent">contour_to_tangent() (PolymerSection method)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg">convert_sod_to_mg() (ParmedArbd static method)</a>
 </li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.convolve_kernel_truncate">convolve_kernel_truncate() (in module arbdmodel.grid)</a>
 </li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.create_bounding_grid">create_bounding_grid() (in module arbdmodel.grid)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology">create_dual_topology() (ParmedArbd static method)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model">create_dual_topology_model() (ParmedArbd class method)</a>
+</li>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.create_engine">create_engine() (SimpleArbdConfig method)</a>
+</li>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.create_model">create_model() (SimpleArbdConfig method)</a>
+</li>
+      <li><a href="api/utilities/grid.html#arbdmodel.grid.Create_null">Create_null() (in module arbdmodel.grid)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -508,31 +715,63 @@ document.write(`
 <h2 id="D">D</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine.default_binary">default_binary (ArbdEngine property)</a>
+
+      <ul>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.default_binary">(NamdEngine property)</a>
+</li>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.default_binary">(SimEngine property)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.DefaultSimConf">DefaultSimConf (class in arbdmodel.sim_config)</a>
+</li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.DegreeOfFreedom">DegreeOfFreedom (class in arbdmodel.ibi)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.Connection.delete">delete() (Connection method)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.DiffusiveRigidBodyType">DiffusiveRigidBodyType (class in arbdmodel.structure_rigidbody)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.DihedralDof">DihedralDof (class in arbdmodel.ibi)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.dimensions_from_structure">dimensions_from_structure() (PolymerGroup method)</a>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.dimensions_from_structure">dimensions_from_structure() (ArbdModel method)</a>
+
+      <ul>
+        <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.dimensions_from_structure">(PolymerGroup method)</a>
 </li>
+      </ul></li>
       <li><a href="api/utilities/version.html#arbdmodel.version.Citation.display">display() (Citation method)</a>
 </li>
       <li><a href="api/polymer_modeling/ssdna_two_bead.html#arbdmodel.ssdna_two_bead.DnaModel">DnaModel (class in arbdmodel.ssdna_two_bead)</a>
 </li>
       <li><a href="api/polymer_modeling/ssdna_two_bead.html#arbdmodel.ssdna_two_bead.DnaStrandBeads">DnaStrandBeads (class in arbdmodel.ssdna_two_bead)</a>
 </li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Group.duplicate">duplicate() (Group method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.PointParticle.duplicate">(PointParticle method)</a>
+</li>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.RigidBody.duplicate">(RigidBody method)</a>
+</li>
+      </ul></li>
   </ul></td>
 </tr></table>
 
 <h2 id="E">E</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.extend">extend() (PolymerGroup method)</a>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.ParticleType.excludedAttributes">excludedAttributes (ParticleType attribute)</a>
 </li>
   </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.extend">extend() (ArbdModel method)</a>
+
+      <ul>
+        <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.extend">(PolymerGroup method)</a>
+</li>
+      </ul></li>
+  </ul></td>
 </tr></table>
 
 <h2 id="F">F</h2>
@@ -546,6 +785,8 @@ document.write(`
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.HarmonicBondedPotential.filename">(HarmonicBondedPotential method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.NullPotential.filename">(NullPotential method)</a>
+</li>
+        <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGNonbonded.filename">(ShapeCGNonbonded method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.WLCSKPotential.filename">(WLCSKPotential method)</a>
 </li>
@@ -559,6 +800,8 @@ document.write(`
       <li><a href="api/polymer_modeling/fjc_polymer_model.html#arbdmodel.fjc_polymer_model.FjcBeadsFromPolymer">FjcBeadsFromPolymer (class in arbdmodel.fjc_polymer_model)</a>
 </li>
       <li><a href="api/polymer_modeling/fjc_polymer_model.html#arbdmodel.fjc_polymer_model.FjcModel">FjcModel (class in arbdmodel.fjc_polymer_model)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.from_protein_list">from_protein_list() (ShapeCGModel class method)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -569,33 +812,115 @@ document.write(`
       <li><a href="api/utilities/grid.html#arbdmodel.grid.gaussian_kernel">gaussian_kernel() (in module arbdmodel.grid)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerModel.generate_beads">generate_beads() (PolymerModel method)</a>
+
+      <ul>
+        <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliModel.generate_beads">(SaliModel method)</a>
 </li>
-      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.get_center">get_center() (PolymerGroup method)</a>
+      </ul></li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution">generate_charge_distribution() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/utilities/coords.html#arbdmodel.coords.Generate_coordinates">Generate_coordinates() (in module arbdmodel.coords)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map">generate_electrostatic_map() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid">generate_potential_grid() (MeshProcessor method)</a>
 
       <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid">(SurfaceMeshProcessor method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGFactory.generate_protein">generate_protein() (ShapeCGFactory method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.generate_random_protein_positions">generate_random_protein_positions() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/utilities/coords.html#arbdmodel.coords.Generate_spanning_vectors">Generate_spanning_vectors() (in module arbdmodel.coords)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps">generate_vdw_maps() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_angles">get_angles() (Parent method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles">get_attached_particles() (MeshProcessor method)</a>
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles">(SurfaceMeshProcessor method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.SimConf.get_binary">get_binary() (SimConf method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_bond_angles">get_bond_angles() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_bonds">get_bonds() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.GroupSite.get_center">get_center() (GroupSite method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_center">(Parent method)</a>
+</li>
+        <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.get_center">(PolymerGroup method)</a>
+</li>
         <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.get_center">(PolymerSection method)</a>
 </li>
       </ul></li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AbstractIBIpotential.get_cg_distribution">get_cg_distribution() (AbstractIBIpotential method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_protein">get_coarse_protein() (ShapeCGFactory method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGFactory.get_coarse_types">get_coarse_types() (ShapeCGFactory method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Transformable.get_collapsed_position">get_collapsed_position() (Transformable method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.Location.get_connected_location">get_connected_location() (Location method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.get_connections">get_connections() (PolymerGroup method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.ConnectableElement.get_connections_and_locations">get_connections_and_locations() (ConnectableElement method)</a>
-</li>
-      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.get_contour_sorted_connections_and_locations">get_contour_sorted_connections_and_locations() (PolymerSection method)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.get_contour_sorted_connections_and_locations">get_contour_sorted_connections_and_locations() (PolymerSection method)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine.get_default_conf">get_default_conf() (ArbdEngine method)</a>
+
+      <ul>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.get_default_conf">(NamdEngine method)</a>
+</li>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.get_default_conf">(SimEngine method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_dihedrals">get_dihedrals() (Parent method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_exclusions">get_exclusions() (Parent method)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files">get_grid_files() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_impropers">get_impropers() (Parent method)</a>
+</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.ConnectableElement.get_location_at">get_location_at() (ConnectableElement method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.ConnectableElement.get_locations">get_locations() (ConnectableElement method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.Location.get_monomer_index">get_monomer_index() (Location method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Clone.get_original_recursively">get_original_recursively() (Clone method)</a>
 </li>
       <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.get_particle_assignments">get_particle_assignments() (in module arbdmodel.shape_cg)</a>
 </li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_product_potentials">get_product_potentials() (Parent method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.get_protein_types">get_protein_types() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/utilities/logger.html#arbdmodel.logger.get_resource_path">get_resource_path() (in module arbdmodel.logger)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.GroupSite.get_restraints">get_restraints() (GroupSite method)</a>
+
+      <ul>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_restraints">(Parent method)</a>
+</li>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.PointParticle.get_restraints">(PointParticle method)</a>
+</li>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.RigidBody.get_restraints">(RigidBody method)</a>
+</li>
+      </ul></li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.get_slice_enclosing_smaller_grid">get_slice_enclosing_smaller_grid() (in module arbdmodel.grid)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AbstractIBIpotential.get_target_distribution">get_target_distribution() (AbstractIBIpotential method)</a>
@@ -606,7 +931,15 @@ document.write(`
         <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.PairDistributionDof.get_values">(PairDistributionDof method)</a>
 </li>
       </ul></li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.get_vector_angles">get_vector_angles() (Parent method)</a>
+</li>
       <li><a href="api/utilities/version.html#arbdmodel.version.get_version">get_version() (in module arbdmodel.version)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.getParticleTypesAndCounts">getParticleTypesAndCounts() (ArbdModel method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Group">Group (class in arbdmodel.core_objects)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.GroupSite">GroupSite (class in arbdmodel.core_objects)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -622,10 +955,10 @@ document.write(`
 </li>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.HarmonicBondedPotential">HarmonicBondedPotential (class in arbdmodel.interactions)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.HarmonicDihedral">HarmonicDihedral (class in arbdmodel.interactions)</a>
 </li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.HarmonicVectorAngle">HarmonicVectorAngle (class in arbdmodel.interactions)</a>
 </li>
       <li><a href="api/polymer_modeling/hps_polymer_model.html#arbdmodel.hps_polymer_model.HpsBeads">HpsBeads (class in arbdmodel.hps_polymer_model)</a>
@@ -633,6 +966,8 @@ document.write(`
       <li><a href="api/polymer_modeling/hps_polymer_model.html#arbdmodel.hps_polymer_model.HpsModel">HpsModel (class in arbdmodel.hps_polymer_model)</a>
 </li>
       <li><a href="api/polymer_modeling/hps_polymer_model.html#arbdmodel.hps_polymer_model.HpsNonbonded">HpsNonbonded (class in arbdmodel.hps_polymer_model)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner">HydroProRunner (class in arbdmodel.engine)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -647,14 +982,24 @@ document.write(`
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.IBIDihedral">IBIDihedral (class in arbdmodel.ibi)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.IBINonbonded">IBINonbonded (class in arbdmodel.ibi)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.index">index() (Parent method)</a>
+</li>
+      <li><a href="api/utilities/binary_manager.html#arbdmodel.binary_manager.initialize_binary_paths">initialize_binary_paths() (in module arbdmodel.binary_manager)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.insert">insert() (Parent method)</a>
+</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.insert_monomers">insert_monomers() (PolymerSection method)</a>
 </li>
       <li><a href="api/utilities/version.html#arbdmodel.version.is_dirty">is_dirty() (in module arbdmodel.version)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.ParticleType.is_same_type">is_same_type() (ParticleType method)</a>
 </li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.isotropic_kernel">isotropic_kernel() (in module arbdmodel.grid)</a>
+</li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.SimConf.items">items() (SimConf method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.iterate_connections_and_locations">iterate_connections_and_locations() (PolymerSection method)</a>
 </li>
@@ -689,9 +1034,17 @@ document.write(`
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.LennardJones">LennardJones (class in arbdmodel.interactions)</a>
+</li>
+      <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.LinearBond">LinearBond (class in arbdmodel.sali_polymer_model)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.load_structure">load_structure() (ParmedArbd method)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.load_target_IBI_distributions">load_target_IBI_distributions() (ArbdModel method)</a>
+</li>
+      <li><a href="api/utilities/grid.html#arbdmodel.grid.loadGrid">loadGrid() (in module arbdmodel.grid)</a>
+</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.Location">Location (class in arbdmodel.polymer)</a>
 </li>
   </ul></td>
@@ -700,13 +1053,31 @@ document.write(`
 <h2 id="M">M</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.main">main() (in module arbdmodel.simplearbd)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor">MeshProcessor (class in arbdmodel.mesh_process_volume)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_rigidbody.html#arbdmodel.mesh_rigidbody.MeshRigidBodyType">MeshRigidBodyType (class in arbdmodel.mesh_rigidbody)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.MICRON_TO_ANGSTROM">MICRON_TO_ANGSTROM (MeshProcessor attribute)</a>
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.MICRON_TO_ANGSTROM">(SurfaceMeshProcessor attribute)</a>
+</li>
+      </ul></li>
       <li><a href="api/utilities/coords.html#arbdmodel.coords.minimizeRmsd">minimizeRmsd() (in module arbdmodel.coords)</a>
 </li>
       <li>
     module
 
       <ul>
+        <li><a href="api/utilities/binary_manager.html#module-arbdmodel.binary_manager">arbdmodel.binary_manager</a>
+</li>
         <li><a href="api/utilities/coords.html#module-arbdmodel.coords">arbdmodel.coords</a>
+</li>
+        <li><a href="api/core/core_objects.html#module-arbdmodel.core_objects">arbdmodel.core_objects</a>
+</li>
+        <li><a href="api/simulation_engines/engine.html#module-arbdmodel.engine">arbdmodel.engine</a>
 </li>
         <li><a href="api/polymer_modeling/fjc_polymer_model.html#module-arbdmodel.fjc_polymer_model">arbdmodel.fjc_polymer_model</a>
 </li>
@@ -721,16 +1092,36 @@ document.write(`
         <li><a href="api/polymer_modeling/kh_polymer_model.html#module-arbdmodel.kh_polymer_model">arbdmodel.kh_polymer_model</a>
 </li>
         <li><a href="api/utilities/logger.html#module-arbdmodel.logger">arbdmodel.logger</a>
+</li>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#module-arbdmodel.mesh_process_surface">arbdmodel.mesh_process_surface</a>
+</li>
+        <li><a href="api/rigidbody_models/mesh_process_volume.html#module-arbdmodel.mesh_process_volume">arbdmodel.mesh_process_volume</a>
+</li>
+        <li><a href="api/rigidbody_models/mesh_rigidbody.html#module-arbdmodel.mesh_rigidbody">arbdmodel.mesh_rigidbody</a>
+</li>
+        <li><a href="api/core/model.html#module-arbdmodel.model">arbdmodel.model</a>
 </li>
         <li><a href="api/polymer_modeling/mpipi_polymer.html#module-arbdmodel.mpipi_polymer">arbdmodel.mpipi_polymer</a>
 </li>
         <li><a href="api/polymer_modeling/onck_polymer_model.html#module-arbdmodel.onck_polymer_model">arbdmodel.onck_polymer_model</a>
+</li>
+        <li><a href="api/simulation_engines/parmed_bd.html#module-arbdmodel.parmed_bd">arbdmodel.parmed_bd</a>
 </li>
         <li><a href="api/polymer_modeling/polymer.html#module-arbdmodel.polymer">arbdmodel.polymer</a>
+</li>
+        <li><a href="api/polymer_modeling/sali_polymer_model.html#module-arbdmodel.sali_polymer_model">arbdmodel.sali_polymer_model</a>
 </li>
         <li><a href="api/shape-based_models/shape_cg.html#module-arbdmodel.shape_cg">arbdmodel.shape_cg</a>
+</li>
+        <li><a href="api/core/sim_config.html#module-arbdmodel.sim_config">arbdmodel.sim_config</a>
+</li>
+        <li><a href="api/rigidbody_models/simplearbd.html#module-arbdmodel.simplearbd">arbdmodel.simplearbd</a>
 </li>
         <li><a href="api/polymer_modeling/ssdna_two_bead.html#module-arbdmodel.ssdna_two_bead">arbdmodel.ssdna_two_bead</a>
+</li>
+        <li><a href="api/rigidbody_models/structure_from_pdb.html#module-arbdmodel.structure_from_pdb">arbdmodel.structure_from_pdb</a>
+</li>
+        <li><a href="api/rigidbody_models/structure_rigidbody.html#module-arbdmodel.structure_rigidbody">arbdmodel.structure_rigidbody</a>
 </li>
         <li><a href="api/utilities/version.html#module-arbdmodel.version">arbdmodel.version</a>
 </li>
@@ -753,12 +1144,14 @@ document.write(`
 <h2 id="N">N</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="api/utilities/grid.html#arbdmodel.grid.neighborhood_average">neighborhood_average() (in module arbdmodel.grid)</a>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine">NamdEngine (class in arbdmodel.engine)</a>
 </li>
-      <li><a href="api/polymer_modeling/ssdna_two_bead.html#arbdmodel.ssdna_two_bead.DnaStrandBeads.nt">nt (DnaStrandBeads attribute)</a>
+      <li><a href="api/utilities/grid.html#arbdmodel.grid.neighborhood_average">neighborhood_average() (in module arbdmodel.grid)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/polymer_modeling/ssdna_two_bead.html#arbdmodel.ssdna_two_bead.DnaStrandBeads.nt">nt (DnaStrandBeads attribute)</a>
+</li>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.NullPotential">NullPotential (class in arbdmodel.interactions)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerBeads.num_bead_groups">num_bead_groups (PolymerBeads property)</a>
@@ -788,6 +1181,18 @@ document.write(`
       <li><a href="api/polymer_modeling/ssdna_two_bead.html#arbdmodel.ssdna_two_bead.DnaStrandBeads.p">p (DnaStrandBeads attribute)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.PairDistributionDof">PairDistributionDof (class in arbdmodel.ibi)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent">Parent (class in arbdmodel.core_objects)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.parmed_structure">parmed_structure (ParmedArbd attribute)</a>
+</li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd">ParmedArbd (class in arbdmodel.parmed_bd)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner.parse_output">parse_output() (HydroProRunner method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.ParticleType">ParticleType (class in arbdmodel.core_objects)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.PdbModel">PdbModel (class in arbdmodel.model)</a>
 </li>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.AbstractPotential.periodic">periodic (AbstractPotential property)</a>
 
@@ -797,6 +1202,8 @@ document.write(`
         <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.IBIDihedral.periodic">(IBIDihedral property)</a>
 </li>
       </ul></li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.PointParticle">PointParticle (class in arbdmodel.core_objects)</a>
+</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerBeads">PolymerBeads (class in arbdmodel.polymer)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup">PolymerGroup (class in arbdmodel.polymer)</a>
@@ -809,6 +1216,8 @@ document.write(`
 
       <ul>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.AbstractPotential.potential">(AbstractPotential method)</a>
+</li>
+        <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.BoundaryPotential.potential">(BoundaryPotential method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.HalfHarmonic.potential">(HalfHarmonic method)</a>
 </li>
@@ -821,12 +1230,18 @@ document.write(`
         <li><a href="api/polymer_modeling/kh_polymer_model.html#arbdmodel.kh_polymer_model.KhNonbonded.potential">(KhNonbonded method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.LennardJones.potential">(LennardJones method)</a>
+</li>
+        <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.LinearBond.potential">(LinearBond method)</a>
 </li>
         <li><a href="api/polymer_modeling/mpipi_polymer.html#arbdmodel.mpipi_polymer.MpipiNonbonded.potential">(MpipiNonbonded method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.NullPotential.potential">(NullPotential method)</a>
 </li>
         <li><a href="api/polymer_modeling/onck_polymer_model.html#arbdmodel.onck_polymer_model.OnckNonbonded.potential">(OnckNonbonded method)</a>
+</li>
+        <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliNonbonded.potential">(SaliNonbonded method)</a>
+</li>
+        <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGNonbonded.potential">(ShapeCGNonbonded method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.TabulatedNonbonded.potential">(TabulatedNonbonded method)</a>
 </li>
@@ -836,6 +1251,18 @@ document.write(`
 </li>
       </ul></li>
   </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.prepare_for_simulation">prepare_for_simulation() (ArbdModel method)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StaticObject.process">process() (StaticObject method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.process_mesh_file">process_mesh_file() (in module arbdmodel.mesh_process_volume)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor.process_structure">process_structure() (StructureProcessor method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.process_surface_mesh">process_surface_mesh() (in module arbdmodel.mesh_process_surface)</a>
+</li>
+  </ul></td>
 </tr></table>
 
 <h2 id="Q">Q</h2>
@@ -870,35 +1297,85 @@ document.write(`
       <li><a href="api/utilities/coords.html#arbdmodel.coords.read_average_arbd_coordinates">read_average_arbd_coordinates() (in module arbdmodel.coords)</a>
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AbstractIBIpotential.read_cg_potential">read_cg_potential() (AbstractIBIpotential method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.read_files">read_files() (in module arbdmodel.shape_cg)</a>
 </li>
       <li><a href="api/utilities/version.html#arbdmodel.version.read_release_version">read_release_version() (in module arbdmodel.version)</a>
 </li>
       <li><a href="api/utilities/version.html#arbdmodel.version.read_version_file">read_version_file() (in module arbdmodel.version)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/utilities/coords.html#arbdmodel.coords.readArbdCoords">readArbdCoords() (in module arbdmodel.coords)</a>
 </li>
       <li><a href="api/utilities/coords.html#arbdmodel.coords.readAvgArbdCoords">readAvgArbdCoords() (in module arbdmodel.coords)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Parent.remove">remove() (Parent method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.remove_monomers">remove_monomers() (PolymerSection method)</a>
 </li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.replace_false_with_distance">replace_false_with_distance() (in module arbdmodel.grid)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.RigidBody">RigidBody (class in arbdmodel.core_objects)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.RigidBodyType">RigidBodyType (class in arbdmodel.core_objects)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.rotate">rotate() (PolymerGroup method)</a>
 
       <ul>
         <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.rotate">(PolymerSection method)</a>
+</li>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Transformable.rotate">(Transformable method)</a>
 </li>
       </ul></li>
       <li><a href="api/utilities/coords.html#arbdmodel.coords.rotationAboutAxis">rotationAboutAxis() (in module arbdmodel.coords)</a>
 </li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.APBSRunner.run_calculation">run_calculation() (APBSRunner method)</a>
+
+      <ul>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner.run_calculation">(HydroProRunner method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.run_from_minimized">run_from_minimized() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.run_IBI">run_IBI() (ArbdModel method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.run_minimization">run_minimization() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.run_simulation">run_simulation() (SimpleArbdConfig method)</a>
+
+      <ul>
+        <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation">(SimpleArbdEngine method)</a>
+</li>
+      </ul></li>
   </ul></td>
 </tr></table>
 
 <h2 id="S">S</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliBeadsFromPolymer">SaliBeadsFromPolymer (class in arbdmodel.sali_polymer_model)</a>
+</li>
+      <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliModel">SaliModel (class in arbdmodel.sali_polymer_model)</a>
+</li>
+      <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliNonbonded">SaliNonbonded (class in arbdmodel.sali_polymer_model)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh">save_aligned_mesh() (MeshProcessor method)</a>
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh">(SurfaceMeshProcessor method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats">save_aligned_mesh_both_formats() (SurfaceMeshProcessor method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb">save_as_pdb() (MeshProcessor method)</a>
+
+      <ul>
+        <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb">(SurfaceMeshProcessor method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.SimConf.set_binary">set_binary() (SimConf method)</a>
+</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.Location.set_connection">set_connection() (Location method)</a>
 </li>
       <li><a href="api/polymer_modeling/fjc_polymer_model.html#arbdmodel.fjc_polymer_model.FjcModel.set_damping_coefficient">set_damping_coefficient() (FjcModel method)</a>
@@ -913,12 +1390,40 @@ document.write(`
         <li><a href="api/polymer_modeling/onck_polymer_model.html#arbdmodel.onck_polymer_model.OnckModel.set_damping_coefficient">(OnckModel method)</a>
 </li>
       </ul></li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.set_orientation_splines">set_orientation_splines() (PolymerSection method)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.set_splines">set_splines() (PolymerSection method)</a>
 </li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel.setup_and_run">setup_and_run() (ShapeCGModel method)</a>
+</li>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects">setup_diffusible_objects() (SimpleArbdConfig method)</a>
+</li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects">setup_static_objects() (SimpleArbdConfig method)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGFactory">ShapeCGFactory (class in arbdmodel.shape_cg)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGModel">ShapeCGModel (class in arbdmodel.shape_cg)</a>
+</li>
+      <li><a href="api/shape-based_models/shape_cg.html#arbdmodel.shape_cg.ShapeCGNonbonded">ShapeCGNonbonded (class in arbdmodel.shape_cg)</a>
+</li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.SimConf">SimConf (class in arbdmodel.sim_config)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.SimEngine">SimEngine (class in arbdmodel.engine)</a>
+</li>
+      <li><a href="api/rigidbody_models/simplearbd.html#arbdmodel.simplearbd.SimpleArbdConfig">SimpleArbdConfig (class in arbdmodel.simplearbd)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine">SimpleArbdEngine (class in arbdmodel.structure_rigidbody)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.simulate">simulate() (ArbdModel method)</a>
+
+      <ul>
+        <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.simulate">(ParmedArbd method)</a>
+</li>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.simulate">(SimEngine method)</a>
+</li>
+      </ul></li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.slab_potential_z">slab_potential_z() (in module arbdmodel.grid)</a>
 </li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.spherical_confinement">spherical_confinement() (in module arbdmodel.grid)</a>
@@ -931,6 +1436,14 @@ document.write(`
         <li><a href="api/polymer_modeling/mpipi_polymer.html#arbdmodel.mpipi_polymer.MpipiModel.spring_constant">(MpipiModel attribute)</a>
 </li>
       </ul></li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StaticObject">StaticObject (class in arbdmodel.structure_rigidbody)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_from_pdb.html#arbdmodel.structure_from_pdb.StructureProcessor">StructureProcessor (class in arbdmodel.structure_from_pdb)</a>
+</li>
+      <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.StructureRigidBodyModel">StructureRigidBodyModel (class in arbdmodel.structure_rigidbody)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor">SurfaceMeshProcessor (class in arbdmodel.mesh_process_surface)</a>
+</li>
   </ul></td>
 </tr></table>
 
@@ -939,16 +1452,30 @@ document.write(`
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.TabulatedNonbonded">TabulatedNonbonded (class in arbdmodel.interactions)</a>
 </li>
+      <li><a href="api/core/sim_config.html#arbdmodel.sim_config.DefaultSimConf.temperature">temperature (DefaultSimConf property)</a>
+
+      <ul>
+        <li><a href="api/core/sim_config.html#arbdmodel.sim_config.SimConf.temperature">(SimConf property)</a>
+</li>
+      </ul></li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.TestAverageGrids.test_average_grids">test_average_grids() (TestAverageGrids method)</a>
 </li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.TestAverageGrids">TestAverageGrids (class in arbdmodel.grid)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Transformable.transform">transform() (Transformable method)</a>
+</li>
+      <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Transformable">Transformable (class in arbdmodel.core_objects)</a>
 </li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.translate">translate() (PolymerGroup method)</a>
 
       <ul>
         <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerSection.translate">(PolymerSection method)</a>
+</li>
+        <li><a href="api/core/core_objects.html#arbdmodel.core_objects.Transformable.translate">(Transformable method)</a>
 </li>
       </ul></li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.HarmonicAngle.type_">type_ (HarmonicAngle property)</a>
 
       <ul>
@@ -973,11 +1500,21 @@ document.write(`
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="api/utilities/coords.html#arbdmodel.coords.unit_quat_conversions">unit_quat_conversions() (in module arbdmodel.coords)</a>
 </li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.update">update() (ArbdModel method)</a>
+
+      <ul>
+        <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.update">(PolymerGroup method)</a>
+</li>
+      </ul></li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerGroup.update">update() (PolymerGroup method)</a>
-</li>
       <li><a href="api/polymer_modeling/polymer.html#arbdmodel.polymer.PolymerModel.update_splines">update_splines() (PolymerModel method)</a>
+
+      <ul>
+        <li><a href="api/polymer_modeling/sali_polymer_model.html#arbdmodel.sali_polymer_model.SaliModel.update_splines">(SaliModel method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/core/model.html#arbdmodel.model.ArbdModel.useNonbondedScheme">useNonbondedScheme() (ArbdModel method)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -1007,20 +1544,54 @@ document.write(`
 </li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AbstractIBIpotential.write_cg_potential">write_cg_potential() (AbstractIBIpotential method)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.write_conf">write_conf() (NamdEngine method)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.APBSRunner.write_config">write_config() (APBSRunner method)</a>
+
+      <ul>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.HydroProRunner.write_config">(HydroProRunner method)</a>
+</li>
+      </ul></li>
+      <li><a href="api/utilities/grid.html#arbdmodel.grid.write_confine_dx">write_confine_dx() (in module arbdmodel.grid)</a>
+</li>
       <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.AbstractIBIpotential.write_file">write_file() (AbstractIBIpotential method)</a>
 
       <ul>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.AbstractPotential.write_file">(AbstractPotential method)</a>
+</li>
+        <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.BoundaryPotential.write_file">(BoundaryPotential method)</a>
 </li>
         <li><a href="api/interaction_potentials/ibi.html#arbdmodel.ibi.IBINonbonded.write_file">(IBINonbonded method)</a>
 </li>
         <li><a href="api/interaction_potentials/interactions.html#arbdmodel.interactions.TabulatedNonbonded.write_file">(TabulatedNonbonded method)</a>
 </li>
       </ul></li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="api/rigidbody_models/mesh_process_volume.html#arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential">write_no_enter_potential() (MeshProcessor method)</a>
+</li>
+      <li><a href="api/rigidbody_models/mesh_process_surface.html#arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx">write_no_enter_potential_dx() (SurfaceMeshProcessor method)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.PdbModel.write_pdb">write_pdb() (PdbModel method)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.PdbModel.write_pqr">write_pqr() (PdbModel method)</a>
+</li>
+      <li><a href="api/core/model.html#arbdmodel.model.PdbModel.write_psf">write_psf() (PdbModel method)</a>
+</li>
       <li><a href="api/utilities/version.html#arbdmodel.version.write_release_version">write_release_version() (in module arbdmodel.version)</a>
 </li>
+      <li><a href="api/simulation_engines/parmed_bd.html#arbdmodel.parmed_bd.ParmedArbd.write_restraint_files">write_restraint_files() (ParmedArbd method)</a>
+</li>
+      <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.ArbdEngine.write_simulation_files">write_simulation_files() (ArbdEngine method)</a>
+
+      <ul>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.NamdEngine.write_simulation_files">(NamdEngine method)</a>
+</li>
+        <li><a href="api/simulation_engines/engine.html#arbdmodel.engine.SimEngine.write_simulation_files">(SimEngine method)</a>
+</li>
+        <li><a href="api/rigidbody_models/structure_rigidbody.html#arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files">(SimpleArbdEngine method)</a>
+</li>
+      </ul></li>
       <li><a href="api/utilities/grid.html#arbdmodel.grid.writeDx">writeDx() (in module arbdmodel.grid)</a>
 </li>
   </ul></td>
diff --git a/_build/html/intro.html b/_build/html/intro.html
index 204712db74a591400bb9cc0a1d4c937880774fc5..753237cd058dac596899227ba10636e2407315b6 100644
--- a/_build/html/intro.html
+++ b/_build/html/intro.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="_static/copybutton.js?v=f281be69"></script>
     <script src="_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="_static/tabs.js?v=3ee01567"></script>
-    <script src="_static/js/hoverxref.js"></script>
-    <script src="_static/js/tooltipster.bundle.min.js"></script>
-    <script src="_static/js/micromodal.min.js"></script>
+    <script src="_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/objects.inv b/_build/html/objects.inv
index 0394d4153084d24481fa475f6e4cd71297acaf19..181d20cd11015cf54de14f56a2355028aa4f3115 100644
Binary files a/_build/html/objects.inv and b/_build/html/objects.inv differ
diff --git a/_build/html/py-modindex.html b/_build/html/py-modindex.html
index b255ce1ed24148173b9e6d5a7a0b13f899b82394..1b834c767a334015a740102faf386096a0ac7a05 100644
--- a/_build/html/py-modindex.html
+++ b/_build/html/py-modindex.html
@@ -31,19 +31,19 @@
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -60,9 +60,9 @@
     <script src="_static/copybutton.js?v=f281be69"></script>
     <script src="_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="_static/tabs.js?v=3ee01567"></script>
-    <script src="_static/js/hoverxref.js"></script>
-    <script src="_static/js/tooltipster.bundle.min.js"></script>
-    <script src="_static/js/micromodal.min.js"></script>
+    <script src="_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -319,11 +319,26 @@ document.write(`
        <td>
        <code class="xref">arbdmodel</code></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/utilities/binary_manager.html#module-arbdmodel.binary_manager"><code class="xref">arbdmodel.binary_manager</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
        <a href="api/utilities/coords.html#module-arbdmodel.coords"><code class="xref">arbdmodel.coords</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/core/core_objects.html#module-arbdmodel.core_objects"><code class="xref">arbdmodel.core_objects</code></a></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/simulation_engines/engine.html#module-arbdmodel.engine"><code class="xref">arbdmodel.engine</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
@@ -359,6 +374,26 @@ document.write(`
        <td>&#160;&#160;&#160;
        <a href="api/utilities/logger.html#module-arbdmodel.logger"><code class="xref">arbdmodel.logger</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/rigidbody_models/mesh_process_surface.html#module-arbdmodel.mesh_process_surface"><code class="xref">arbdmodel.mesh_process_surface</code></a></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/rigidbody_models/mesh_process_volume.html#module-arbdmodel.mesh_process_volume"><code class="xref">arbdmodel.mesh_process_volume</code></a></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/rigidbody_models/mesh_rigidbody.html#module-arbdmodel.mesh_rigidbody"><code class="xref">arbdmodel.mesh_rigidbody</code></a></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/core/model.html#module-arbdmodel.model"><code class="xref">arbdmodel.model</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
@@ -369,21 +404,51 @@ document.write(`
        <td>&#160;&#160;&#160;
        <a href="api/polymer_modeling/onck_polymer_model.html#module-arbdmodel.onck_polymer_model"><code class="xref">arbdmodel.onck_polymer_model</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/simulation_engines/parmed_bd.html#module-arbdmodel.parmed_bd"><code class="xref">arbdmodel.parmed_bd</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
        <a href="api/polymer_modeling/polymer.html#module-arbdmodel.polymer"><code class="xref">arbdmodel.polymer</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/polymer_modeling/sali_polymer_model.html#module-arbdmodel.sali_polymer_model"><code class="xref">arbdmodel.sali_polymer_model</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
        <a href="api/shape-based_models/shape_cg.html#module-arbdmodel.shape_cg"><code class="xref">arbdmodel.shape_cg</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/core/sim_config.html#module-arbdmodel.sim_config"><code class="xref">arbdmodel.sim_config</code></a></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/rigidbody_models/simplearbd.html#module-arbdmodel.simplearbd"><code class="xref">arbdmodel.simplearbd</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
        <a href="api/polymer_modeling/ssdna_two_bead.html#module-arbdmodel.ssdna_two_bead"><code class="xref">arbdmodel.ssdna_two_bead</code></a></td><td>
        <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/rigidbody_models/structure_from_pdb.html#module-arbdmodel.structure_from_pdb"><code class="xref">arbdmodel.structure_from_pdb</code></a></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&#160;&#160;&#160;
+       <a href="api/rigidbody_models/structure_rigidbody.html#module-arbdmodel.structure_rigidbody"><code class="xref">arbdmodel.structure_rigidbody</code></a></td><td>
+       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
diff --git a/_build/html/search.html b/_build/html/search.html
index 8d6d51fadffaf9f424dc07dbab36f24022114cff..1c37f7609c2ca9f5b9547c9c07ff90bb4d113eb5 100644
--- a/_build/html/search.html
+++ b/_build/html/search.html
@@ -30,19 +30,19 @@
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -59,9 +59,9 @@
     <script src="_static/copybutton.js?v=f281be69"></script>
     <script src="_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="_static/tabs.js?v=3ee01567"></script>
-    <script src="_static/js/hoverxref.js"></script>
-    <script src="_static/js/tooltipster.bundle.min.js"></script>
-    <script src="_static/js/micromodal.min.js"></script>
+    <script src="_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js
index c853d04c112c8c842777630523e39df392193ac5..5e9bde98e6e82a23ab59c7b4c71b867c2cd45e9b 100644
--- a/_build/html/searchindex.js
+++ b/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"1- basics": [[41, "basics"]], "2-polymer_objects": [[41, "polymer-objects"]], "3-iterative-boltzmann-inversion": [[41, "iterative-boltzmann-inversion"]], "4-rigid-bodies": [[41, "rigid-bodies"]], "API Reference": [[5, null]], "ARBD Model Documentation": [[36, null]], "ARBD is configured through plain text files": [[37, "arbd-is-configured-through-plain-text-files"]], "Add a constant-force to the ends of the polymers to determine their elastic properties": [[38, "add-a-constant-force-to-the-ends-of-the-polymers-to-determine-their-elastic-properties"]], "Add your files": [[0, "add-your-files"]], "Adding single-stranded DNA binding protein": [[40, "adding-single-stranded-dna-binding-protein"]], "Attaching point particles": [[40, "attaching-point-particles"]], "Authors and acknowledgment": [[0, "authors-and-acknowledgment"]], "Available Tutorials": [[41, "available-tutorials"]], "Badges": [[0, "badges"]], "Basic usage of the arbdmodel package": [[37, null]], "Collaborate with your team": [[0, "collaborate-with-your-team"]], "Contributing": [[0, "contributing"]], "Core": [[2, null]], "Description": [[0, "description"]], "Editing this README": [[0, "editing-this-readme"]], "Features": [[36, "features"]], "Getting Started": [[36, "getting-started"]], "Getting started": [[0, "getting-started"]], "Implementing customized coarse-grained polymer models": [[39, null]], "Installation": [[0, "installation"]], "Integrate with your tools": [[0, "integrate-with-your-tools"]], "Interaction Potentials": [[7, null]], "License": [[0, "license"]], "Modeling rigid-body objects": [[40, null]], "Module Categories": [[5, "module-categories"]], "Modules": [[2, "modules"], [7, "modules"], [11, "modules"], [18, "modules"], [25, "modules"], [28, "modules"], [33, "modules"]], "Name": [[0, "name"]], "Overview": [[36, "overview"]], "Polymer Modeling": [[11, null]], "Project status": [[0, "project-status"]], "Python API Reference": [[36, "python-api-reference"]], "RigidBody Models": [[18, null]], "Roadmap": [[0, "roadmap"]], "Shape-Based Models": [[25, null]], "Simulation Engines": [[28, null]], "Some polymer models may have multiple beads per monomer": [[38, null]], "Step 1: Create particle types": [[37, "step-1-create-particle-types"]], "Step 1: Model Construction": [[39, "step-1-model-construction"]], "Step 2: Build a system": [[37, "step-2-build-a-system"]], "Step 2: Setting up a coarser model": [[39, "step-2-setting-up-a-coarser-model"]], "Step 3: Describe the interactions between the particles": [[37, "step-3-describe-the-interactions-between-the-particles"]], "Step 3: Mapping the fine grained trajectory to a coarser representation": [[39, "step-3-mapping-the-fine-grained-trajectory-to-a-coarser-representation"]], "Step 4: Run the coarser IBI simulations": [[39, "step-4-run-the-coarser-ibi-simulations"]], "Step 4: Run the simulation": [[37, "step-4-run-the-simulation"]], "Step 5: Visualization": [[39, "step-5-visualization"]], "Step 5: Visualize the results": [[37, "step-5-visualize-the-results"]], "Step 6: Customize the interactions": [[37, "step-6-customize-the-interactions"]], "Step 7: Add bonds": [[37, "step-7-add-bonds"]], "Suggestions for a good README": [[0, "suggestions-for-a-good-readme"]], "Support": [[0, "support"]], "Test and Deploy": [[0, "test-and-deploy"]], "Tutorials": [[41, null]], "Usage": [[0, "usage"]], "Utilities": [[33, null]], "Visuals": [[0, "visuals"]], "arbdmodel-docs": [[0, null]], "binary_manager": [[30, null]], "coords": [[31, null]], "core_objects": [[1, null]], "engine": [[27, null]], "fjc_polymer_model": [[9, null]], "grid": [[32, null]], "hps_polymer_model": [[10, null]], "ibi": [[6, null]], "interactions": [[8, null]], "kh_polymer_model": [[12, null]], "logger": [[34, null]], "mesh_process_surface": [[19, null]], "mesh_process_volume": [[20, null]], "mesh_rigidbody": [[21, null]], "model": [[3, null]], "mpipi_polymer": [[13, null]], "onck_polymer_model": [[14, null]], "parmed_bd": [[29, null]], "polymer": [[15, null]], "sali_polymer_model": [[16, null]], "shape_cg": [[26, null]], "sim_config": [[4, null]], "simplearbd": [[22, null]], "ssdna_two_bead": [[17, null]], "structure_from_pdb": [[23, null]], "structure_rigidbody": [[24, null]], "version": [[35, null]]}, "docnames": ["README", "api/core/core_objects", "api/core/index", "api/core/model", "api/core/sim_config", "api/index", "api/interaction_potentials/ibi", "api/interaction_potentials/index", "api/interaction_potentials/interactions", "api/polymer_modeling/fjc_polymer_model", "api/polymer_modeling/hps_polymer_model", "api/polymer_modeling/index", "api/polymer_modeling/kh_polymer_model", "api/polymer_modeling/mpipi_polymer", "api/polymer_modeling/onck_polymer_model", "api/polymer_modeling/polymer", "api/polymer_modeling/sali_polymer_model", "api/polymer_modeling/ssdna_two_bead", "api/rigidbody_models/index", "api/rigidbody_models/mesh_process_surface", "api/rigidbody_models/mesh_process_volume", "api/rigidbody_models/mesh_rigidbody", "api/rigidbody_models/simplearbd", "api/rigidbody_models/structure_from_pdb", "api/rigidbody_models/structure_rigidbody", "api/shape-based_models/index", "api/shape-based_models/shape_cg", "api/simulation_engines/engine", "api/simulation_engines/index", "api/simulation_engines/parmed_bd", "api/utilities/binary_manager", "api/utilities/coords", "api/utilities/grid", "api/utilities/index", "api/utilities/logger", "api/utilities/version", "intro", "tutorials/1-basics", "tutorials/2-polymer-objects", "tutorials/3-iterative-boltzmann-inversion/3-ibi", "tutorials/4-rigid-bodies/4-rigid-bodies", "tutorials/index"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1}, "filenames": ["README.md", "api/core/core_objects.md", "api/core/index.md", "api/core/model.md", "api/core/sim_config.md", "api/index.md", "api/interaction_potentials/ibi.md", "api/interaction_potentials/index.md", "api/interaction_potentials/interactions.md", "api/polymer_modeling/fjc_polymer_model.md", "api/polymer_modeling/hps_polymer_model.md", "api/polymer_modeling/index.md", "api/polymer_modeling/kh_polymer_model.md", "api/polymer_modeling/mpipi_polymer.md", "api/polymer_modeling/onck_polymer_model.md", "api/polymer_modeling/polymer.md", "api/polymer_modeling/sali_polymer_model.md", "api/polymer_modeling/ssdna_two_bead.md", "api/rigidbody_models/index.md", "api/rigidbody_models/mesh_process_surface.md", "api/rigidbody_models/mesh_process_volume.md", "api/rigidbody_models/mesh_rigidbody.md", "api/rigidbody_models/simplearbd.md", "api/rigidbody_models/structure_from_pdb.md", "api/rigidbody_models/structure_rigidbody.md", "api/shape-based_models/index.md", "api/shape-based_models/shape_cg.md", "api/simulation_engines/engine.md", "api/simulation_engines/index.md", "api/simulation_engines/parmed_bd.md", "api/utilities/binary_manager.md", "api/utilities/coords.md", "api/utilities/grid.md", "api/utilities/index.md", "api/utilities/logger.md", "api/utilities/version.md", "intro.md", "tutorials/1-basics.ipynb", "tutorials/2-polymer-objects.ipynb", "tutorials/3-iterative-boltzmann-inversion/3-ibi.ipynb", "tutorials/4-rigid-bodies/4-rigid-bodies.ipynb", "tutorials/index.md"], "indexentries": {"abstractibipotential (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.AbstractIBIpotential", false]], "abstractpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.AbstractPotential", false]], "add_grid_potential() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.add_grid_potential", false]], "add_location() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.add_location", false]], "add_smaller_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.add_smaller_grid", false]], "angledof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.AngleDof", false]], "arbdmodel.coords": [[31, "module-arbdmodel.coords", false]], "arbdmodel.fjc_polymer_model": [[9, "module-arbdmodel.fjc_polymer_model", false]], "arbdmodel.grid": [[32, "module-arbdmodel.grid", false]], "arbdmodel.hps_polymer_model": [[10, "module-arbdmodel.hps_polymer_model", false]], "arbdmodel.ibi": [[6, "module-arbdmodel.ibi", false]], "arbdmodel.interactions": [[8, "module-arbdmodel.interactions", false]], "arbdmodel.kh_polymer_model": [[12, "module-arbdmodel.kh_polymer_model", false]], "arbdmodel.logger": [[34, "module-arbdmodel.logger", false]], "arbdmodel.mpipi_polymer": [[13, "module-arbdmodel.mpipi_polymer", false]], "arbdmodel.onck_polymer_model": [[14, "module-arbdmodel.onck_polymer_model", false]], "arbdmodel.polymer": [[15, "module-arbdmodel.polymer", false]], "arbdmodel.shape_cg": [[26, "module-arbdmodel.shape_cg", false]], "arbdmodel.ssdna_two_bead": [[17, "module-arbdmodel.ssdna_two_bead", false]], "arbdmodel.version": [[35, "module-arbdmodel.version", false]], "average_grids() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.average_grids", false]], "b (dnastrandbeads attribute)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads.b", false]], "bondangledof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.BondAngleDof", false]], "bonddof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.BondDof", false]], "call_git_describe() (in module arbdmodel.version)": [[35, "arbdmodel.version.call_git_describe", false]], "check_git_repository() (in module arbdmodel.version)": [[35, "arbdmodel.version.check_git_repository", false]], "citation (class in arbdmodel.version)": [[35, "arbdmodel.version.Citation", false]], "compute_volume() (angledof method)": [[6, "arbdmodel.ibi.AngleDof.compute_volume", false]], "compute_volume() (bonddof method)": [[6, "arbdmodel.ibi.BondDof.compute_volume", false]], "compute_volume() (degreeoffreedom method)": [[6, "arbdmodel.ibi.DegreeOfFreedom.compute_volume", false]], "compute_volume() (pairdistributiondof method)": [[6, "arbdmodel.ibi.PairDistributionDof.compute_volume", false]], "compute_volume() (radiusdof method)": [[6, "arbdmodel.ibi.RadiusDof.compute_volume", false]], "connectableelement (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.ConnectableElement", false]], "connection (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.Connection", false]], "constant_force() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.constant_force", false]], "contour_to_monomer_index() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_monomer_index", false]], "contour_to_orientation() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_orientation", false]], "contour_to_position() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_position", false]], "contour_to_tangent() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_tangent", false]], "convolve_kernel_truncate() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.convolve_kernel_truncate", false]], "create_bounding_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.create_bounding_grid", false]], "degreeoffreedom (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.DegreeOfFreedom", false]], "delete() (connection method)": [[15, "arbdmodel.polymer.Connection.delete", false]], "dihedraldof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.DihedralDof", false]], "dimensions_from_structure() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.dimensions_from_structure", false]], "display() (citation method)": [[35, "arbdmodel.version.Citation.display", false]], "dnamodel (class in arbdmodel.ssdna_two_bead)": [[17, "arbdmodel.ssdna_two_bead.DnaModel", false]], "dnastrandbeads (class in arbdmodel.ssdna_two_bead)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads", false]], "extend() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.extend", false]], "filename() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.filename", false]], "filename() (abstractpotential method)": [[8, "arbdmodel.interactions.AbstractPotential.filename", false]], "filename() (harmonicbondedpotential method)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.filename", false]], "filename() (nullpotential method)": [[8, "arbdmodel.interactions.NullPotential.filename", false]], "filename() (wlcskpotential method)": [[8, "arbdmodel.interactions.WLCSKPotential.filename", false]], "fill_nans() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.fill_nans", false]], "find_shape_based_sites() (in module arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.find_shape_based_sites", false]], "fjcbeadsfrompolymer (class in arbdmodel.fjc_polymer_model)": [[9, "arbdmodel.fjc_polymer_model.FjcBeadsFromPolymer", false]], "fjcmodel (class in arbdmodel.fjc_polymer_model)": [[9, "arbdmodel.fjc_polymer_model.FjcModel", false]], "gaussian_kernel() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.gaussian_kernel", false]], "generate_beads() (polymermodel method)": [[15, "arbdmodel.polymer.PolymerModel.generate_beads", false]], "get_center() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.get_center", false]], "get_center() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.get_center", false]], "get_cg_distribution() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.get_cg_distribution", false]], "get_connected_location() (location method)": [[15, "arbdmodel.polymer.Location.get_connected_location", false]], "get_connections() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.get_connections", false]], "get_connections_and_locations() (connectableelement method)": [[15, "arbdmodel.polymer.ConnectableElement.get_connections_and_locations", false]], "get_contour_sorted_connections_and_locations() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.get_contour_sorted_connections_and_locations", false]], "get_location_at() (connectableelement method)": [[15, "arbdmodel.polymer.ConnectableElement.get_location_at", false]], "get_locations() (connectableelement method)": [[15, "arbdmodel.polymer.ConnectableElement.get_locations", false]], "get_monomer_index() (location method)": [[15, "arbdmodel.polymer.Location.get_monomer_index", false]], "get_particle_assignments() (in module arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.get_particle_assignments", false]], "get_slice_enclosing_smaller_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.get_slice_enclosing_smaller_grid", false]], "get_target_distribution() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.get_target_distribution", false]], "get_values() (degreeoffreedom method)": [[6, "arbdmodel.ibi.DegreeOfFreedom.get_values", false]], "get_values() (pairdistributiondof method)": [[6, "arbdmodel.ibi.PairDistributionDof.get_values", false]], "get_version() (in module arbdmodel.version)": [[35, "arbdmodel.version.get_version", false]], "halfharmonic (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HalfHarmonic", false]], "harmonicangle (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicAngle", false]], "harmonicbond (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicBond", false]], "harmonicbondedpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicBondedPotential", false]], "harmonicdihedral (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicDihedral", false]], "harmonicvectorangle (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicVectorAngle", false]], "hpsbeads (class in arbdmodel.hps_polymer_model)": [[10, "arbdmodel.hps_polymer_model.HpsBeads", false]], "hpsmodel (class in arbdmodel.hps_polymer_model)": [[10, "arbdmodel.hps_polymer_model.HpsModel", false]], "hpsnonbonded (class in arbdmodel.hps_polymer_model)": [[10, "arbdmodel.hps_polymer_model.HpsNonbonded", false]], "ibiangle (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBIAngle", false]], "ibibond (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBIBond", false]], "ibidihedral (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBIDihedral", false]], "ibinonbonded (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBINonbonded", false]], "insert_monomers() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.insert_monomers", false]], "is_dirty() (in module arbdmodel.version)": [[35, "arbdmodel.version.is_dirty", false]], "isotropic_kernel() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.isotropic_kernel", false]], "iterate_connections_and_locations() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.iterate_connections_and_locations", false]], "khbeads (class in arbdmodel.kh_polymer_model)": [[12, "arbdmodel.kh_polymer_model.KhBeads", false]], "khmodel (class in arbdmodel.kh_polymer_model)": [[12, "arbdmodel.kh_polymer_model.KhModel", false]], "khnonbonded (class in arbdmodel.kh_polymer_model)": [[12, "arbdmodel.kh_polymer_model.KhNonbonded", false]], "kscale (harmonicangle property)": [[8, "arbdmodel.interactions.HarmonicAngle.kscale", false]], "kscale (harmonicbond property)": [[8, "arbdmodel.interactions.HarmonicBond.kscale", false]], "kscale (harmonicbondedpotential property)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.kscale", false]], "kscale (harmonicdihedral property)": [[8, "arbdmodel.interactions.HarmonicDihedral.kscale", false]], "kscale (harmonicvectorangle property)": [[8, "arbdmodel.interactions.HarmonicVectorAngle.kscale", false]], "lennardjones (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.LennardJones", false]], "location (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.Location", false]], "minimizermsd() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.minimizeRmsd", false]], "module": [[6, "module-arbdmodel.ibi", false], [8, "module-arbdmodel.interactions", false], [9, "module-arbdmodel.fjc_polymer_model", false], [10, "module-arbdmodel.hps_polymer_model", false], [12, "module-arbdmodel.kh_polymer_model", false], [13, "module-arbdmodel.mpipi_polymer", false], [14, "module-arbdmodel.onck_polymer_model", false], [15, "module-arbdmodel.polymer", false], [17, "module-arbdmodel.ssdna_two_bead", false], [26, "module-arbdmodel.shape_cg", false], [31, "module-arbdmodel.coords", false], [32, "module-arbdmodel.grid", false], [34, "module-arbdmodel.logger", false], [35, "module-arbdmodel.version", false]], "monomer_index_to_contour() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.monomer_index_to_contour", false]], "monomers_per_bead_group (polymerbeads property)": [[15, "arbdmodel.polymer.PolymerBeads.monomers_per_bead_group", false]], "mpipibeads (class in arbdmodel.mpipi_polymer)": [[13, "arbdmodel.mpipi_polymer.MpipiBeads", false]], "mpipimodel (class in arbdmodel.mpipi_polymer)": [[13, "arbdmodel.mpipi_polymer.MpipiModel", false]], "mpipinonbonded (class in arbdmodel.mpipi_polymer)": [[13, "arbdmodel.mpipi_polymer.MpipiNonbonded", false]], "neighborhood_average() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.neighborhood_average", false]], "nt (dnastrandbeads attribute)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads.nt", false]], "nullpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.NullPotential", false]], "num_bead_groups (polymerbeads property)": [[15, "arbdmodel.polymer.PolymerBeads.num_bead_groups", false]], "onckbeads (class in arbdmodel.onck_polymer_model)": [[14, "arbdmodel.onck_polymer_model.OnckBeads", false]], "onckmodel (class in arbdmodel.onck_polymer_model)": [[14, "arbdmodel.onck_polymer_model.OnckModel", false]], "oncknonbonded (class in arbdmodel.onck_polymer_model)": [[14, "arbdmodel.onck_polymer_model.OnckNonbonded", false]], "other() (connection method)": [[15, "arbdmodel.polymer.Connection.other", false]], "p (dnastrandbeads attribute)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads.p", false]], "pairdistributiondof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.PairDistributionDof", false]], "periodic (abstractpotential property)": [[8, "arbdmodel.interactions.AbstractPotential.periodic", false]], "periodic (harmonicdihedral property)": [[8, "arbdmodel.interactions.HarmonicDihedral.periodic", false]], "periodic (ibidihedral property)": [[6, "arbdmodel.ibi.IBIDihedral.periodic", false]], "polymerbeads (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerBeads", false]], "polymergroup (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerGroup", false]], "polymermodel (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerModel", false]], "polymersection (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerSection", false]], "potential() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.potential", false]], "potential() (abstractpotential method)": [[8, "arbdmodel.interactions.AbstractPotential.potential", false]], "potential() (halfharmonic method)": [[8, "arbdmodel.interactions.HalfHarmonic.potential", false]], "potential() (harmonicbond method)": [[8, "arbdmodel.interactions.HarmonicBond.potential", false]], "potential() (harmonicbondedpotential method)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.potential", false]], "potential() (hpsnonbonded method)": [[10, "arbdmodel.hps_polymer_model.HpsNonbonded.potential", false]], "potential() (khnonbonded method)": [[12, "arbdmodel.kh_polymer_model.KhNonbonded.potential", false]], "potential() (lennardjones method)": [[8, "arbdmodel.interactions.LennardJones.potential", false]], "potential() (mpipinonbonded method)": [[13, "arbdmodel.mpipi_polymer.MpipiNonbonded.potential", false]], "potential() (nullpotential method)": [[8, "arbdmodel.interactions.NullPotential.potential", false]], "potential() (oncknonbonded method)": [[14, "arbdmodel.onck_polymer_model.OnckNonbonded.potential", false]], "potential() (tabulatednonbonded method)": [[8, "arbdmodel.interactions.TabulatedNonbonded.potential", false]], "potential() (wlcskangle method)": [[8, "arbdmodel.interactions.WLCSKAngle.potential", false]], "potential() (wlcskbond method)": [[8, "arbdmodel.interactions.WLCSKBond.potential", false]], "quaternion_exp() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_exp", false]], "quaternion_from_matrix() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_from_matrix", false]], "quaternion_inverse() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_inverse", false]], "quaternion_product() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_product", false]], "quaternion_slerp() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_slerp", false]], "quaternion_to_matrix() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_to_matrix", false]], "radiusdof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.RadiusDof", false]], "range_ (abstractpotential property)": [[8, "arbdmodel.interactions.AbstractPotential.range_", false]], "read_arbd_coordinates() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.read_arbd_coordinates", false]], "read_average_arbd_coordinates() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.read_average_arbd_coordinates", false]], "read_cg_potential() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.read_cg_potential", false]], "read_release_version() (in module arbdmodel.version)": [[35, "arbdmodel.version.read_release_version", false]], "read_version_file() (in module arbdmodel.version)": [[35, "arbdmodel.version.read_version_file", false]], "readarbdcoords() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.readArbdCoords", false]], "readavgarbdcoords() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.readAvgArbdCoords", false]], "remove_monomers() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.remove_monomers", false]], "replace_false_with_distance() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.replace_false_with_distance", false]], "rotate() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.rotate", false]], "rotate() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.rotate", false]], "rotationaboutaxis() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.rotationAboutAxis", false]], "set_connection() (location method)": [[15, "arbdmodel.polymer.Location.set_connection", false]], "set_damping_coefficient() (fjcmodel method)": [[9, "arbdmodel.fjc_polymer_model.FjcModel.set_damping_coefficient", false]], "set_damping_coefficient() (hpsmodel method)": [[10, "arbdmodel.hps_polymer_model.HpsModel.set_damping_coefficient", false]], "set_damping_coefficient() (khmodel method)": [[12, "arbdmodel.kh_polymer_model.KhModel.set_damping_coefficient", false]], "set_damping_coefficient() (mpipimodel method)": [[13, "arbdmodel.mpipi_polymer.MpipiModel.set_damping_coefficient", false]], "set_damping_coefficient() (onckmodel method)": [[14, "arbdmodel.onck_polymer_model.OnckModel.set_damping_coefficient", false]], "set_orientation_splines() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.set_orientation_splines", false]], "set_splines() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.set_splines", false]], "slab_potential_z() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.slab_potential_z", false]], "spherical_confinement() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.spherical_confinement", false]], "spring_constant (hpsmodel attribute)": [[10, "arbdmodel.hps_polymer_model.HpsModel.spring_constant", false]], "spring_constant (khmodel attribute)": [[12, "arbdmodel.kh_polymer_model.KhModel.spring_constant", false]], "spring_constant (mpipimodel attribute)": [[13, "arbdmodel.mpipi_polymer.MpipiModel.spring_constant", false]], "tabulatednonbonded (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.TabulatedNonbonded", false]], "test_average_grids() (testaveragegrids method)": [[32, "arbdmodel.grid.TestAverageGrids.test_average_grids", false]], "testaveragegrids (class in arbdmodel.grid)": [[32, "arbdmodel.grid.TestAverageGrids", false]], "translate() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.translate", false]], "translate() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.translate", false]], "type_ (harmonicangle property)": [[8, "arbdmodel.interactions.HarmonicAngle.type_", false]], "type_ (harmonicbond property)": [[8, "arbdmodel.interactions.HarmonicBond.type_", false]], "type_ (harmonicbondedpotential property)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.type_", false]], "type_ (harmonicdihedral property)": [[8, "arbdmodel.interactions.HarmonicDihedral.type_", false]], "type_ (harmonicvectorangle property)": [[8, "arbdmodel.interactions.HarmonicVectorAngle.type_", false]], "type_ (wlcskangle property)": [[8, "arbdmodel.interactions.WLCSKAngle.type_", false]], "type_ (wlcskbond property)": [[8, "arbdmodel.interactions.WLCSKBond.type_", false]], "unit_quat_conversions() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.unit_quat_conversions", false]], "update() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.update", false]], "update_splines() (polymermodel method)": [[15, "arbdmodel.polymer.PolymerModel.update_splines", false]], "vmd_cylinder_tcl() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.vmd_cylinder_tcl", false]], "vmd_tube_tcl() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.vmd_tube_tcl", false]], "wlcskangle (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.WLCSKAngle", false]], "wlcskbond (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.WLCSKBond", false]], "wlcskpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.WLCSKPotential", false]], "wrap_vector() (degreeoffreedom method)": [[6, "arbdmodel.ibi.DegreeOfFreedom.wrap_vector", false]], "write_cg_potential() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.write_cg_potential", false]], "write_file() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.write_file", false]], "write_file() (abstractpotential method)": [[8, "arbdmodel.interactions.AbstractPotential.write_file", false]], "write_file() (ibinonbonded method)": [[6, "arbdmodel.ibi.IBINonbonded.write_file", false]], "write_file() (tabulatednonbonded method)": [[8, "arbdmodel.interactions.TabulatedNonbonded.write_file", false]], "write_release_version() (in module arbdmodel.version)": [[35, "arbdmodel.version.write_release_version", false]], "writedx() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.writeDx", false]]}, "objects": {"arbdmodel": [[31, 0, 0, "-", "coords"], [9, 0, 0, "-", "fjc_polymer_model"], [32, 0, 0, "-", "grid"], [10, 0, 0, "-", "hps_polymer_model"], [6, 0, 0, "-", "ibi"], [8, 0, 0, "-", "interactions"], [12, 0, 0, "-", "kh_polymer_model"], [34, 0, 0, "-", "logger"], [13, 0, 0, "-", "mpipi_polymer"], [14, 0, 0, "-", "onck_polymer_model"], [15, 0, 0, "-", "polymer"], [26, 0, 0, "-", "shape_cg"], [17, 0, 0, "-", "ssdna_two_bead"], [35, 0, 0, "-", "version"]], "arbdmodel.coords": [[31, 1, 1, "", "minimizeRmsd"], [31, 1, 1, "", "quaternion_exp"], [31, 1, 1, "", "quaternion_from_matrix"], [31, 1, 1, "", "quaternion_inverse"], [31, 1, 1, "", "quaternion_product"], [31, 1, 1, "", "quaternion_slerp"], [31, 1, 1, "", "quaternion_to_matrix"], [31, 1, 1, "", "readArbdCoords"], [31, 1, 1, "", "readAvgArbdCoords"], [31, 1, 1, "", "read_arbd_coordinates"], [31, 1, 1, "", "read_average_arbd_coordinates"], [31, 1, 1, "", "rotationAboutAxis"], [31, 1, 1, "", "unit_quat_conversions"]], "arbdmodel.fjc_polymer_model": [[9, 2, 1, "", "FjcBeadsFromPolymer"], [9, 2, 1, "", "FjcModel"]], "arbdmodel.fjc_polymer_model.FjcModel": [[9, 3, 1, "", "set_damping_coefficient"]], "arbdmodel.grid": [[32, 2, 1, "", "TestAverageGrids"], [32, 1, 1, "", "add_smaller_grid"], [32, 1, 1, "", "average_grids"], [32, 1, 1, "", "constant_force"], [32, 1, 1, "", "convolve_kernel_truncate"], [32, 1, 1, "", "create_bounding_grid"], [32, 1, 1, "", "fill_nans"], [32, 1, 1, "", "gaussian_kernel"], [32, 1, 1, "", "get_slice_enclosing_smaller_grid"], [32, 1, 1, "", "isotropic_kernel"], [32, 1, 1, "", "neighborhood_average"], [32, 1, 1, "", "replace_false_with_distance"], [32, 1, 1, "", "slab_potential_z"], [32, 1, 1, "", "spherical_confinement"], [32, 1, 1, "", "writeDx"]], "arbdmodel.grid.TestAverageGrids": [[32, 3, 1, "", "test_average_grids"]], "arbdmodel.hps_polymer_model": [[10, 2, 1, "", "HpsBeads"], [10, 2, 1, "", "HpsModel"], [10, 2, 1, "", "HpsNonbonded"]], "arbdmodel.hps_polymer_model.HpsModel": [[10, 3, 1, "", "set_damping_coefficient"], [10, 4, 1, "", "spring_constant"]], "arbdmodel.hps_polymer_model.HpsNonbonded": [[10, 3, 1, "", "potential"]], "arbdmodel.ibi": [[6, 2, 1, "", "AbstractIBIpotential"], [6, 2, 1, "", "AngleDof"], [6, 2, 1, "", "BondAngleDof"], [6, 2, 1, "", "BondDof"], [6, 2, 1, "", "DegreeOfFreedom"], [6, 2, 1, "", "DihedralDof"], [6, 2, 1, "", "IBIAngle"], [6, 2, 1, "", "IBIBond"], [6, 2, 1, "", "IBIDihedral"], [6, 2, 1, "", "IBINonbonded"], [6, 2, 1, "", "PairDistributionDof"], [6, 2, 1, "", "RadiusDof"]], "arbdmodel.ibi.AbstractIBIpotential": [[6, 3, 1, "", "filename"], [6, 3, 1, "", "get_cg_distribution"], [6, 3, 1, "", "get_target_distribution"], [6, 3, 1, "", "potential"], [6, 3, 1, "", "read_cg_potential"], [6, 3, 1, "", "write_cg_potential"], [6, 3, 1, "", "write_file"]], "arbdmodel.ibi.AngleDof": [[6, 3, 1, "", "compute_volume"]], "arbdmodel.ibi.BondDof": [[6, 3, 1, "", "compute_volume"]], "arbdmodel.ibi.DegreeOfFreedom": [[6, 3, 1, "", "compute_volume"], [6, 3, 1, "", "get_values"], [6, 3, 1, "", "wrap_vector"]], "arbdmodel.ibi.IBIDihedral": [[6, 5, 1, "", "periodic"]], "arbdmodel.ibi.IBINonbonded": [[6, 3, 1, "", "write_file"]], "arbdmodel.ibi.PairDistributionDof": [[6, 3, 1, "", "compute_volume"], [6, 3, 1, "", "get_values"]], "arbdmodel.ibi.RadiusDof": [[6, 3, 1, "", "compute_volume"]], "arbdmodel.interactions": [[8, 2, 1, "", "AbstractPotential"], [8, 2, 1, "", "HalfHarmonic"], [8, 2, 1, "", "HarmonicAngle"], [8, 2, 1, "", "HarmonicBond"], [8, 2, 1, "", "HarmonicBondedPotential"], [8, 2, 1, "", "HarmonicDihedral"], [8, 2, 1, "", "HarmonicVectorAngle"], [8, 2, 1, "", "LennardJones"], [8, 2, 1, "", "NullPotential"], [8, 2, 1, "", "TabulatedNonbonded"], [8, 2, 1, "", "WLCSKAngle"], [8, 2, 1, "", "WLCSKBond"], [8, 2, 1, "", "WLCSKPotential"]], "arbdmodel.interactions.AbstractPotential": [[8, 3, 1, "", "filename"], [8, 5, 1, "", "periodic"], [8, 3, 1, "", "potential"], [8, 5, 1, "", "range_"], [8, 3, 1, "", "write_file"]], "arbdmodel.interactions.HalfHarmonic": [[8, 3, 1, "", "potential"]], "arbdmodel.interactions.HarmonicAngle": [[8, 5, 1, "", "kscale"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicBond": [[8, 5, 1, "", "kscale"], [8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicBondedPotential": [[8, 3, 1, "", "filename"], [8, 5, 1, "", "kscale"], [8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicDihedral": [[8, 5, 1, "", "kscale"], [8, 5, 1, "", "periodic"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicVectorAngle": [[8, 5, 1, "", "kscale"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.LennardJones": [[8, 3, 1, "", "potential"]], "arbdmodel.interactions.NullPotential": [[8, 3, 1, "", "filename"], [8, 3, 1, "", "potential"]], "arbdmodel.interactions.TabulatedNonbonded": [[8, 3, 1, "", "potential"], [8, 3, 1, "", "write_file"]], "arbdmodel.interactions.WLCSKAngle": [[8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.WLCSKBond": [[8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.WLCSKPotential": [[8, 3, 1, "", "filename"]], "arbdmodel.kh_polymer_model": [[12, 2, 1, "", "KhBeads"], [12, 2, 1, "", "KhModel"], [12, 2, 1, "", "KhNonbonded"]], "arbdmodel.kh_polymer_model.KhModel": [[12, 3, 1, "", "set_damping_coefficient"], [12, 4, 1, "", "spring_constant"]], "arbdmodel.kh_polymer_model.KhNonbonded": [[12, 3, 1, "", "potential"]], "arbdmodel.mpipi_polymer": [[13, 2, 1, "", "MpipiBeads"], [13, 2, 1, "", "MpipiModel"], [13, 2, 1, "", "MpipiNonbonded"]], "arbdmodel.mpipi_polymer.MpipiModel": [[13, 3, 1, "", "set_damping_coefficient"], [13, 4, 1, "", "spring_constant"]], "arbdmodel.mpipi_polymer.MpipiNonbonded": [[13, 3, 1, "", "potential"]], "arbdmodel.onck_polymer_model": [[14, 2, 1, "", "OnckBeads"], [14, 2, 1, "", "OnckModel"], [14, 2, 1, "", "OnckNonbonded"]], "arbdmodel.onck_polymer_model.OnckModel": [[14, 3, 1, "", "set_damping_coefficient"]], "arbdmodel.onck_polymer_model.OnckNonbonded": [[14, 3, 1, "", "potential"]], "arbdmodel.polymer": [[15, 2, 1, "", "ConnectableElement"], [15, 2, 1, "", "Connection"], [15, 2, 1, "", "Location"], [15, 2, 1, "", "PolymerBeads"], [15, 2, 1, "", "PolymerGroup"], [15, 2, 1, "", "PolymerModel"], [15, 2, 1, "", "PolymerSection"]], "arbdmodel.polymer.ConnectableElement": [[15, 3, 1, "", "get_connections_and_locations"], [15, 3, 1, "", "get_location_at"], [15, 3, 1, "", "get_locations"]], "arbdmodel.polymer.Connection": [[15, 3, 1, "", "delete"], [15, 3, 1, "", "other"]], "arbdmodel.polymer.Location": [[15, 3, 1, "", "get_connected_location"], [15, 3, 1, "", "get_monomer_index"], [15, 3, 1, "", "set_connection"]], "arbdmodel.polymer.PolymerBeads": [[15, 5, 1, "", "monomers_per_bead_group"], [15, 5, 1, "", "num_bead_groups"]], "arbdmodel.polymer.PolymerGroup": [[15, 3, 1, "", "add_grid_potential"], [15, 3, 1, "", "dimensions_from_structure"], [15, 3, 1, "", "extend"], [15, 3, 1, "", "get_center"], [15, 3, 1, "", "get_connections"], [15, 3, 1, "", "rotate"], [15, 3, 1, "", "translate"], [15, 3, 1, "", "update"], [15, 3, 1, "", "vmd_cylinder_tcl"], [15, 3, 1, "", "vmd_tube_tcl"]], "arbdmodel.polymer.PolymerModel": [[15, 3, 1, "", "generate_beads"], [15, 3, 1, "", "update_splines"]], "arbdmodel.polymer.PolymerSection": [[15, 3, 1, "", "add_location"], [15, 3, 1, "", "contour_to_monomer_index"], [15, 3, 1, "", "contour_to_orientation"], [15, 3, 1, "", "contour_to_position"], [15, 3, 1, "", "contour_to_tangent"], [15, 3, 1, "", "get_center"], [15, 3, 1, "", "get_contour_sorted_connections_and_locations"], [15, 3, 1, "", "insert_monomers"], [15, 3, 1, "", "iterate_connections_and_locations"], [15, 3, 1, "", "monomer_index_to_contour"], [15, 3, 1, "", "remove_monomers"], [15, 3, 1, "", "rotate"], [15, 3, 1, "", "set_orientation_splines"], [15, 3, 1, "", "set_splines"], [15, 3, 1, "", "translate"]], "arbdmodel.shape_cg": [[26, 1, 1, "", "find_shape_based_sites"], [26, 1, 1, "", "get_particle_assignments"]], "arbdmodel.ssdna_two_bead": [[17, 2, 1, "", "DnaModel"], [17, 2, 1, "", "DnaStrandBeads"]], "arbdmodel.ssdna_two_bead.DnaStrandBeads": [[17, 4, 1, "", "b"], [17, 4, 1, "", "nt"], [17, 4, 1, "", "p"]], "arbdmodel.version": [[35, 2, 1, "", "Citation"], [35, 1, 1, "", "call_git_describe"], [35, 1, 1, "", "check_git_repository"], [35, 1, 1, "", "get_version"], [35, 1, 1, "", "is_dirty"], [35, 1, 1, "", "read_release_version"], [35, 1, 1, "", "read_version_file"], [35, 1, 1, "", "write_release_version"]], "arbdmodel.version.Citation": [[35, 3, 1, "", "display"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property"}, "terms": {"": [0, 15, 37, 38, 39, 40], "0": [6, 8, 10, 12, 13, 14, 31, 32, 37, 38, 39, 40], "0006022142": 39, "01": 39, "012": 39, "014393265": 38, "0173": 37, "02": [6, 39], "0215724": 40, "025": 39, "0375960171901290": 37, "03d": 39, "075531386": 40, "1": [6, 8, 9, 10, 12, 13, 14, 15, 31, 32, 38, 40], "10": [8, 10, 12, 13, 14, 32, 37, 38, 39, 40], "100": [14, 37, 39], "1000": 39, "1005941": 39, "1016": 40, "1021": 38, "102e": 37, "104264": 40, "10491996": 40, "1063": 8, "1098": 37, "10e": 39, "10pn": 38, "119": 37, "12": [14, 32], "1234": 26, "12f": 32, "13511100": 40, "1371": 39, "14": 32, "143932": 37, "1452": 40, "1453": 40, "1454": 40, "15": 39, "153": 40, "16": 32, "161": 40, "1627": [39, 40], "1628": [39, 40], "1629": [39, 40], "1631": [39, 40], "1632": [39, 40], "1673": [39, 40], "1674": [39, 40], "1676": [39, 40], "1678": [39, 40], "1679": [39, 40], "177": 37, "18": 32, "180": [6, 39], "189": 40, "18923208": 40, "19": 13, "19375322": 40, "1938": 37, "196": 40, "199": 40, "1bpa": 14, "1d": 38, "1e": 39, "1e2": [37, 38], "1e3": [37, 38, 39, 40], "1e4": [38, 39], "1e5": [37, 38, 40], "1e6": 39, "1e7": 39, "1eyg": 40, "1nm": 39, "2": [6, 10, 12, 32, 38, 40], "20": [6, 26, 37, 38, 39, 40], "2022": 40, "209": 40, "20e": [37, 40], "20th": 39, "25": 9, "250": 39, "261090254": 40, "273": 37, "295": [6, 8], "298": 39, "3": [10, 12, 13, 14, 31, 32, 38, 40], "30": 6, "3000": 40, "3027": 40, "3096": 40, "345": 37, "35": 6, "3547": 40, "38": 14, "39": 37, "3900574": [10, 12], "3d": [38, 40], "4": [6, 32, 38, 40], "40": [9, 37], "41": 37, "41410648823": 40, "422562": 14, "43": 39, "44": 39, "45": 39, "46": 39, "47": 39, "48856": 40, "4968020": 8, "5": [8, 15, 31, 32, 38, 40], "50": [6, 38, 39], "500": [39, 40], "5000": 37, "50000": 39, "55": 39, "578277": 40, "6": [32, 38, 39, 40], "60": 37, "620": 37, "6241949": 39, "6400": 37, "65": [37, 38, 39], "68320292": 40, "69": 37, "7": [13, 14, 32, 35, 38], "70": 38, "72621629": 40, "735": 40, "75": 39, "757": 40, "779": 40, "8": [10, 12, 13, 14, 32, 38, 39, 40], "80": 39, "831447": 39, "9": [6, 9, 32, 39, 40], "90": 39, "95": [13, 37], "A": [0, 15, 32, 34, 38, 40], "And": 38, "As": [38, 39, 40], "But": 40, "For": [0, 36, 37, 38, 39, 40], "If": [0, 32, 38], "In": [37, 38, 39, 40], "It": [0, 32, 36, 38, 39], "No": [37, 38, 39], "On": 0, "One": [38, 40], "Or": 39, "That": 38, "The": [0, 32, 37, 38, 39, 40], "Their": 40, "There": 34, "These": [0, 38, 39, 40], "To": [0, 34, 36], "_": 39, "__dict__": 38, "__init__": [39, 40], "_add_nonbonded_interact": 39, "_b": 40, "_beads_per_polym": 39, "_convers": 39, "_fine_to_coars": 39, "_g": 38, "_generalized_charg": 40, "_generate_ith_bead_group": 39, "_generate_polymer_bead": 39, "_get_binari": [39, 40], "_join_adjacent_bead_group": 39, "_learn_fn": 39, "_p": 40, "_pmf_grid": 40, "_potenti": 40, "_pre": 39, "_seq": 39, "_type": 39, "_updateparticleord": 40, "aa": [37, 38, 39], "abbrev": 35, "abil": 36, "abl": 38, "about": [15, 38], "abov": [34, 38], "absolut": 39, "abstract": [8, 15], "abstractibipotenti": 6, "abstractli": 38, "abstractpotenti": [6, 8, 10, 12, 13, 14, 37, 38], "ac": 38, "accept": [0, 32], "access": 40, "accord": 40, "accur": 36, "acid": [38, 39], "act": 40, "actual": [0, 40], "ad": [0, 38, 39], "adapt": 40, "add": [39, 40], "add_angl": 39, "add_ball_and_stick": [37, 38], "add_bond": [37, 39], "add_exclus": 39, "add_grid_potenti": [15, 38], "add_group_sit": 38, "add_loc": 15, "add_nonbonded_interact": [37, 38, 39], "add_restraint": [38, 39, 40], "add_smaller_grid": 32, "addit": 40, "address": 0, "adjac": 39, "adjust": [38, 39], "adna": 38, "advantag": 40, "affin": 40, "after": [37, 38], "ag": 39, "agg": 39, "agnost": 38, "aip": 8, "al": [38, 39], "alanin": 38, "algorithm": [37, 39], "all": [0, 15, 32, 37, 38, 39, 40], "all_lin": 39, "all_target": 39, "all_typ": 39, "alloc": 39, "allow": [0, 39, 40], "along": [32, 38, 39, 40], "alpha": 39, "alreadi": [0, 40], "alreadli": 38, "also": [0, 37, 38, 39, 40], "altern": 0, "amazon": 0, "ambigu": 0, "amino": [38, 39], "amino_acids_per_bead_group": 39, "an": [0, 15, 32, 34, 37, 39, 40], "analysi": 39, "analysisfromfunct": 39, "analyz": [0, 40], "angl": [6, 31, 38, 39], "angledof": 6, "angstrom": [37, 38, 39], "ani": [0, 32, 34, 38, 39, 40], "anim": 39, "anoth": [0, 40], "anyth": 39, "appar": 40, "append": [39, 40], "appli": [0, 37, 38, 39, 40], "applic": [0, 34], "appreci": 0, "approv": 0, "approxim": 40, "apro": 38, "ar": [0, 15, 32, 34, 37, 38, 39, 40], "arang": [38, 39], "arbd": [5, 38, 39, 40], "arbdengin": [37, 38, 39, 40], "arbdmodel": [1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 31, 32, 33, 34, 35, 38, 39, 40, 41], "arbitrari": 34, "arbmodel": 39, "area": 34, "arg": [8, 31, 38], "argon": 37, "argument": [32, 39], "around": 40, "arrai": [32, 37, 38, 39, 40], "articl": 37, "asciinema": 0, "assert": [38, 39], "assertionerror": 32, "assign": [10, 12, 13, 39], "assign_ibi_degrees_of_freedom": 39, "associ": [38, 39], "assum": [32, 37], "at_monom": 15, "atom": [37, 38, 39, 40], "atom_group": 39, "atomindex": 38, "atomist": 40, "attach": 38, "attach_particl": 40, "attached_particl": 40, "attribut": [38, 40], "author": 35, "auto": 0, "autom": 40, "automat": [0, 39], "autoreload": 38, "avail": 37, "averag": 32, "average_grid": 32, "averaged_grid": 32, "avoid": 39, "awar": 38, "awkard": 39, "ax": [38, 39], "ax1": 39, "ax2": 39, "axi": [31, 38, 39], "b": [15, 17, 31, 38, 40], "b1": 39, "b2": 39, "b3": 39, "background": 0, "base": [0, 5, 6, 8, 9, 10, 12, 13, 14, 15, 17, 26, 32, 35, 36, 37, 38, 39, 40], "basic": [38, 39], "bbead": 40, "bd": 37, "bead": [15, 39, 40], "bead_mass": 39, "becaus": [39, 40], "been": [37, 40], "befor": [37, 38], "beforehand": 40, "behav": 40, "being": 38, "belong": 40, "below": [0, 37, 39, 40], "bent": 40, "besid": 40, "best": 39, "better": [0, 38, 39], "between": [6, 15, 32, 38, 39, 40], "big": 40, "bigger": 32, "bin": 6, "bin_aa": 39, "bin_cg": 39, "binari": [30, 33, 39, 40], "binary_manag": 33, "biolog": 40, "biomolecular": 36, "bit": [38, 39, 40], "blit": 39, "bodi": 36, "boltzmann": [36, 39, 40], "bond": [6, 38, 39, 40], "bond_ub": 39, "bondangledof": 6, "bonddof": 6, "bonded_ibi_potenti": 39, "bool": 32, "boolean": 32, "boolean_grid": 32, "both": [39, 40], "bottom": 0, "bound": 40, "boundari": 32, "box": 6, "bpro": 38, "bradlei": 39, "branch": [0, 38], "break": [0, 39, 40], "brownian": 37, "browser": [0, 37], "buck": 37, "buckinghampotenti": 37, "build": [38, 39], "built": [0, 15, 38], "c": [38, 39, 40], "cach": 40, "calcul": [6, 39], "call": [37, 38, 39, 40], "call_git_describ": 35, "callabl": 32, "can": [0, 34, 37, 38, 39, 40], "cannot": 40, "cartesian": [37, 38], "case": [37, 38], "caskroom": [39, 40], "cater": 34, "caus": 38, "caution": 37, "caveat": 40, "cd": 0, "cell": [37, 38, 39, 40], "center": [32, 38, 39, 40], "certain": 37, "cg": 39, "cg_coordin": 39, "cg_model": 39, "cg_u": 39, "chain": [36, 38, 39], "chainid": 39, "chang": [0, 37, 38, 40], "channel": 34, "charg": 40, "charge_grid": 40, "chat": 0, "check": [0, 36, 38, 39, 40], "check_git_repositori": 35, "children": [37, 38, 39, 40], "choos": 0, "chr": 39, "ci": 0, "citat": 35, "class": [4, 6, 8, 9, 10, 12, 13, 14, 15, 17, 26, 32, 34, 35, 37, 38, 39], "clean_edg": 6, "clear": [37, 38], "clear_represent": [37, 38], "close": [0, 40], "cluster": 40, "cmaffeo2": 40, "coars": [25, 26, 36], "coarse_model": 39, "coarse_sit": 26, "coarsen": 39, "coat": 40, "code": [0, 40], "coeffici": [38, 39, 40], "col": 39, "collis": 39, "color": 39, "color_schem": 38, "column": 39, "com": [0, 37, 39], "combin": [0, 38, 39], "combined_model": 38, "come": 37, "command": [0, 37, 38, 40], "common": 0, "complet": 0, "complex": 40, "complic": [38, 39], "compon": [2, 7, 11, 18, 25, 28, 33], "composit": 39, "comprehens": 36, "compress": 39, "comput": [32, 38, 39, 40], "compute_volum": 6, "concret": 6, "condit": 32, "conf_param": [39, 40], "configur": [2, 4, 39, 40], "confin": 40, "connect": [15, 38, 39, 40], "connectableel": 15, "connection_loc": 15, "connection_typ": 15, "consecut": 39, "consid": [0, 32, 39, 40], "consist": [39, 40], "const_force_1pn_z": 38, "constant": 40, "constant_forc": [32, 38], "constantli": 40, "constrained_layout": 39, "construct": [32, 38, 40], "constructor": 37, "contain": [32, 38, 39, 40, 41], "context": [0, 40], "continu": 0, "continuum": 38, "contour": 15, "contour_filt": 15, "contour_po": 15, "contour_posit": 15, "contour_to_monomer_index": 15, "contour_to_orient": 15, "contour_to_posit": 15, "contour_to_tang": 15, "convei": 0, "conveni": [37, 40], "converg": 39, "convolut": 32, "convolv": 32, "convolve_kernel_trunc": 32, "cooper": 39, "coord": [15, 33, 38, 39, 40], "coordin": [6, 37, 38, 39, 40], "coordsa": 31, "coordsb": 31, "copi": [15, 40], "core": 5, "core_object": 2, "corner": 38, "correct_geometri": 8, "correctli": 38, "correspond": [32, 40], "could": [0, 37, 38, 39], "count": 15, "cours": 37, "cover": 38, "cpro": 38, "crash": [37, 38, 40], "creat": [0, 26, 32, 36, 38, 39, 40], "create_arbd_polymer_object": 39, "create_bounding_grid": 32, "crossov": 15, "crucial": 37, "cryo": [38, 40], "csv": 34, "ct500193u": 38, "current": 32, "custom": [36, 38], "custom_properti": 37, "cut": 0, "cutoff": [32, 39], "cylindr": 38, "d": [8, 38], "dai": 40, "dalton": [37, 39], "damp": [38, 40], "damping_coeffici": [9, 10, 12, 13, 14, 37, 39, 40], "dat": [39, 40], "data": [32, 38, 39], "dcd": [31, 37, 38, 39, 40], "debug": [9, 10, 12, 13, 14, 17, 37, 38], "debugg": 38, "debye_length": [10, 12, 13, 14, 39], "decomp_period": 39, "decomposit": 37, "decor": 40, "def": [32, 37, 38, 39, 40], "default": [32, 39], "default_binari": [39, 40], "defaultsimconf": [2, 4], "defin": [34, 39, 40], "deg": 39, "degre": [6, 39], "degreeoffreedom": 6, "degrees_of_freedom": [6, 39], "delet": 15, "delta": [32, 38], "demonstr": [0, 37], "densiti": [39, 40], "depend": [0, 38], "deploy": 0, "deprec": 37, "depth": 34, "deriv": 6, "describ": [15, 38], "detail": [0, 5, 36, 38, 40], "determin": [32, 39, 40], "develop": [0, 34, 36, 37], "dict": 39, "dictionari": 38, "differ": [0, 36, 38], "differenti": 0, "difficult": 40, "diffus": [37, 39], "dignon": [38, 39], "dihedr": [6, 39], "dihedraldof": 6, "dimens": [32, 37, 38, 39, 40], "dimensions_from_structur": 15, "direct": 39, "directli": 32, "directori": [37, 38, 39, 40], "disk": 38, "disord": [38, 40], "displai": 35, "distanc": [6, 32, 37, 39], "distinct": 38, "distribut": [39, 40], "dive": 39, "divid": 32, "dna": [36, 38], "dna_coordin": 40, "dna_model": 38, "dnamodel": [17, 38, 40], "dnastrandbead": 17, "do": [0, 32, 38, 39], "document": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 31, 32, 33, 34, 35, 37], "doe": [37, 38, 40], "doesn": 39, "dof": 6, "doi": [8, 35, 37, 38, 39, 40], "don": 40, "done": 40, "doubl": [15, 38], "down": 0, "drawcylind": 15, "drawtub": 15, "drift": 38, "dry_run": [39, 40], "dsitribut": 40, "dt": [38, 40], "dt_5": 40, "dt_70": 40, "dtype": 39, "due": 40, "dure": 40, "dx": [38, 40], "dynam": [26, 37, 40], "e": [34, 37, 38, 39, 40], "each": [15, 32, 38, 39, 40], "easi": 0, "ec": 0, "ec2": 0, "ecosystem": 0, "edg": 39, "editor": 37, "edu": [0, 40], "effect": 39, "effici": 38, "egg": [39, 40], "elec": 40, "electrostat": [10, 12, 13, 14, 40], "element": [15, 32, 38], "elif": 39, "els": [39, 40], "em": [38, 40], "email": 0, "empti": [38, 39], "enabl": [0, 37], "end": 40, "end1": 40, "end2": 40, "end_posit": [15, 40], "energi": [0, 37, 40], "engin": [5, 30, 33, 36, 37, 38, 39, 40], "engine_kwarg": 40, "engr": 0, "enjoi": 40, "enough": 38, "ensur": [0, 32], "enter": 38, "entri": [15, 40], "enumer": [38, 39, 40], "env": [39, 40], "environ": 0, "epsilon": 37, "epsilon0": 39, "equilibr": 40, "especi": 0, "et": [38, 39], "etc": [0, 38], "even": [0, 32, 39], "everi": [0, 37, 38, 39], "everyth": 39, "evolv": 37, "exactli": [32, 34], "examin": 37, "exampl": [0, 6, 32, 36, 38, 39, 40, 41], "except": [38, 39, 40], "exclud": [15, 39], "exclus": [6, 39], "exercis": 40, "exist": [0, 39, 40], "existing_repo": 0, "exp": [32, 37], "expect": 0, "experi": 38, "experiment": [38, 40], "explain": 0, "explicit": 0, "expon": 32, "expos": 40, "extend": [15, 38], "extens": [37, 38], "extern": [0, 30, 32], "extra": 39, "extract": [39, 40], "f": [38, 39, 40], "factor": [0, 40], "fals": [6, 8, 9, 10, 12, 13, 14, 15, 17, 32, 38, 39], "familiar": [37, 40], "faster": 39, "favorit": 37, "featur": [0, 37, 40], "feel": [0, 38, 40], "few": [38, 40], "fig": 39, "figsiz": 39, "file": [34, 38, 39, 40], "file_nam": 15, "filenam": [6, 8, 35], "filename_prefix": [6, 8, 39], "fill": 32, "fill_nan": 32, "fill_valu": 32, "filled_grid": 32, "final": [38, 40], "find": [15, 40], "find_boundari": 32, "find_shape_based_sit": 26, "fine_posit": 26, "fine_sit": 26, "first": [38, 39, 40], "first_fram": 31, "first_monom": 15, "fix": [38, 40], "fjc": 38, "fjc_polymer_model": [11, 38], "fjcbeadsfrompolym": 9, "fjcmodel": [9, 38], "flexibl": [36, 38], "flux": 40, "fmt": 32, "fn": 38, "fname": [31, 39, 40], "follow": [0, 37, 39], "forc": [32, 37, 39, 40], "force_const": 32, "fork": [0, 40], "form": [0, 15, 37, 40], "format": [38, 39, 40], "found": [39, 40], "four": 39, "fragment": 40, "frame": [38, 39, 40], "free": 0, "freedom": [6, 39], "freeli": 38, "frequent": [0, 40], "friction": 40, "from": [0, 6, 15, 32, 37, 38, 39, 40], "full": 8, "fun": 38, "funcanim": 39, "function": [32, 38, 39, 40], "further": 39, "futur": [0, 40], "g": [34, 37, 38, 39], "ga": 37, "gaussian": 32, "gaussian_kernel": 32, "gencharg": 40, "gener": [32, 36, 37, 39, 40], "generate_bead": [15, 38], "get": [38, 39], "get_cent": [15, 38], "get_cg_distribut": 6, "get_color": 39, "get_connect": 15, "get_connected_loc": 15, "get_connections_and_loc": 15, "get_contour_sorted_connections_and_loc": 15, "get_data": 39, "get_extens": 38, "get_loc": 15, "get_location_at": 15, "get_monomer_index": 15, "get_particle_assign": 26, "get_slice_enclosing_smaller_grid": 32, "get_target_distribut": [6, 39], "get_valu": 6, "get_vers": 35, "gif": 0, "git": 0, "gitlab": 0, "give": 40, "given": [34, 39], "glfg": 39, "glob": 39, "gnu": 34, "gnumer": 34, "go": [0, 37, 39], "goe": 40, "good": [37, 38], "gpu": [37, 38, 39, 40], "grab": 39, "gradient": 40, "grain": [25, 26, 36], "grid": [33, 38, 40], "grid1": 32, "grid2": 32, "grid_fil": 15, "grid_filenam": 38, "grid_potenti": 38, "griddataformat": 32, "group": [15, 17, 38, 39, 40], "guid": 38, "guidanc": 0, "ha": [0, 32, 38, 40], "halfharmon": 8, "handi": 0, "harmon": 38, "harmonicangl": 8, "harmonicbond": [8, 37], "harmonicbondedpotenti": 8, "harmonicdihedr": 8, "harmonicvectorangl": 8, "have": [0, 32, 34, 37, 39, 40], "help": [0, 39, 40], "henc": 37, "here": [0, 37, 39, 40], "heurist": 39, "hierarchi": 34, "high": [0, 40], "homebrew": 0, "how": [0, 34, 37, 38, 39, 40], "howev": [0, 37], "hp": [38, 39], "hps_model": 38, "hps_polymer_model": [11, 38, 39], "hpsbead": 10, "hpsmodel": [10, 38, 39], "hpsnonbond": 10, "hre": 38, "http": [0, 8, 37, 38, 39, 40], "hydrodynam": 36, "hydrophob": [36, 38, 39], "hydroproo": 40, "hyropro": 40, "i": [0, 32, 34, 36, 38, 39, 40], "i0": 39, "i1": 39, "ibi": [7, 36, 40, 41], "ibiangl": [6, 39], "ibibond": [6, 39], "ibidihedr": [6, 39], "ibinonbond": [6, 39], "ibipotenti": [6, 39], "id": 39, "idea": [0, 37, 38], "ideal": 40, "identifi": 34, "idp_arrai": 12, "ignor": [39, 40], "ij": 38, "illinoi": [0, 40], "illustr": 40, "imag": 0, "immedi": 38, "implement": [32, 38, 40], "import": [32, 37, 38, 39, 40], "importlib": 38, "improv": 0, "inadvert": 0, "includ": [0, 6, 34, 36, 37, 38], "include_ssdna": 15, "include_strand": 15, "inclus": 15, "index": [37, 38, 39, 40], "indic": [32, 34], "inertia": 40, "inf": 32, "infin": 32, "influenc": 38, "inform": [0, 37, 38], "init": 39, "init_func": 39, "initi": [39, 40], "inlin": [0, 38], "input": [32, 34], "insert_monom": 15, "insid": 37, "inspect": [38, 40], "instabl": 39, "instanc": [34, 39], "instead": [37, 38, 39], "instruct": 0, "int": [15, 32, 39], "integ": 32, "integr": 39, "interact": [5, 6, 14, 36, 38, 39, 40], "interfac": 37, "intern": 0, "interpol": 38, "interprett": 37, "invers": [36, 39], "invit": 0, "involv": 40, "ion_concentr": 39, "ipdb": [37, 38], "is_dirti": 35, "isci": 40, "iscienc": 40, "isotrop": [15, 32], "isotropic_kernel": 32, "issu": 0, "item": [38, 39, 40], "iter": [6, 32, 36, 39], "iterate_connections_and_loc": 15, "ith": 39, "its": [37, 40], "j": [37, 39, 40], "java": 34, "join": 39, "joint": 38, "jone": 40, "journal": [35, 39], "jupyt": 37, "just": [0, 39, 40], "k": [8, 37, 38, 39, 40], "k_off": 40, "kcal": [37, 38, 39, 40], "kcal_mol": [37, 38], "keep": 0, "kei": [37, 39, 40], "kernel": 32, "keyword": [37, 40], "kh": 38, "kh_model": 38, "kh_polymer_model": [11, 38], "khbead": 12, "khmodel": [12, 38], "khnonbond": 12, "know": 0, "knowledg": 37, "known": 0, "kscale": 8, "kt": [8, 40], "kubernet": 0, "kwarg": [8, 9, 10, 12, 13, 14, 15, 17, 31, 38, 39, 40], "l": [32, 38], "l1": 39, "l2": 39, "label": [38, 39], "lag": 40, "langevin": 39, "languag": 0, "larg": [37, 40], "larger": 39, "last": [6, 8, 37, 38, 39, 40], "last_fram": 31, "last_index": 39, "last_monom": 15, "later": 40, "lattic": 39, "law": 40, "learn": [37, 39], "learning_r": [6, 39], "learning_schedul": 26, "left": 38, "legend": [38, 39], "len": [37, 38, 39, 40], "length": [32, 39], "lennard": 40, "lennardjon": [8, 37], "less": [37, 40], "let": [0, 38, 40], "level": 34, "lib": [39, 40], "liber": 0, "like": [0, 32, 34, 37, 38, 39, 40], "likelihood": 0, "limit": [34, 39], "line": [0, 37, 38, 39, 40], "linear": [15, 38], "lines2": 39, "link": 0, "linspac": [37, 39, 40], "lint": 0, "linux": 37, "liquid": 37, "list": [0, 15, 32, 37, 39, 40], "littl": [38, 39, 40], "lj": 37, "ll": [0, 37, 38, 39, 40], "ln": 39, "load": [39, 40], "load_ext": 38, "load_new": 39, "loadtxt": [39, 40], "loc": 39, "local": [39, 40], "local_lin": 39, "locat": [15, 37, 40], "location_in_oth": 15, "location_in_self": 15, "log": [34, 39], "log_fil": [39, 40], "logger": 33, "long": [0, 37, 38, 40], "longer": 38, "look": 39, "loop": [39, 40], "lot": 40, "lower": 38, "lp": 8, "lw": 39, "lx": 39, "m": [0, 38, 39], "machineri": 40, "made": 38, "mai": [0, 32, 37, 39, 40], "main": [0, 40], "maintain": 0, "make": [0, 38, 40], "make_dna_model": 40, "makeareadm": 0, "makedir": [39, 40], "manag": [0, 30, 33, 39], "mani": [0, 37], "manual": 0, "manuscript": 40, "mask": 32, "mass": [37, 39, 40], "match": [32, 38, 40], "math": 37, "matplotlib": [38, 39], "max": 39, "max_dist": 26, "max_forc": [6, 8, 39], "max_iter": 32, "max_potenti": [6, 8], "maximum": 32, "md": [0, 37, 38], "mda": [37, 38, 39], "mdanalysi": [37, 38, 39], "mean": [38, 39], "meant": 40, "measur": [38, 40], "mechan": 38, "member": [0, 39], "memori": 39, "memoryread": 39, "merg": [0, 38], "mesh_process_surfac": 18, "mesh_process_volum": 18, "mesh_rigidbodi": 18, "meshgrid": 38, "mess": 40, "messag": 32, "metadata": 0, "method": [0, 40], "methodnam": 32, "mg": 39, "might": [0, 34, 38, 39], "min": [6, 39], "mind": 0, "miniconda": [39, 40], "minim": 39, "minimizermsd": 31, "minimum": 39, "mirror": 32, "mistak": 38, "ml": 39, "mm": 39, "model": [2, 5, 15, 26, 37], "model_nam": 39, "modifi": [38, 39], "modul": [1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 26, 27, 29, 30, 31, 32, 34, 35, 37, 38, 40], "modulenotfounderror": [37, 38], "mol": [37, 38, 39, 40], "molecul": 40, "molecular": [26, 36], "moment": 40, "moment_of_inertia": 40, "monom": 39, "monomer_index_to_contour": 15, "monomer_length": [15, 38, 39, 40], "monomer_po": 15, "monomers_per_bead_group": [9, 15, 38, 39], "more": [0, 38, 39], "mortem": 38, "most": [0, 37, 38, 39, 40], "move": [39, 40], "mp4": 39, "mpipi_polym": 11, "mpipibead": 13, "mpipimodel": 13, "mpipinonbond": 13, "mpl": 39, "mrdna": 38, "much": [34, 40], "multipl": [32, 36, 39, 40], "multiplebond": 38, "must": [32, 37, 39], "my_valu": 37, "myibi": 39, "myibibead": 39, "myibimodel": 39, "n": [37, 38, 39], "n_cg": 26, "n_polym": 39, "name": [6, 15, 34, 37, 38, 39, 40], "namespac": 34, "nan": 32, "nativ": 40, "natsort": 39, "natur": [34, 40], "nb": 39, "nbextens": 37, "ndarrai": 32, "ndim": 32, "nearbi": 6, "nearest": 32, "nearest_monom": 15, "necessarili": 40, "need": [0, 36, 37, 38, 39, 40], "neglect": 39, "neighbor": 32, "neighborhood": 32, "neighborhood_averag": 32, "nest": 34, "nevertheless": 37, "new": [0, 38, 40], "new_typ": 15, "next": 0, "nglview": [37, 38], "ngrid": 38, "no_ssb": 40, "nobl": 37, "non": [32, 38, 40], "nonbond": [14, 37, 39], "nonbonded_ibi_potenti": 39, "nonbonded_interact": 37, "nonbonded_learning_r": 39, "nonbonded_learning_rate0": 39, "nonbonded_learning_rate1": 39, "none": [6, 8, 9, 10, 12, 13, 14, 15, 17, 26, 31, 32, 35, 38, 39, 40], "normal": 32, "normalizeaxi": 31, "note": [0, 32, 37, 38, 39, 40], "notebook": [37, 38, 39], "notic": [38, 40], "notimplementederror": [32, 39], "novic": 0, "now": [38, 39, 40], "np": [32, 37, 38, 39, 40], "nt": [15, 17, 38, 40], "nucleotid": [15, 38], "nuget": 0, "nullpotenti": 8, "num_bead_group": 15, "num_monom": [15, 38, 39, 40], "num_particl": 37, "num_proc": [39, 40], "num_step": [26, 37, 38, 39, 40], "num_voxel": 38, "number": [32, 34, 35, 38, 39, 40], "numbond": 37, "numer": 39, "numpi": [32, 37, 38, 39, 40], "nupmodel": 39, "nv": [37, 38], "nx": 39, "nx3": 37, "ny": 39, "o": [38, 39, 40], "object": [6, 8, 15, 17, 30, 32, 35, 37, 38, 39, 41], "observ": 38, "obtain": [39, 40], "obvious": 38, "odd": [32, 40], "offer": 38, "often": 39, "on_fwd_strand": 15, "onc": 40, "onck_model": 38, "onck_polymer_model": [11, 38], "onckbead": 14, "onckmodel": [14, 38], "oncknonbond": 14, "one": [37, 38, 39, 40], "one_bead_per_r": 39, "ones": 38, "onli": [0, 32, 37, 39, 40], "open": 0, "oper": [0, 37, 40], "optim": 38, "option": [32, 36, 37, 39, 40], "order": 38, "org": [8, 37, 38, 39, 40], "organ": 34, "orient": [37, 38, 39, 40], "origin": [0, 32, 38, 39, 40], "orthonorm": 32, "other": [15, 37, 38, 39], "our": [38, 39, 40], "out": [0, 36, 40], "out_of_bounds_forc": 6, "outfil": 32, "outnam": 39, "output": [0, 32, 37, 38, 39, 40], "output_directori": [39, 40], "output_nam": [37, 38, 39, 40], "output_period": [37, 38, 39, 40], "outsid": [37, 39], "over": 39, "overlap": 32, "overrid": 37, "own": [0, 39, 40], "owner": 0, "p": [17, 38, 39, 40], "p_p": 39, "p_type": 39, "packag": [2, 7, 11, 18, 25, 28, 32, 33, 34, 36, 38, 39, 40, 41], "pad": 32, "padding_factor": 15, "page": 35, "pair": [6, 37, 40], "pairdistributiondof": 6, "pairlist": 37, "pairlist_dist": 39, "paramet": [4, 15, 32, 37, 39, 40], "parent": [15, 38], "parmed_bd": 28, "parser": 37, "part": 39, "particl": [6, 38, 39], "particle_group": 39, "particles_a": 6, "particles_b": 6, "particletyp": [17, 37, 38, 39], "particular": [0, 39], "pass": [0, 38, 39], "path": [30, 33, 38, 39, 40], "pathlib": 39, "pbead": 40, "pcbi": 39, "pdb": [31, 37, 38, 39, 40], "peak": 40, "peopl": 0, "peptid": [38, 39], "per": [37, 39], "per_monom": 15, "perform": [32, 39, 40], "perhap": 0, "period": [6, 8, 32, 34, 37], "physic": 37, "pii": 37, "place": 0, "plain": 40, "plan": 39, "pleas": [37, 40], "plot": [38, 39], "plt": [38, 39], "pm": [37, 38], "pmf": 40, "pmf_grid": 40, "pn": 38, "point": [0, 32, 37, 38, 39], "pointparticl": [17, 37, 39], "poisson": 40, "poli": [38, 40], "polym": [5, 9, 10, 12, 13, 14, 17, 36, 40, 41], "polymer": 38, "polymer_index": 39, "polymer_mass": 39, "polymerbead": [9, 10, 12, 13, 14, 15, 17, 39], "polymergroup": [15, 38], "polymermodel": [9, 10, 12, 13, 14, 15, 17, 39], "polymersect": [15, 38, 39, 40], "poorli": 37, "posit": [37, 38, 39, 40], "position_filt": 15, "position_spline_param": 38, "possibl": [0, 38], "post": 38, "postpon": 39, "pot": [37, 39, 40], "potenti": [5, 6, 8, 10, 12, 13, 14, 36, 37, 38, 39, 40], "potential_grid": 40, "pre": [39, 40], "predetermin": 40, "prefix": [37, 39], "prefixes_and_limit": 39, "prepar": 40, "prescrib": [37, 38], "prevent": [37, 40], "previous": 40, "primarili": 38, "print": [32, 37, 38, 39], "prior": 40, "pro": [0, 38], "procedur": 39, "process": [34, 39], "processor": [30, 33], "produc": 40, "product": [37, 39], "program": 0, "properti": [6, 8, 15, 36], "proport": 40, "prot": 38, "protect": 0, "protein": [25, 26, 36, 39], "provid": [0, 2, 4, 5, 26, 30, 32, 36, 37, 38, 39, 40], "psf": [31, 37, 38, 39, 40], "pub": 38, "pull": [0, 37], "push": 0, "put": [0, 39], "py": [37, 39, 40], "py3": [39, 40], "pybd": [39, 40], "pyplot": [38, 39], "python": [5, 34, 37, 38, 39], "python3": [39, 40], "q": 31, "q1": 31, "q2": 31, "qualiti": 0, "quaternion": 15, "quaternion_exp": 31, "quaternion_from_matrix": 31, "quaternion_invers": 31, "quaternion_product": 31, "quaternion_slerp": 31, "quaternion_spline_param": 38, "quaternion_to_matrix": 31, "quickli": 0, "r": [6, 8, 10, 12, 13, 14, 31, 37, 38, 39], "r0": [8, 37], "radiu": [15, 32, 37, 38, 39], "radiusdof": 6, "rais": [32, 39, 40], "random": 37, "rang": [36, 37, 39, 40], "range_": [6, 8, 10, 12, 13, 14, 37, 39], "rate": 39, "rather": [0, 39], "ratio": 39, "raw": 39, "rb": 40, "re": [0, 39], "reach": 40, "read": [0, 34], "read_arbd_coordin": [31, 38], "read_average_arbd_coordin": 31, "read_cg_potenti": 6, "read_release_vers": 35, "read_version_fil": 35, "readarbdcoord": [31, 39], "readavgarbdcoord": 31, "readi": 0, "realli": 38, "reason": [0, 37, 40], "recalcul": 6, "recent": [37, 38, 39, 40], "recommend": [0, 37, 40], "recomput": 40, "record": 39, "reduc": [0, 39], "refer": 0, "regular": 38, "reimport": 38, "rel": 39, "relax": 38, "releas": [0, 40], "remot": 0, "remov": [0, 15], "remove_monom": 15, "repeat": [39, 40], "replac": 39, "replace_false_with_dist": 32, "replic": 40, "replica": [39, 40], "replisom": 40, "replisome_grid": 40, "repositori": 0, "repres": [6, 32, 34, 37, 38, 39, 40], "request": 0, "requir": [0, 32, 37, 40], "reshap": 40, "resid": 39, "residu": 39, "resolut": [6, 8, 10, 12, 13, 14, 32, 37, 38, 39], "rest_length": [9, 10, 12, 13, 14, 15], "restart": [38, 39], "restrain": [38, 40], "restraint": [38, 39, 40], "restraint1": 40, "restraint2": 40, "result": [32, 39, 40], "return": [15, 32, 37, 38, 39, 40], "reus": [38, 39], "revers": 15, "rework": 39, "rgyr": 38, "rho_aa": 39, "rho_cg": 39, "rho_ylimit": 39, "right": 39, "rigid": 36, "rigid_bodi": 40, "rigid_body_grid_grid_period": 40, "rigid_body_potenti": 40, "rigid_body_typ": 40, "rigidbodi": [5, 40], "rigidbodytyp": 40, "rmsd_threshold": 31, "room": 0, "rotat": [15, 40], "rotation_matrix": 15, "rotationaboutaxi": 31, "rotational_damping_coeffici": 40, "routin": 39, "row": 39, "royalsocietypublish": 37, "rspa": 37, "run": [0, 38, 40], "run_ibi": 39, "runcal": 38, "runtest": 32, "runtim": 37, "sai": 0, "sali_polymer_model": 11, "same": [32, 38, 39], "sampl": [32, 39], "sast": 0, "save": 39, "saw": 39, "sax": 38, "scalar": 32, "scale": [15, 38, 39, 40], "scaling_factor": 6, "scienc": 37, "sciencedirect": 37, "scitat": 8, "screenshot": 0, "script": [0, 39], "secondari": 40, "section": [0, 2, 5, 7, 11, 15, 18, 25, 28, 33, 36, 39, 41], "secur": 0, "see": [0, 36, 37, 38, 40], "seed": 26, "seg": 38, "segid": [38, 39], "segment": [32, 38], "segment_index": 38, "segnam": [38, 39], "select": 37, "selectign": 38, "selenium": 0, "self": [0, 37, 39, 40], "separ": [32, 34], "seq": [15, 38, 39], "sequenc": [9, 10, 12, 13, 14, 15, 17, 38, 39], "sequence_to_chain": 39, "server": 0, "servic": 0, "set": [0, 37, 40], "set_connect": 15, "set_damping_coeffici": [9, 10, 12, 13, 14, 39], "set_data": 39, "set_orientation_splin": 15, "set_splin": [15, 39, 40], "set_titl": 39, "set_xlabel": 39, "set_xlim": 39, "set_ylabel": 39, "set_ylim": 39, "setup": 0, "shape": [5, 26, 32, 36, 38, 40], "shape_cg": 25, "share": 39, "sharex": 39, "shield": 0, "shift": 32, "short": 0, "should": [0, 6, 32, 39, 40], "show": [0, 38, 39], "show_mdanalysi": [37, 38], "side": 32, "sig": 32, "sigma": 32, "sign": 38, "signal": 40, "sim": [37, 38], "sim_config": 2, "sim_kw": 40, "sim_kwarg": 40, "simconf": [2, 4], "simengin": [39, 40], "simpl": [37, 38, 40], "simplearbd": 18, "simplest": 38, "simpli": 37, "simul": [2, 4, 5, 25, 26, 30, 33, 36, 38, 40], "sinc": [34, 39, 40], "singl": [34, 39], "singleton": 30, "site": [6, 15, 38, 39, 40], "size": [32, 38], "skimag": 32, "skin_depth": 39, "skip": [38, 40], "slab_potential_z": [32, 38], "slow": [0, 40], "slower": 40, "small": [0, 37], "smaller": 32, "smaller_grid": 32, "smallest": 0, "smooth": 6, "so": [0, 34, 37, 38, 39, 40], "solver": 40, "some": [0, 37], "someon": 0, "someth": [0, 38], "sophist": 0, "sourc": [0, 6, 8, 9, 10, 12, 13, 14, 15, 17, 26, 31, 32, 35, 38, 40], "space": [32, 38, 40], "special": 36, "specif": [0, 32], "specifi": [32, 37, 38, 40], "spefici": 38, "spheric": 38, "spherical_confin": [32, 38], "spline": [38, 40], "split": 39, "spring": 38, "spring_const": [9, 10, 12, 13, 14], "sqrt": [37, 38, 39], "squar": 39, "squeez": 39, "ssb": 40, "ssb_coord": 40, "ssb_type": 40, "ssdna": [38, 40], "ssdna_two_bead": [11, 38, 40], "start": [38, 39, 40], "start_posit": [15, 38, 40], "state": 0, "static": 0, "stderr": 32, "stem": 39, "step": [0, 40], "steric": 40, "stop": 0, "store": 39, "str": 32, "strand": 38, "stretch": 38, "strictli": 38, "stride": [31, 38], "string": [34, 37], "strongli": 37, "structur": [0, 36, 38, 40], "structure_from_pdb": 18, "structure_rigidbodi": 18, "studi": 40, "style": 39, "sub": 34, "subject": [37, 40], "subplot": 39, "subsect": 0, "sum": [32, 39], "support": 40, "suppress": 38, "swell": 38, "switch": 38, "sy": 37, "syntax": [37, 40], "system": [0, 6, 36, 39, 40], "system_s": 37, "t": [31, 38, 39, 40], "t0": 38, "t1": 39, "t2": 39, "tablefil": 8, "tabul": 38, "tabulatednonbond": 8, "tail": 40, "take": [39, 40], "target": [39, 40], "tbgl": 0, "tcl": [15, 40], "techniqu": 38, "tediou": 38, "tell": 0, "temperatur": [6, 8, 39], "templat": 0, "terin": 40, "term": 39, "termin": [39, 40], "test_average_grid": 32, "testaveragegrid": 32, "testcas": 32, "text": 40, "than": [0, 32, 38, 39, 40], "thank": 0, "thei": [0, 39, 40], "them": [0, 38], "thermostat": 38, "thi": [2, 5, 7, 11, 18, 25, 26, 28, 30, 32, 33, 34, 37, 38, 39, 40, 41], "thing": [0, 38], "think": 0, "third": 40, "those": [0, 37, 40], "three": [38, 39], "through": [38, 39, 40], "tile": 39, "time": [0, 37, 38, 39, 40], "timescal": 38, "timeseri": 39, "timestep": [37, 39, 40], "titl": 35, "tkconsol": 40, "tmp": 39, "togeth": [39, 40], "tol": [6, 39], "too": [0, 37], "tool": [36, 40], "top": 0, "torqu": 40, "trace": [38, 40], "traceback": [37, 38, 39, 40], "tracker": 0, "tractabl": 40, "traj": 40, "trajectori": [6, 37, 38, 40], "translat": [15, 38, 40], "translation_vector": 15, "trash": 39, "trick": 39, "trombon": 40, "trombond": 40, "true": [6, 15, 31, 32, 38, 39], "truncat": [32, 40], "try": [38, 39], "ttygif": 0, "tupl": [32, 40], "turn": 39, "tutori": [0, 36, 37, 38], "two": [15, 38, 39, 40], "type": [6, 8, 10, 12, 13, 14, 32, 38, 39, 40], "type_": [8, 15, 37, 38, 39], "typea": [37, 38, 39], "typeb": [37, 38, 39], "u": [37, 38, 39, 40], "u_pkg": 38, "u_ylimit": 39, "uf": 0, "unabl": [39, 40], "under": 37, "underli": 38, "understand": 37, "unfamiliar": 0, "unfortun": 40, "uniqu": [34, 40], "unit": [37, 38, 39, 40], "unit_quat_convers": 31, "univers": [6, 37, 38, 39], "unreason": 37, "until": 38, "up": [0, 34, 37, 40], "updat": [15, 38, 39, 40], "update_splin": [15, 38, 39], "upload": 0, "upon": 40, "upper": [34, 39], "urei": 39, "us": [0, 26, 32, 36, 37, 38, 39, 40], "usag": 39, "usecol": 40, "user": 37, "usr": [39, 40], "usual": [38, 39, 40], "util": [0, 5], "v": [6, 38, 40], "valu": [6, 32, 37, 38, 39, 40], "valueerror": 32, "variabl": 0, "varieti": 36, "variou": [36, 38], "vdw": 40, "vdw0": 40, "vdw1": 40, "vdw2": 40, "ve": [38, 39, 40], "veri": 40, "verifi": 38, "versatil": 38, "version": [0, 14, 33], "video": 0, "viral": 40, "visitor": 0, "visual": [38, 40], "vmd": [37, 38, 40], "vmd_cylinder_tcl": 15, "vmd_tube_tcl": 15, "volum": 35, "volunt": 0, "voxel": [32, 38, 40], "vulner": 0, "w": [37, 38], "wa": [39, 40], "wai": [0, 39], "wait": 40, "walk": 39, "walkthrough": 36, "want": [0, 37, 38, 39, 40], "warn": 32, "we": [37, 38, 39, 40], "weight": [26, 31], "welcom": 36, "well": 38, "what": [0, 40], "whatev": 39, "when": [0, 38, 39, 40], "where": [0, 34, 40], "whether": [0, 32], "which": [0, 32, 37, 38, 40], "while": [0, 38], "who": 0, "whoever": 0, "why": [37, 38, 40], "wide": 36, "widgetsnbextens": 37, "within": [0, 15, 38, 40], "without": 15, "wlcskangl": 8, "wlcskbond": 8, "wlcskpotenti": 8, "word": 37, "work": [37, 38, 39, 40, 41], "workaround": 40, "would": [0, 38, 39], "wrap_vector": 6, "write": [8, 37, 38, 39], "write_cg_potenti": 6, "write_fil": [6, 8], "write_release_vers": 35, "writedx": [32, 38], "written": [39, 40], "www": 37, "x": [32, 38, 39], "x1": 39, "x2": 39, "xl": 34, "xlabel": [38, 39], "xlimit": 39, "y": [38, 39], "y1": 39, "y2": 39, "yarn": 0, "year": 35, "yet": 40, "ylabel": 38, "you": [0, 37, 38, 40], "your": 37, "yourself": 37, "z": [38, 39], "zero": [6, 8, 37], "zip": [38, 39], "\u00e5ngstrom": 37}, "titles": ["arbdmodel-docs", "core_objects", "Core", "model", "sim_config", "API Reference", "ibi", "Interaction Potentials", "interactions", "fjc_polymer_model", "hps_polymer_model", "Polymer Modeling", "kh_polymer_model", "mpipi_polymer", "onck_polymer_model", "polymer", "sali_polymer_model", "ssdna_two_bead", "RigidBody Models", "mesh_process_surface", "mesh_process_volume", "mesh_rigidbody", "simplearbd", "structure_from_pdb", "structure_rigidbody", "Shape-Based Models", "shape_cg", "engine", "Simulation Engines", "parmed_bd", "binary_manager", "coords", "grid", "Utilities", "logger", "version", "ARBD Model Documentation", "Basic usage of the <code class=\"docutils literal notranslate\"><span class=\"pre\">arbdmodel</span></code> package", "Some polymer models may have multiple beads per monomer", "Implementing customized coarse-grained polymer models", "Modeling rigid-body objects", "Tutorials"], "titleterms": {"1": [37, 39, 41], "2": [37, 39, 41], "3": [37, 39, 41], "4": [37, 39, 41], "5": [37, 39], "6": 37, "7": 37, "acknowledg": 0, "ad": 40, "add": [0, 37, 38], "api": [5, 36], "arbd": [36, 37], "arbdmodel": [0, 37], "attach": 40, "author": 0, "avail": 41, "badg": 0, "base": 25, "basic": [37, 41], "bead": 38, "between": 37, "binary_manag": 30, "bind": 40, "bodi": [40, 41], "boltzmann": 41, "bond": 37, "build": 37, "categori": 5, "coars": 39, "coarser": 39, "collabor": 0, "configur": 37, "constant": 38, "construct": 39, "contribut": 0, "coord": 31, "core": 2, "core_object": 1, "creat": 37, "custom": [37, 39], "deploi": 0, "describ": 37, "descript": 0, "determin": 38, "dna": 40, "doc": 0, "document": 36, "edit": 0, "elast": 38, "end": 38, "engin": [27, 28], "featur": 36, "file": [0, 37], "fine": 39, "fjc_polymer_model": 9, "forc": 38, "get": [0, 36], "good": 0, "grain": 39, "grid": 32, "have": 38, "hps_polymer_model": 10, "i": 37, "ibi": [6, 39], "implement": 39, "instal": 0, "integr": 0, "interact": [7, 8, 37], "invers": 41, "iter": 41, "kh_polymer_model": 12, "licens": 0, "logger": 34, "mai": 38, "map": 39, "mesh_process_surfac": 19, "mesh_process_volum": 20, "mesh_rigidbodi": 21, "model": [3, 11, 18, 25, 36, 38, 39, 40], "modul": [2, 5, 7, 11, 18, 25, 28, 33], "monom": 38, "mpipi_polym": 13, "multipl": 38, "name": 0, "object": 40, "onck_polymer_model": 14, "overview": 36, "packag": 37, "parmed_bd": 29, "particl": [37, 40], "per": 38, "plain": 37, "point": 40, "polym": [11, 15, 38, 39], "polymer_object": 41, "potenti": 7, "project": 0, "properti": 38, "protein": 40, "python": 36, "readm": 0, "refer": [5, 36], "represent": 39, "result": 37, "rigid": [40, 41], "rigidbodi": 18, "roadmap": 0, "run": [37, 39], "sali_polymer_model": 16, "set": 39, "shape": 25, "shape_cg": 26, "sim_config": 4, "simplearbd": 22, "simul": [28, 37, 39], "singl": 40, "some": 38, "ssdna_two_bead": 17, "start": [0, 36], "statu": 0, "step": [37, 39], "strand": 40, "structure_from_pdb": 23, "structure_rigidbodi": 24, "suggest": 0, "support": 0, "system": 37, "team": 0, "test": 0, "text": 37, "thi": 0, "through": 37, "tool": 0, "trajectori": 39, "tutori": 41, "type": 37, "up": 39, "usag": [0, 37], "util": 33, "version": 35, "visual": [0, 37, 39], "your": 0}})
\ No newline at end of file
+Search.setIndex({"alltitles": {"3-iterative-boltzmann-inversion": [[41, "iterative-boltzmann-inversion"]], "4-rigid-bodies": [[41, "rigid-bodies"]], "API Reference": [[5, null]], "ARBD Model Documentation": [[36, null]], "ARBD is configured through plain text files": [[37, "arbd-is-configured-through-plain-text-files"]], "Add a constant-force to the ends of the polymers to determine their elastic properties": [[38, "add-a-constant-force-to-the-ends-of-the-polymers-to-determine-their-elastic-properties"]], "Add your files": [[0, "add-your-files"]], "Adding single-stranded DNA binding protein": [[40, "adding-single-stranded-dna-binding-protein"]], "Attaching point particles": [[40, "attaching-point-particles"]], "Authors and acknowledgment": [[0, "authors-and-acknowledgment"]], "Available Tutorials": [[41, "available-tutorials"]], "Badges": [[0, "badges"]], "Basic usage of the arbdmodel package": [[37, null]], "Collaborate with your team": [[0, "collaborate-with-your-team"]], "Contributing": [[0, "contributing"]], "Core": [[2, null]], "Description": [[0, "description"]], "Editing this README": [[0, "editing-this-readme"]], "Features": [[36, "features"]], "Getting Started": [[36, "getting-started"]], "Getting started": [[0, "getting-started"]], "Implementing customized coarse-grained polymer models": [[39, null]], "Installation": [[0, "installation"]], "Integrate with your tools": [[0, "integrate-with-your-tools"]], "Interaction Potentials": [[7, null]], "License": [[0, "license"]], "Modeling rigid-body objects": [[40, null]], "Module Categories": [[5, "module-categories"]], "Modules": [[2, "modules"], [7, "modules"], [11, "modules"], [18, "modules"], [25, "modules"], [28, "modules"], [33, "modules"]], "Name": [[0, "name"]], "Overview": [[36, "overview"]], "Polymer Modeling": [[11, null]], "Project status": [[0, "project-status"]], "Python API Reference": [[36, "python-api-reference"]], "RigidBody Models": [[18, null]], "Roadmap": [[0, "roadmap"]], "Shape-Based Models": [[25, null]], "Simulation Engines": [[28, null]], "Some polymer models may have multiple beads per monomer": [[38, null]], "Step 1: Create particle types": [[37, "step-1-create-particle-types"]], "Step 1: Model Construction": [[39, "step-1-model-construction"]], "Step 2: Build a system": [[37, "step-2-build-a-system"]], "Step 2: Setting up a coarser model": [[39, "step-2-setting-up-a-coarser-model"]], "Step 3: Describe the interactions between the particles": [[37, "step-3-describe-the-interactions-between-the-particles"]], "Step 3: Mapping the fine grained trajectory to a coarser representation": [[39, "step-3-mapping-the-fine-grained-trajectory-to-a-coarser-representation"]], "Step 4: Run the coarser IBI simulations": [[39, "step-4-run-the-coarser-ibi-simulations"]], "Step 4: Run the simulation": [[37, "step-4-run-the-simulation"]], "Step 5: Visualization": [[39, "step-5-visualization"]], "Step 5: Visualize the results": [[37, "step-5-visualize-the-results"]], "Step 6: Customize the interactions": [[37, "step-6-customize-the-interactions"]], "Step 7: Add bonds": [[37, "step-7-add-bonds"]], "Suggestions for a good README": [[0, "suggestions-for-a-good-readme"]], "Support": [[0, "support"]], "Test and Deploy": [[0, "test-and-deploy"]], "Tutorials": [[41, null]], "Usage": [[0, "usage"]], "Utilities": [[33, null]], "Visuals": [[0, "visuals"]], "arbdmodel-docs": [[0, null]], "binary_manager": [[30, null]], "coords": [[31, null]], "core_objects": [[1, null]], "engine": [[27, null]], "fjc_polymer_model": [[9, null]], "grid": [[32, null]], "hps_polymer_model": [[10, null]], "ibi": [[6, null]], "interactions": [[8, null]], "kh_polymer_model": [[12, null]], "logger": [[34, null]], "mesh_process_surface": [[19, null]], "mesh_process_volume": [[20, null]], "mesh_rigidbody": [[21, null]], "model": [[3, null]], "mpipi_polymer": [[13, null]], "onck_polymer_model": [[14, null]], "parmed_bd": [[29, null]], "polymer": [[15, null]], "sali_polymer_model": [[16, null]], "shape_cg": [[26, null]], "sim_config": [[4, null]], "simplearbd": [[22, null]], "ssdna_two_bead": [[17, null]], "structure_from_pdb": [[23, null]], "structure_rigidbody": [[24, null]], "version": [[35, null]]}, "docnames": ["README", "api/core/core_objects", "api/core/index", "api/core/model", "api/core/sim_config", "api/index", "api/interaction_potentials/ibi", "api/interaction_potentials/index", "api/interaction_potentials/interactions", "api/polymer_modeling/fjc_polymer_model", "api/polymer_modeling/hps_polymer_model", "api/polymer_modeling/index", "api/polymer_modeling/kh_polymer_model", "api/polymer_modeling/mpipi_polymer", "api/polymer_modeling/onck_polymer_model", "api/polymer_modeling/polymer", "api/polymer_modeling/sali_polymer_model", "api/polymer_modeling/ssdna_two_bead", "api/rigidbody_models/index", "api/rigidbody_models/mesh_process_surface", "api/rigidbody_models/mesh_process_volume", "api/rigidbody_models/mesh_rigidbody", "api/rigidbody_models/simplearbd", "api/rigidbody_models/structure_from_pdb", "api/rigidbody_models/structure_rigidbody", "api/shape-based_models/index", "api/shape-based_models/shape_cg", "api/simulation_engines/engine", "api/simulation_engines/index", "api/simulation_engines/parmed_bd", "api/utilities/binary_manager", "api/utilities/coords", "api/utilities/grid", "api/utilities/index", "api/utilities/logger", "api/utilities/version", "intro", "tutorials/1-basics", "tutorials/2-polymer-objects", "tutorials/3-iterative-boltzmann-inversion/3-ibi", "tutorials/4-rigid-bodies/4-rigid-bodies", "tutorials/index"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.viewcode": 1}, "filenames": ["README.md", "api/core/core_objects.md", "api/core/index.md", "api/core/model.md", "api/core/sim_config.md", "api/index.md", "api/interaction_potentials/ibi.md", "api/interaction_potentials/index.md", "api/interaction_potentials/interactions.md", "api/polymer_modeling/fjc_polymer_model.md", "api/polymer_modeling/hps_polymer_model.md", "api/polymer_modeling/index.md", "api/polymer_modeling/kh_polymer_model.md", "api/polymer_modeling/mpipi_polymer.md", "api/polymer_modeling/onck_polymer_model.md", "api/polymer_modeling/polymer.md", "api/polymer_modeling/sali_polymer_model.md", "api/polymer_modeling/ssdna_two_bead.md", "api/rigidbody_models/index.md", "api/rigidbody_models/mesh_process_surface.md", "api/rigidbody_models/mesh_process_volume.md", "api/rigidbody_models/mesh_rigidbody.md", "api/rigidbody_models/simplearbd.md", "api/rigidbody_models/structure_from_pdb.md", "api/rigidbody_models/structure_rigidbody.md", "api/shape-based_models/index.md", "api/shape-based_models/shape_cg.md", "api/simulation_engines/engine.md", "api/simulation_engines/index.md", "api/simulation_engines/parmed_bd.md", "api/utilities/binary_manager.md", "api/utilities/coords.md", "api/utilities/grid.md", "api/utilities/index.md", "api/utilities/logger.md", "api/utilities/version.md", "intro.md", "tutorials/1-basics.ipynb", "tutorials/2-polymer-objects.ipynb", "tutorials/3-iterative-boltzmann-inversion/3-ibi.ipynb", "tutorials/4-rigid-bodies/4-rigid-bodies.ipynb", "tutorials/index.md"], "indexentries": {"abstractibipotential (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.AbstractIBIpotential", false]], "abstractpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.AbstractPotential", false]], "add() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.add", false]], "add() (parent method)": [[1, "arbdmodel.core_objects.Parent.add", false]], "add_angle() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_angle", false]], "add_bond() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_bond", false]], "add_bond_angle() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_bond_angle", false]], "add_confinement() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.add_confinement", false]], "add_diffusible_object() (structurerigidbodymodel method)": [[24, "arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_diffusible_object", false]], "add_dihedral() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_dihedral", false]], "add_exclusion() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_exclusion", false]], "add_grid_potential() (particletype method)": [[1, "arbdmodel.core_objects.ParticleType.add_grid_potential", false]], "add_grid_potential() (pointparticle method)": [[1, "arbdmodel.core_objects.PointParticle.add_grid_potential", false]], "add_grid_potential() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.add_grid_potential", false]], "add_group_site() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.add_group_site", false]], "add_improper() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_improper", false]], "add_location() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.add_location", false]], "add_nonbonded_interaction() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.add_nonbonded_interaction", false]], "add_product_potential() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_product_potential", false]], "add_protein_nb_interactions() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.add_protein_nb_interactions", false]], "add_proteins() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.add_proteins", false]], "add_restraint() (groupsite method)": [[1, "arbdmodel.core_objects.GroupSite.add_restraint", false]], "add_restraint() (pointparticle method)": [[1, "arbdmodel.core_objects.PointParticle.add_restraint", false]], "add_restraint() (rigidbody method)": [[1, "arbdmodel.core_objects.RigidBody.add_restraint", false]], "add_smaller_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.add_smaller_grid", false]], "add_static_object() (structurerigidbodymodel method)": [[24, "arbdmodel.structure_rigidbody.StructureRigidBodyModel.add_static_object", false]], "add_vector_angle() (parent method)": [[1, "arbdmodel.core_objects.Parent.add_vector_angle", false]], "align_structure() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.align_structure", false]], "angledof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.AngleDof", false]], "apbsrunner (class in arbdmodel.engine)": [[27, "arbdmodel.engine.APBSRunner", false]], "apply_gaussian_smoothing() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.apply_gaussian_smoothing", false]], "applyorientation() (transformable method)": [[1, "arbdmodel.core_objects.Transformable.applyOrientation", false]], "arbdengine (class in arbdmodel.engine)": [[27, "arbdmodel.engine.ArbdEngine", false]], "arbdmodel (class in arbdmodel.model)": [[3, "arbdmodel.model.ArbdModel", false]], "arbdmodel.binary_manager": [[30, "module-arbdmodel.binary_manager", false]], "arbdmodel.coords": [[31, "module-arbdmodel.coords", false]], "arbdmodel.core_objects": [[1, "module-arbdmodel.core_objects", false]], "arbdmodel.engine": [[27, "module-arbdmodel.engine", false]], "arbdmodel.fjc_polymer_model": [[9, "module-arbdmodel.fjc_polymer_model", false]], "arbdmodel.grid": [[32, "module-arbdmodel.grid", false]], "arbdmodel.hps_polymer_model": [[10, "module-arbdmodel.hps_polymer_model", false]], "arbdmodel.ibi": [[6, "module-arbdmodel.ibi", false]], "arbdmodel.interactions": [[8, "module-arbdmodel.interactions", false]], "arbdmodel.kh_polymer_model": [[12, "module-arbdmodel.kh_polymer_model", false]], "arbdmodel.logger": [[34, "module-arbdmodel.logger", false]], "arbdmodel.mesh_process_surface": [[19, "module-arbdmodel.mesh_process_surface", false]], "arbdmodel.mesh_process_volume": [[20, "module-arbdmodel.mesh_process_volume", false]], "arbdmodel.mesh_rigidbody": [[21, "module-arbdmodel.mesh_rigidbody", false]], "arbdmodel.model": [[3, "module-arbdmodel.model", false]], "arbdmodel.mpipi_polymer": [[13, "module-arbdmodel.mpipi_polymer", false]], "arbdmodel.onck_polymer_model": [[14, "module-arbdmodel.onck_polymer_model", false]], "arbdmodel.parmed_bd": [[29, "module-arbdmodel.parmed_bd", false]], "arbdmodel.polymer": [[15, "module-arbdmodel.polymer", false]], "arbdmodel.sali_polymer_model": [[16, "module-arbdmodel.sali_polymer_model", false]], "arbdmodel.shape_cg": [[26, "module-arbdmodel.shape_cg", false]], "arbdmodel.sim_config": [[4, "module-arbdmodel.sim_config", false]], "arbdmodel.simplearbd": [[22, "module-arbdmodel.simplearbd", false]], "arbdmodel.ssdna_two_bead": [[17, "module-arbdmodel.ssdna_two_bead", false]], "arbdmodel.structure_from_pdb": [[23, "module-arbdmodel.structure_from_pdb", false]], "arbdmodel.structure_rigidbody": [[24, "module-arbdmodel.structure_rigidbody", false]], "arbdmodel.version": [[35, "module-arbdmodel.version", false]], "assign_ibi_degrees_of_freedom() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.assign_IBI_degrees_of_freedom", false]], "atom_types (parmedarbd attribute)": [[29, "arbdmodel.parmed_bd.ParmedArbd.atom_types", false]], "atoms_map (parmedarbd attribute)": [[29, "arbdmodel.parmed_bd.ParmedArbd.atoms_map", false]], "attach_particle() (rigidbodytype method)": [[1, "arbdmodel.core_objects.RigidBodyType.attach_particle", false]], "average_grids() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.average_grids", false]], "b (dnastrandbeads attribute)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads.b", false]], "bondangledof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.BondAngleDof", false]], "bonddof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.BondDof", false]], "bound_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.Bound_grid", false]], "boundarypotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.BoundaryPotential", false]], "calc_atom_sasa() (shapecgfactory method)": [[26, "arbdmodel.shape_cg.ShapeCGFactory.calc_atom_sasa", false]], "calculate_damping() (meshprocessor method)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.calculate_damping", false]], "calculate_damping() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.calculate_damping", false]], "calculate_dimensions_from_cell_vectors() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.calculate_dimensions_from_cell_vectors", false]], "calculate_hydrodynamic_properties() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.calculate_hydrodynamic_properties", false]], "calculate_total_mass() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.calculate_total_mass", false]], "call_git_describe() (in module arbdmodel.version)": [[35, "arbdmodel.version.call_git_describe", false]], "check_git_repository() (in module arbdmodel.version)": [[35, "arbdmodel.version.check_git_repository", false]], "child (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.Child", false]], "citation (class in arbdmodel.version)": [[35, "arbdmodel.version.Citation", false]], "clear_all() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.clear_all", false]], "clear_all() (parent method)": [[1, "arbdmodel.core_objects.Parent.clear_all", false]], "clone (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.Clone", false]], "clone() (group method)": [[1, "arbdmodel.core_objects.Group.clone", false]], "combine() (simconf method)": [[4, "arbdmodel.sim_config.SimConf.combine", false]], "compute_volume() (angledof method)": [[6, "arbdmodel.ibi.AngleDof.compute_volume", false]], "compute_volume() (bonddof method)": [[6, "arbdmodel.ibi.BondDof.compute_volume", false]], "compute_volume() (degreeoffreedom method)": [[6, "arbdmodel.ibi.DegreeOfFreedom.compute_volume", false]], "compute_volume() (pairdistributiondof method)": [[6, "arbdmodel.ibi.PairDistributionDof.compute_volume", false]], "compute_volume() (radiusdof method)": [[6, "arbdmodel.ibi.RadiusDof.compute_volume", false]], "concentration_to_debye_length() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.concentration_to_debye_length", false]], "connectableelement (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.ConnectableElement", false]], "connection (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.Connection", false]], "constant_force() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.constant_force", false]], "contour_to_monomer_index() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_monomer_index", false]], "contour_to_orientation() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_orientation", false]], "contour_to_position() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_position", false]], "contour_to_tangent() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.contour_to_tangent", false]], "convert_sod_to_mg() (parmedarbd static method)": [[29, "arbdmodel.parmed_bd.ParmedArbd.convert_sod_to_mg", false]], "convolve_kernel_truncate() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.convolve_kernel_truncate", false]], "create_bounding_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.create_bounding_grid", false]], "create_dual_topology() (parmedarbd static method)": [[29, "arbdmodel.parmed_bd.ParmedArbd.create_dual_topology", false]], "create_dual_topology_model() (parmedarbd class method)": [[29, "arbdmodel.parmed_bd.ParmedArbd.create_dual_topology_model", false]], "create_engine() (simplearbdconfig method)": [[22, "arbdmodel.simplearbd.SimpleArbdConfig.create_engine", false]], "create_model() (simplearbdconfig method)": [[22, "arbdmodel.simplearbd.SimpleArbdConfig.create_model", false]], "create_null() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.Create_null", false]], "default_binary (arbdengine property)": [[27, "arbdmodel.engine.ArbdEngine.default_binary", false]], "default_binary (namdengine property)": [[27, "arbdmodel.engine.NamdEngine.default_binary", false]], "default_binary (simengine property)": [[27, "arbdmodel.engine.SimEngine.default_binary", false]], "defaultsimconf (class in arbdmodel.sim_config)": [[4, "arbdmodel.sim_config.DefaultSimConf", false]], "degreeoffreedom (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.DegreeOfFreedom", false]], "delete() (connection method)": [[15, "arbdmodel.polymer.Connection.delete", false]], "diffusiverigidbodytype (class in arbdmodel.structure_rigidbody)": [[24, "arbdmodel.structure_rigidbody.DiffusiveRigidBodyType", false]], "dihedraldof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.DihedralDof", false]], "dimensions_from_structure() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.dimensions_from_structure", false]], "dimensions_from_structure() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.dimensions_from_structure", false]], "display() (citation method)": [[35, "arbdmodel.version.Citation.display", false]], "dnamodel (class in arbdmodel.ssdna_two_bead)": [[17, "arbdmodel.ssdna_two_bead.DnaModel", false]], "dnastrandbeads (class in arbdmodel.ssdna_two_bead)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads", false]], "duplicate() (group method)": [[1, "arbdmodel.core_objects.Group.duplicate", false]], "duplicate() (pointparticle method)": [[1, "arbdmodel.core_objects.PointParticle.duplicate", false]], "duplicate() (rigidbody method)": [[1, "arbdmodel.core_objects.RigidBody.duplicate", false]], "excludedattributes (particletype attribute)": [[1, "arbdmodel.core_objects.ParticleType.excludedAttributes", false]], "extend() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.extend", false]], "extend() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.extend", false]], "filename() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.filename", false]], "filename() (abstractpotential method)": [[8, "arbdmodel.interactions.AbstractPotential.filename", false]], "filename() (harmonicbondedpotential method)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.filename", false]], "filename() (nullpotential method)": [[8, "arbdmodel.interactions.NullPotential.filename", false]], "filename() (shapecgnonbonded method)": [[26, "arbdmodel.shape_cg.ShapeCGNonbonded.filename", false]], "filename() (wlcskpotential method)": [[8, "arbdmodel.interactions.WLCSKPotential.filename", false]], "fill_nans() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.fill_nans", false]], "find_shape_based_sites() (in module arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.find_shape_based_sites", false]], "fjcbeadsfrompolymer (class in arbdmodel.fjc_polymer_model)": [[9, "arbdmodel.fjc_polymer_model.FjcBeadsFromPolymer", false]], "fjcmodel (class in arbdmodel.fjc_polymer_model)": [[9, "arbdmodel.fjc_polymer_model.FjcModel", false]], "from_protein_list() (shapecgmodel class method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.from_protein_list", false]], "gaussian_kernel() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.gaussian_kernel", false]], "generate_beads() (polymermodel method)": [[15, "arbdmodel.polymer.PolymerModel.generate_beads", false]], "generate_beads() (salimodel method)": [[16, "arbdmodel.sali_polymer_model.SaliModel.generate_beads", false]], "generate_charge_distribution() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.generate_charge_distribution", false]], "generate_coordinates() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.Generate_coordinates", false]], "generate_electrostatic_map() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.generate_electrostatic_map", false]], "generate_potential_grid() (meshprocessor method)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.generate_potential_grid", false]], "generate_potential_grid() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.generate_potential_grid", false]], "generate_protein() (shapecgfactory method)": [[26, "arbdmodel.shape_cg.ShapeCGFactory.generate_protein", false]], "generate_random_protein_positions() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.generate_random_protein_positions", false]], "generate_spanning_vectors() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.Generate_spanning_vectors", false]], "generate_vdw_maps() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.generate_vdw_maps", false]], "get_angles() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_angles", false]], "get_attached_particles() (meshprocessor method)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.get_attached_particles", false]], "get_attached_particles() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.get_attached_particles", false]], "get_binary() (simconf method)": [[4, "arbdmodel.sim_config.SimConf.get_binary", false]], "get_bond_angles() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_bond_angles", false]], "get_bonds() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_bonds", false]], "get_center() (groupsite method)": [[1, "arbdmodel.core_objects.GroupSite.get_center", false]], "get_center() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_center", false]], "get_center() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.get_center", false]], "get_center() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.get_center", false]], "get_cg_distribution() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.get_cg_distribution", false]], "get_coarse_protein() (shapecgfactory method)": [[26, "arbdmodel.shape_cg.ShapeCGFactory.get_coarse_protein", false]], "get_coarse_types() (shapecgfactory method)": [[26, "arbdmodel.shape_cg.ShapeCGFactory.get_coarse_types", false]], "get_collapsed_position() (transformable method)": [[1, "arbdmodel.core_objects.Transformable.get_collapsed_position", false]], "get_connected_location() (location method)": [[15, "arbdmodel.polymer.Location.get_connected_location", false]], "get_connections() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.get_connections", false]], "get_connections_and_locations() (connectableelement method)": [[15, "arbdmodel.polymer.ConnectableElement.get_connections_and_locations", false]], "get_contour_sorted_connections_and_locations() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.get_contour_sorted_connections_and_locations", false]], "get_default_conf() (arbdengine method)": [[27, "arbdmodel.engine.ArbdEngine.get_default_conf", false]], "get_default_conf() (namdengine method)": [[27, "arbdmodel.engine.NamdEngine.get_default_conf", false]], "get_default_conf() (simengine method)": [[27, "arbdmodel.engine.SimEngine.get_default_conf", false]], "get_dihedrals() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_dihedrals", false]], "get_exclusions() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_exclusions", false]], "get_grid_files() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.get_grid_files", false]], "get_impropers() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_impropers", false]], "get_location_at() (connectableelement method)": [[15, "arbdmodel.polymer.ConnectableElement.get_location_at", false]], "get_locations() (connectableelement method)": [[15, "arbdmodel.polymer.ConnectableElement.get_locations", false]], "get_monomer_index() (location method)": [[15, "arbdmodel.polymer.Location.get_monomer_index", false]], "get_original_recursively() (clone method)": [[1, "arbdmodel.core_objects.Clone.get_original_recursively", false]], "get_particle_assignments() (in module arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.get_particle_assignments", false]], "get_product_potentials() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_product_potentials", false]], "get_protein_types() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.get_protein_types", false]], "get_resource_path() (in module arbdmodel.logger)": [[34, "arbdmodel.logger.get_resource_path", false]], "get_restraints() (groupsite method)": [[1, "arbdmodel.core_objects.GroupSite.get_restraints", false]], "get_restraints() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_restraints", false]], "get_restraints() (pointparticle method)": [[1, "arbdmodel.core_objects.PointParticle.get_restraints", false]], "get_restraints() (rigidbody method)": [[1, "arbdmodel.core_objects.RigidBody.get_restraints", false]], "get_slice_enclosing_smaller_grid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.get_slice_enclosing_smaller_grid", false]], "get_target_distribution() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.get_target_distribution", false]], "get_values() (degreeoffreedom method)": [[6, "arbdmodel.ibi.DegreeOfFreedom.get_values", false]], "get_values() (pairdistributiondof method)": [[6, "arbdmodel.ibi.PairDistributionDof.get_values", false]], "get_vector_angles() (parent method)": [[1, "arbdmodel.core_objects.Parent.get_vector_angles", false]], "get_version() (in module arbdmodel.version)": [[35, "arbdmodel.version.get_version", false]], "getparticletypesandcounts() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.getParticleTypesAndCounts", false]], "group (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.Group", false]], "groupsite (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.GroupSite", false]], "halfharmonic (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HalfHarmonic", false]], "harmonicangle (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicAngle", false]], "harmonicbond (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicBond", false]], "harmonicbondedpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicBondedPotential", false]], "harmonicdihedral (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicDihedral", false]], "harmonicvectorangle (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.HarmonicVectorAngle", false]], "hpsbeads (class in arbdmodel.hps_polymer_model)": [[10, "arbdmodel.hps_polymer_model.HpsBeads", false]], "hpsmodel (class in arbdmodel.hps_polymer_model)": [[10, "arbdmodel.hps_polymer_model.HpsModel", false]], "hpsnonbonded (class in arbdmodel.hps_polymer_model)": [[10, "arbdmodel.hps_polymer_model.HpsNonbonded", false]], "hydroprorunner (class in arbdmodel.engine)": [[27, "arbdmodel.engine.HydroProRunner", false]], "ibiangle (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBIAngle", false]], "ibibond (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBIBond", false]], "ibidihedral (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBIDihedral", false]], "ibinonbonded (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.IBINonbonded", false]], "index() (parent method)": [[1, "arbdmodel.core_objects.Parent.index", false]], "initialize_binary_paths() (in module arbdmodel.binary_manager)": [[30, "arbdmodel.binary_manager.initialize_binary_paths", false]], "insert() (parent method)": [[1, "arbdmodel.core_objects.Parent.insert", false]], "insert_monomers() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.insert_monomers", false]], "is_dirty() (in module arbdmodel.version)": [[35, "arbdmodel.version.is_dirty", false]], "is_same_type() (particletype method)": [[1, "arbdmodel.core_objects.ParticleType.is_same_type", false]], "isotropic_kernel() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.isotropic_kernel", false]], "items() (simconf method)": [[4, "arbdmodel.sim_config.SimConf.items", false]], "iterate_connections_and_locations() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.iterate_connections_and_locations", false]], "khbeads (class in arbdmodel.kh_polymer_model)": [[12, "arbdmodel.kh_polymer_model.KhBeads", false]], "khmodel (class in arbdmodel.kh_polymer_model)": [[12, "arbdmodel.kh_polymer_model.KhModel", false]], "khnonbonded (class in arbdmodel.kh_polymer_model)": [[12, "arbdmodel.kh_polymer_model.KhNonbonded", false]], "kscale (harmonicangle property)": [[8, "arbdmodel.interactions.HarmonicAngle.kscale", false]], "kscale (harmonicbond property)": [[8, "arbdmodel.interactions.HarmonicBond.kscale", false]], "kscale (harmonicbondedpotential property)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.kscale", false]], "kscale (harmonicdihedral property)": [[8, "arbdmodel.interactions.HarmonicDihedral.kscale", false]], "kscale (harmonicvectorangle property)": [[8, "arbdmodel.interactions.HarmonicVectorAngle.kscale", false]], "lennardjones (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.LennardJones", false]], "linearbond (class in arbdmodel.sali_polymer_model)": [[16, "arbdmodel.sali_polymer_model.LinearBond", false]], "load_structure() (parmedarbd method)": [[29, "arbdmodel.parmed_bd.ParmedArbd.load_structure", false]], "load_target_ibi_distributions() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.load_target_IBI_distributions", false]], "loadgrid() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.loadGrid", false]], "location (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.Location", false]], "main() (in module arbdmodel.simplearbd)": [[22, "arbdmodel.simplearbd.main", false]], "meshprocessor (class in arbdmodel.mesh_process_volume)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor", false]], "meshrigidbodytype (class in arbdmodel.mesh_rigidbody)": [[21, "arbdmodel.mesh_rigidbody.MeshRigidBodyType", false]], "micron_to_angstrom (meshprocessor attribute)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.MICRON_TO_ANGSTROM", false]], "micron_to_angstrom (surfacemeshprocessor attribute)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.MICRON_TO_ANGSTROM", false]], "minimizermsd() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.minimizeRmsd", false]], "module": [[1, "module-arbdmodel.core_objects", false], [3, "module-arbdmodel.model", false], [4, "module-arbdmodel.sim_config", false], [6, "module-arbdmodel.ibi", false], [8, "module-arbdmodel.interactions", false], [9, "module-arbdmodel.fjc_polymer_model", false], [10, "module-arbdmodel.hps_polymer_model", false], [12, "module-arbdmodel.kh_polymer_model", false], [13, "module-arbdmodel.mpipi_polymer", false], [14, "module-arbdmodel.onck_polymer_model", false], [15, "module-arbdmodel.polymer", false], [16, "module-arbdmodel.sali_polymer_model", false], [17, "module-arbdmodel.ssdna_two_bead", false], [19, "module-arbdmodel.mesh_process_surface", false], [20, "module-arbdmodel.mesh_process_volume", false], [21, "module-arbdmodel.mesh_rigidbody", false], [22, "module-arbdmodel.simplearbd", false], [23, "module-arbdmodel.structure_from_pdb", false], [24, "module-arbdmodel.structure_rigidbody", false], [26, "module-arbdmodel.shape_cg", false], [27, "module-arbdmodel.engine", false], [29, "module-arbdmodel.parmed_bd", false], [30, "module-arbdmodel.binary_manager", false], [31, "module-arbdmodel.coords", false], [32, "module-arbdmodel.grid", false], [34, "module-arbdmodel.logger", false], [35, "module-arbdmodel.version", false]], "monomer_index_to_contour() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.monomer_index_to_contour", false]], "monomers_per_bead_group (polymerbeads property)": [[15, "arbdmodel.polymer.PolymerBeads.monomers_per_bead_group", false]], "mpipibeads (class in arbdmodel.mpipi_polymer)": [[13, "arbdmodel.mpipi_polymer.MpipiBeads", false]], "mpipimodel (class in arbdmodel.mpipi_polymer)": [[13, "arbdmodel.mpipi_polymer.MpipiModel", false]], "mpipinonbonded (class in arbdmodel.mpipi_polymer)": [[13, "arbdmodel.mpipi_polymer.MpipiNonbonded", false]], "namdengine (class in arbdmodel.engine)": [[27, "arbdmodel.engine.NamdEngine", false]], "neighborhood_average() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.neighborhood_average", false]], "nt (dnastrandbeads attribute)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads.nt", false]], "nullpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.NullPotential", false]], "num_bead_groups (polymerbeads property)": [[15, "arbdmodel.polymer.PolymerBeads.num_bead_groups", false]], "onckbeads (class in arbdmodel.onck_polymer_model)": [[14, "arbdmodel.onck_polymer_model.OnckBeads", false]], "onckmodel (class in arbdmodel.onck_polymer_model)": [[14, "arbdmodel.onck_polymer_model.OnckModel", false]], "oncknonbonded (class in arbdmodel.onck_polymer_model)": [[14, "arbdmodel.onck_polymer_model.OnckNonbonded", false]], "other() (connection method)": [[15, "arbdmodel.polymer.Connection.other", false]], "p (dnastrandbeads attribute)": [[17, "arbdmodel.ssdna_two_bead.DnaStrandBeads.p", false]], "pairdistributiondof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.PairDistributionDof", false]], "parent (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.Parent", false]], "parmed_structure (parmedarbd attribute)": [[29, "arbdmodel.parmed_bd.ParmedArbd.parmed_structure", false]], "parmedarbd (class in arbdmodel.parmed_bd)": [[29, "arbdmodel.parmed_bd.ParmedArbd", false]], "parse_output() (hydroprorunner method)": [[27, "arbdmodel.engine.HydroProRunner.parse_output", false]], "particletype (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.ParticleType", false]], "pdbmodel (class in arbdmodel.model)": [[3, "arbdmodel.model.PdbModel", false]], "periodic (abstractpotential property)": [[8, "arbdmodel.interactions.AbstractPotential.periodic", false]], "periodic (harmonicdihedral property)": [[8, "arbdmodel.interactions.HarmonicDihedral.periodic", false]], "periodic (ibidihedral property)": [[6, "arbdmodel.ibi.IBIDihedral.periodic", false]], "pointparticle (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.PointParticle", false]], "polymerbeads (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerBeads", false]], "polymergroup (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerGroup", false]], "polymermodel (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerModel", false]], "polymersection (class in arbdmodel.polymer)": [[15, "arbdmodel.polymer.PolymerSection", false]], "potential() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.potential", false]], "potential() (abstractpotential method)": [[8, "arbdmodel.interactions.AbstractPotential.potential", false]], "potential() (boundarypotential method)": [[8, "arbdmodel.interactions.BoundaryPotential.potential", false]], "potential() (halfharmonic method)": [[8, "arbdmodel.interactions.HalfHarmonic.potential", false]], "potential() (harmonicbond method)": [[8, "arbdmodel.interactions.HarmonicBond.potential", false]], "potential() (harmonicbondedpotential method)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.potential", false]], "potential() (hpsnonbonded method)": [[10, "arbdmodel.hps_polymer_model.HpsNonbonded.potential", false]], "potential() (khnonbonded method)": [[12, "arbdmodel.kh_polymer_model.KhNonbonded.potential", false]], "potential() (lennardjones method)": [[8, "arbdmodel.interactions.LennardJones.potential", false]], "potential() (linearbond method)": [[16, "arbdmodel.sali_polymer_model.LinearBond.potential", false]], "potential() (mpipinonbonded method)": [[13, "arbdmodel.mpipi_polymer.MpipiNonbonded.potential", false]], "potential() (nullpotential method)": [[8, "arbdmodel.interactions.NullPotential.potential", false]], "potential() (oncknonbonded method)": [[14, "arbdmodel.onck_polymer_model.OnckNonbonded.potential", false]], "potential() (salinonbonded method)": [[16, "arbdmodel.sali_polymer_model.SaliNonbonded.potential", false]], "potential() (shapecgnonbonded method)": [[26, "arbdmodel.shape_cg.ShapeCGNonbonded.potential", false]], "potential() (tabulatednonbonded method)": [[8, "arbdmodel.interactions.TabulatedNonbonded.potential", false]], "potential() (wlcskangle method)": [[8, "arbdmodel.interactions.WLCSKAngle.potential", false]], "potential() (wlcskbond method)": [[8, "arbdmodel.interactions.WLCSKBond.potential", false]], "prepare_for_simulation() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.prepare_for_simulation", false]], "process() (staticobject method)": [[24, "arbdmodel.structure_rigidbody.StaticObject.process", false]], "process_mesh_file() (in module arbdmodel.mesh_process_volume)": [[20, "arbdmodel.mesh_process_volume.process_mesh_file", false]], "process_structure() (structureprocessor method)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor.process_structure", false]], "process_surface_mesh() (in module arbdmodel.mesh_process_surface)": [[19, "arbdmodel.mesh_process_surface.process_surface_mesh", false]], "quaternion_exp() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_exp", false]], "quaternion_from_matrix() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_from_matrix", false]], "quaternion_inverse() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_inverse", false]], "quaternion_product() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_product", false]], "quaternion_slerp() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_slerp", false]], "quaternion_to_matrix() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.quaternion_to_matrix", false]], "radiusdof (class in arbdmodel.ibi)": [[6, "arbdmodel.ibi.RadiusDof", false]], "range_ (abstractpotential property)": [[8, "arbdmodel.interactions.AbstractPotential.range_", false]], "read_arbd_coordinates() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.read_arbd_coordinates", false]], "read_average_arbd_coordinates() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.read_average_arbd_coordinates", false]], "read_cg_potential() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.read_cg_potential", false]], "read_files() (in module arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.read_files", false]], "read_release_version() (in module arbdmodel.version)": [[35, "arbdmodel.version.read_release_version", false]], "read_version_file() (in module arbdmodel.version)": [[35, "arbdmodel.version.read_version_file", false]], "readarbdcoords() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.readArbdCoords", false]], "readavgarbdcoords() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.readAvgArbdCoords", false]], "remove() (parent method)": [[1, "arbdmodel.core_objects.Parent.remove", false]], "remove_monomers() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.remove_monomers", false]], "replace_false_with_distance() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.replace_false_with_distance", false]], "rigidbody (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.RigidBody", false]], "rigidbodytype (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.RigidBodyType", false]], "rotate() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.rotate", false]], "rotate() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.rotate", false]], "rotate() (transformable method)": [[1, "arbdmodel.core_objects.Transformable.rotate", false]], "rotationaboutaxis() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.rotationAboutAxis", false]], "run_calculation() (apbsrunner method)": [[27, "arbdmodel.engine.APBSRunner.run_calculation", false]], "run_calculation() (hydroprorunner method)": [[27, "arbdmodel.engine.HydroProRunner.run_calculation", false]], "run_from_minimized() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.run_from_minimized", false]], "run_ibi() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.run_IBI", false]], "run_minimization() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.run_minimization", false]], "run_simulation() (simplearbdconfig method)": [[22, "arbdmodel.simplearbd.SimpleArbdConfig.run_simulation", false]], "run_simulation() (simplearbdengine method)": [[24, "arbdmodel.structure_rigidbody.SimpleArbdEngine.run_simulation", false]], "salibeadsfrompolymer (class in arbdmodel.sali_polymer_model)": [[16, "arbdmodel.sali_polymer_model.SaliBeadsFromPolymer", false]], "salimodel (class in arbdmodel.sali_polymer_model)": [[16, "arbdmodel.sali_polymer_model.SaliModel", false]], "salinonbonded (class in arbdmodel.sali_polymer_model)": [[16, "arbdmodel.sali_polymer_model.SaliNonbonded", false]], "save_aligned_mesh() (meshprocessor method)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.save_aligned_mesh", false]], "save_aligned_mesh() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh", false]], "save_aligned_mesh_both_formats() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_aligned_mesh_both_formats", false]], "save_as_pdb() (meshprocessor method)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.save_as_pdb", false]], "save_as_pdb() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.save_as_pdb", false]], "set_binary() (simconf method)": [[4, "arbdmodel.sim_config.SimConf.set_binary", false]], "set_connection() (location method)": [[15, "arbdmodel.polymer.Location.set_connection", false]], "set_damping_coefficient() (fjcmodel method)": [[9, "arbdmodel.fjc_polymer_model.FjcModel.set_damping_coefficient", false]], "set_damping_coefficient() (hpsmodel method)": [[10, "arbdmodel.hps_polymer_model.HpsModel.set_damping_coefficient", false]], "set_damping_coefficient() (khmodel method)": [[12, "arbdmodel.kh_polymer_model.KhModel.set_damping_coefficient", false]], "set_damping_coefficient() (mpipimodel method)": [[13, "arbdmodel.mpipi_polymer.MpipiModel.set_damping_coefficient", false]], "set_damping_coefficient() (onckmodel method)": [[14, "arbdmodel.onck_polymer_model.OnckModel.set_damping_coefficient", false]], "set_orientation_splines() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.set_orientation_splines", false]], "set_splines() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.set_splines", false]], "setup_and_run() (shapecgmodel method)": [[26, "arbdmodel.shape_cg.ShapeCGModel.setup_and_run", false]], "setup_diffusible_objects() (simplearbdconfig method)": [[22, "arbdmodel.simplearbd.SimpleArbdConfig.setup_diffusible_objects", false]], "setup_static_objects() (simplearbdconfig method)": [[22, "arbdmodel.simplearbd.SimpleArbdConfig.setup_static_objects", false]], "shapecgfactory (class in arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.ShapeCGFactory", false]], "shapecgmodel (class in arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.ShapeCGModel", false]], "shapecgnonbonded (class in arbdmodel.shape_cg)": [[26, "arbdmodel.shape_cg.ShapeCGNonbonded", false]], "simconf (class in arbdmodel.sim_config)": [[4, "arbdmodel.sim_config.SimConf", false]], "simengine (class in arbdmodel.engine)": [[27, "arbdmodel.engine.SimEngine", false]], "simplearbdconfig (class in arbdmodel.simplearbd)": [[22, "arbdmodel.simplearbd.SimpleArbdConfig", false]], "simplearbdengine (class in arbdmodel.structure_rigidbody)": [[24, "arbdmodel.structure_rigidbody.SimpleArbdEngine", false]], "simulate() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.simulate", false]], "simulate() (parmedarbd method)": [[29, "arbdmodel.parmed_bd.ParmedArbd.simulate", false]], "simulate() (simengine method)": [[27, "arbdmodel.engine.SimEngine.simulate", false]], "slab_potential_z() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.slab_potential_z", false]], "spherical_confinement() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.spherical_confinement", false]], "spring_constant (hpsmodel attribute)": [[10, "arbdmodel.hps_polymer_model.HpsModel.spring_constant", false]], "spring_constant (khmodel attribute)": [[12, "arbdmodel.kh_polymer_model.KhModel.spring_constant", false]], "spring_constant (mpipimodel attribute)": [[13, "arbdmodel.mpipi_polymer.MpipiModel.spring_constant", false]], "staticobject (class in arbdmodel.structure_rigidbody)": [[24, "arbdmodel.structure_rigidbody.StaticObject", false]], "structureprocessor (class in arbdmodel.structure_from_pdb)": [[23, "arbdmodel.structure_from_pdb.StructureProcessor", false]], "structurerigidbodymodel (class in arbdmodel.structure_rigidbody)": [[24, "arbdmodel.structure_rigidbody.StructureRigidBodyModel", false]], "surfacemeshprocessor (class in arbdmodel.mesh_process_surface)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor", false]], "tabulatednonbonded (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.TabulatedNonbonded", false]], "temperature (defaultsimconf property)": [[4, "arbdmodel.sim_config.DefaultSimConf.temperature", false]], "temperature (simconf property)": [[4, "arbdmodel.sim_config.SimConf.temperature", false]], "test_average_grids() (testaveragegrids method)": [[32, "arbdmodel.grid.TestAverageGrids.test_average_grids", false]], "testaveragegrids (class in arbdmodel.grid)": [[32, "arbdmodel.grid.TestAverageGrids", false]], "transform() (transformable method)": [[1, "arbdmodel.core_objects.Transformable.transform", false]], "transformable (class in arbdmodel.core_objects)": [[1, "arbdmodel.core_objects.Transformable", false]], "translate() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.translate", false]], "translate() (polymersection method)": [[15, "arbdmodel.polymer.PolymerSection.translate", false]], "translate() (transformable method)": [[1, "arbdmodel.core_objects.Transformable.translate", false]], "type_ (harmonicangle property)": [[8, "arbdmodel.interactions.HarmonicAngle.type_", false]], "type_ (harmonicbond property)": [[8, "arbdmodel.interactions.HarmonicBond.type_", false]], "type_ (harmonicbondedpotential property)": [[8, "arbdmodel.interactions.HarmonicBondedPotential.type_", false]], "type_ (harmonicdihedral property)": [[8, "arbdmodel.interactions.HarmonicDihedral.type_", false]], "type_ (harmonicvectorangle property)": [[8, "arbdmodel.interactions.HarmonicVectorAngle.type_", false]], "type_ (wlcskangle property)": [[8, "arbdmodel.interactions.WLCSKAngle.type_", false]], "type_ (wlcskbond property)": [[8, "arbdmodel.interactions.WLCSKBond.type_", false]], "unit_quat_conversions() (in module arbdmodel.coords)": [[31, "arbdmodel.coords.unit_quat_conversions", false]], "update() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.update", false]], "update() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.update", false]], "update_splines() (polymermodel method)": [[15, "arbdmodel.polymer.PolymerModel.update_splines", false]], "update_splines() (salimodel method)": [[16, "arbdmodel.sali_polymer_model.SaliModel.update_splines", false]], "usenonbondedscheme() (arbdmodel method)": [[3, "arbdmodel.model.ArbdModel.useNonbondedScheme", false]], "vmd_cylinder_tcl() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.vmd_cylinder_tcl", false]], "vmd_tube_tcl() (polymergroup method)": [[15, "arbdmodel.polymer.PolymerGroup.vmd_tube_tcl", false]], "wlcskangle (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.WLCSKAngle", false]], "wlcskbond (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.WLCSKBond", false]], "wlcskpotential (class in arbdmodel.interactions)": [[8, "arbdmodel.interactions.WLCSKPotential", false]], "wrap_vector() (degreeoffreedom method)": [[6, "arbdmodel.ibi.DegreeOfFreedom.wrap_vector", false]], "write_cg_potential() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.write_cg_potential", false]], "write_conf() (namdengine method)": [[27, "arbdmodel.engine.NamdEngine.write_conf", false]], "write_config() (apbsrunner method)": [[27, "arbdmodel.engine.APBSRunner.write_config", false]], "write_config() (hydroprorunner method)": [[27, "arbdmodel.engine.HydroProRunner.write_config", false]], "write_confine_dx() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.write_confine_dx", false]], "write_file() (abstractibipotential method)": [[6, "arbdmodel.ibi.AbstractIBIpotential.write_file", false]], "write_file() (abstractpotential method)": [[8, "arbdmodel.interactions.AbstractPotential.write_file", false]], "write_file() (boundarypotential method)": [[8, "arbdmodel.interactions.BoundaryPotential.write_file", false]], "write_file() (ibinonbonded method)": [[6, "arbdmodel.ibi.IBINonbonded.write_file", false]], "write_file() (tabulatednonbonded method)": [[8, "arbdmodel.interactions.TabulatedNonbonded.write_file", false]], "write_no_enter_potential() (meshprocessor method)": [[20, "arbdmodel.mesh_process_volume.MeshProcessor.write_no_enter_potential", false]], "write_no_enter_potential_dx() (surfacemeshprocessor method)": [[19, "arbdmodel.mesh_process_surface.SurfaceMeshProcessor.write_no_enter_potential_dx", false]], "write_pdb() (pdbmodel method)": [[3, "arbdmodel.model.PdbModel.write_pdb", false]], "write_pqr() (pdbmodel method)": [[3, "arbdmodel.model.PdbModel.write_pqr", false]], "write_psf() (pdbmodel method)": [[3, "arbdmodel.model.PdbModel.write_psf", false]], "write_release_version() (in module arbdmodel.version)": [[35, "arbdmodel.version.write_release_version", false]], "write_restraint_files() (parmedarbd method)": [[29, "arbdmodel.parmed_bd.ParmedArbd.write_restraint_files", false]], "write_simulation_files() (arbdengine method)": [[27, "arbdmodel.engine.ArbdEngine.write_simulation_files", false]], "write_simulation_files() (namdengine method)": [[27, "arbdmodel.engine.NamdEngine.write_simulation_files", false]], "write_simulation_files() (simengine method)": [[27, "arbdmodel.engine.SimEngine.write_simulation_files", false]], "write_simulation_files() (simplearbdengine method)": [[24, "arbdmodel.structure_rigidbody.SimpleArbdEngine.write_simulation_files", false]], "writedx() (in module arbdmodel.grid)": [[32, "arbdmodel.grid.writeDx", false]]}, "objects": {"arbdmodel": [[30, 0, 0, "-", "binary_manager"], [31, 0, 0, "-", "coords"], [1, 0, 0, "-", "core_objects"], [27, 0, 0, "-", "engine"], [9, 0, 0, "-", "fjc_polymer_model"], [32, 0, 0, "-", "grid"], [10, 0, 0, "-", "hps_polymer_model"], [6, 0, 0, "-", "ibi"], [8, 0, 0, "-", "interactions"], [12, 0, 0, "-", "kh_polymer_model"], [34, 0, 0, "-", "logger"], [19, 0, 0, "-", "mesh_process_surface"], [20, 0, 0, "-", "mesh_process_volume"], [21, 0, 0, "-", "mesh_rigidbody"], [3, 0, 0, "-", "model"], [13, 0, 0, "-", "mpipi_polymer"], [14, 0, 0, "-", "onck_polymer_model"], [29, 0, 0, "-", "parmed_bd"], [15, 0, 0, "-", "polymer"], [16, 0, 0, "-", "sali_polymer_model"], [26, 0, 0, "-", "shape_cg"], [4, 0, 0, "-", "sim_config"], [22, 0, 0, "-", "simplearbd"], [17, 0, 0, "-", "ssdna_two_bead"], [23, 0, 0, "-", "structure_from_pdb"], [24, 0, 0, "-", "structure_rigidbody"], [35, 0, 0, "-", "version"]], "arbdmodel.binary_manager": [[30, 1, 1, "", "initialize_binary_paths"]], "arbdmodel.coords": [[31, 1, 1, "", "Generate_coordinates"], [31, 1, 1, "", "Generate_spanning_vectors"], [31, 1, 1, "", "calculate_dimensions_from_cell_vectors"], [31, 1, 1, "", "minimizeRmsd"], [31, 1, 1, "", "quaternion_exp"], [31, 1, 1, "", "quaternion_from_matrix"], [31, 1, 1, "", "quaternion_inverse"], [31, 1, 1, "", "quaternion_product"], [31, 1, 1, "", "quaternion_slerp"], [31, 1, 1, "", "quaternion_to_matrix"], [31, 1, 1, "", "readArbdCoords"], [31, 1, 1, "", "readAvgArbdCoords"], [31, 1, 1, "", "read_arbd_coordinates"], [31, 1, 1, "", "read_average_arbd_coordinates"], [31, 1, 1, "", "rotationAboutAxis"], [31, 1, 1, "", "unit_quat_conversions"]], "arbdmodel.core_objects": [[1, 2, 1, "", "Child"], [1, 2, 1, "", "Clone"], [1, 2, 1, "", "Group"], [1, 2, 1, "", "GroupSite"], [1, 2, 1, "", "Parent"], [1, 2, 1, "", "ParticleType"], [1, 2, 1, "", "PointParticle"], [1, 2, 1, "", "RigidBody"], [1, 2, 1, "", "RigidBodyType"], [1, 2, 1, "", "Transformable"]], "arbdmodel.core_objects.Clone": [[1, 3, 1, "", "get_original_recursively"]], "arbdmodel.core_objects.Group": [[1, 3, 1, "", "clone"], [1, 3, 1, "", "duplicate"]], "arbdmodel.core_objects.GroupSite": [[1, 3, 1, "", "add_restraint"], [1, 3, 1, "", "get_center"], [1, 3, 1, "", "get_restraints"]], "arbdmodel.core_objects.Parent": [[1, 3, 1, "", "add"], [1, 3, 1, "", "add_angle"], [1, 3, 1, "", "add_bond"], [1, 3, 1, "", "add_bond_angle"], [1, 3, 1, "", "add_dihedral"], [1, 3, 1, "", "add_exclusion"], [1, 3, 1, "", "add_improper"], [1, 3, 1, "", "add_product_potential"], [1, 3, 1, "", "add_vector_angle"], [1, 3, 1, "", "clear_all"], [1, 3, 1, "", "get_angles"], [1, 3, 1, "", "get_bond_angles"], [1, 3, 1, "", "get_bonds"], [1, 3, 1, "", "get_center"], [1, 3, 1, "", "get_dihedrals"], [1, 3, 1, "", "get_exclusions"], [1, 3, 1, "", "get_impropers"], [1, 3, 1, "", "get_product_potentials"], [1, 3, 1, "", "get_restraints"], [1, 3, 1, "", "get_vector_angles"], [1, 3, 1, "", "index"], [1, 3, 1, "", "insert"], [1, 3, 1, "", "remove"]], "arbdmodel.core_objects.ParticleType": [[1, 3, 1, "", "add_grid_potential"], [1, 4, 1, "", "excludedAttributes"], [1, 3, 1, "", "is_same_type"]], "arbdmodel.core_objects.PointParticle": [[1, 3, 1, "", "add_grid_potential"], [1, 3, 1, "", "add_restraint"], [1, 3, 1, "", "duplicate"], [1, 3, 1, "", "get_restraints"]], "arbdmodel.core_objects.RigidBody": [[1, 3, 1, "", "add_restraint"], [1, 3, 1, "", "duplicate"], [1, 3, 1, "", "get_restraints"]], "arbdmodel.core_objects.RigidBodyType": [[1, 3, 1, "", "attach_particle"]], "arbdmodel.core_objects.Transformable": [[1, 3, 1, "", "applyOrientation"], [1, 3, 1, "", "get_collapsed_position"], [1, 3, 1, "", "rotate"], [1, 3, 1, "", "transform"], [1, 3, 1, "", "translate"]], "arbdmodel.engine": [[27, 2, 1, "", "APBSRunner"], [27, 2, 1, "", "ArbdEngine"], [27, 2, 1, "", "HydroProRunner"], [27, 2, 1, "", "NamdEngine"], [27, 2, 1, "", "SimEngine"]], "arbdmodel.engine.APBSRunner": [[27, 3, 1, "", "run_calculation"], [27, 3, 1, "", "write_config"]], "arbdmodel.engine.ArbdEngine": [[27, 5, 1, "", "default_binary"], [27, 3, 1, "", "get_default_conf"], [27, 3, 1, "", "write_simulation_files"]], "arbdmodel.engine.HydroProRunner": [[27, 3, 1, "", "parse_output"], [27, 3, 1, "", "run_calculation"], [27, 3, 1, "", "write_config"]], "arbdmodel.engine.NamdEngine": [[27, 5, 1, "", "default_binary"], [27, 3, 1, "", "get_default_conf"], [27, 3, 1, "", "write_conf"], [27, 3, 1, "", "write_simulation_files"]], "arbdmodel.engine.SimEngine": [[27, 5, 1, "", "default_binary"], [27, 3, 1, "", "get_default_conf"], [27, 3, 1, "", "simulate"], [27, 3, 1, "", "write_simulation_files"]], "arbdmodel.fjc_polymer_model": [[9, 2, 1, "", "FjcBeadsFromPolymer"], [9, 2, 1, "", "FjcModel"]], "arbdmodel.fjc_polymer_model.FjcModel": [[9, 3, 1, "", "set_damping_coefficient"]], "arbdmodel.grid": [[32, 1, 1, "", "Bound_grid"], [32, 1, 1, "", "Create_null"], [32, 2, 1, "", "TestAverageGrids"], [32, 1, 1, "", "add_smaller_grid"], [32, 1, 1, "", "average_grids"], [32, 1, 1, "", "constant_force"], [32, 1, 1, "", "convolve_kernel_truncate"], [32, 1, 1, "", "create_bounding_grid"], [32, 1, 1, "", "fill_nans"], [32, 1, 1, "", "gaussian_kernel"], [32, 1, 1, "", "get_slice_enclosing_smaller_grid"], [32, 1, 1, "", "isotropic_kernel"], [32, 1, 1, "", "loadGrid"], [32, 1, 1, "", "neighborhood_average"], [32, 1, 1, "", "replace_false_with_distance"], [32, 1, 1, "", "slab_potential_z"], [32, 1, 1, "", "spherical_confinement"], [32, 1, 1, "", "writeDx"], [32, 1, 1, "", "write_confine_dx"]], "arbdmodel.grid.TestAverageGrids": [[32, 3, 1, "", "test_average_grids"]], "arbdmodel.hps_polymer_model": [[10, 2, 1, "", "HpsBeads"], [10, 2, 1, "", "HpsModel"], [10, 2, 1, "", "HpsNonbonded"]], "arbdmodel.hps_polymer_model.HpsModel": [[10, 3, 1, "", "set_damping_coefficient"], [10, 4, 1, "", "spring_constant"]], "arbdmodel.hps_polymer_model.HpsNonbonded": [[10, 3, 1, "", "potential"]], "arbdmodel.ibi": [[6, 2, 1, "", "AbstractIBIpotential"], [6, 2, 1, "", "AngleDof"], [6, 2, 1, "", "BondAngleDof"], [6, 2, 1, "", "BondDof"], [6, 2, 1, "", "DegreeOfFreedom"], [6, 2, 1, "", "DihedralDof"], [6, 2, 1, "", "IBIAngle"], [6, 2, 1, "", "IBIBond"], [6, 2, 1, "", "IBIDihedral"], [6, 2, 1, "", "IBINonbonded"], [6, 2, 1, "", "PairDistributionDof"], [6, 2, 1, "", "RadiusDof"]], "arbdmodel.ibi.AbstractIBIpotential": [[6, 3, 1, "", "filename"], [6, 3, 1, "", "get_cg_distribution"], [6, 3, 1, "", "get_target_distribution"], [6, 3, 1, "", "potential"], [6, 3, 1, "", "read_cg_potential"], [6, 3, 1, "", "write_cg_potential"], [6, 3, 1, "", "write_file"]], "arbdmodel.ibi.AngleDof": [[6, 3, 1, "", "compute_volume"]], "arbdmodel.ibi.BondDof": [[6, 3, 1, "", "compute_volume"]], "arbdmodel.ibi.DegreeOfFreedom": [[6, 3, 1, "", "compute_volume"], [6, 3, 1, "", "get_values"], [6, 3, 1, "", "wrap_vector"]], "arbdmodel.ibi.IBIDihedral": [[6, 5, 1, "", "periodic"]], "arbdmodel.ibi.IBINonbonded": [[6, 3, 1, "", "write_file"]], "arbdmodel.ibi.PairDistributionDof": [[6, 3, 1, "", "compute_volume"], [6, 3, 1, "", "get_values"]], "arbdmodel.ibi.RadiusDof": [[6, 3, 1, "", "compute_volume"]], "arbdmodel.interactions": [[8, 2, 1, "", "AbstractPotential"], [8, 2, 1, "", "BoundaryPotential"], [8, 2, 1, "", "HalfHarmonic"], [8, 2, 1, "", "HarmonicAngle"], [8, 2, 1, "", "HarmonicBond"], [8, 2, 1, "", "HarmonicBondedPotential"], [8, 2, 1, "", "HarmonicDihedral"], [8, 2, 1, "", "HarmonicVectorAngle"], [8, 2, 1, "", "LennardJones"], [8, 2, 1, "", "NullPotential"], [8, 2, 1, "", "TabulatedNonbonded"], [8, 2, 1, "", "WLCSKAngle"], [8, 2, 1, "", "WLCSKBond"], [8, 2, 1, "", "WLCSKPotential"]], "arbdmodel.interactions.AbstractPotential": [[8, 3, 1, "", "filename"], [8, 5, 1, "", "periodic"], [8, 3, 1, "", "potential"], [8, 5, 1, "", "range_"], [8, 3, 1, "", "write_file"]], "arbdmodel.interactions.BoundaryPotential": [[8, 3, 1, "", "potential"], [8, 3, 1, "", "write_file"]], "arbdmodel.interactions.HalfHarmonic": [[8, 3, 1, "", "potential"]], "arbdmodel.interactions.HarmonicAngle": [[8, 5, 1, "", "kscale"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicBond": [[8, 5, 1, "", "kscale"], [8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicBondedPotential": [[8, 3, 1, "", "filename"], [8, 5, 1, "", "kscale"], [8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicDihedral": [[8, 5, 1, "", "kscale"], [8, 5, 1, "", "periodic"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.HarmonicVectorAngle": [[8, 5, 1, "", "kscale"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.LennardJones": [[8, 3, 1, "", "potential"]], "arbdmodel.interactions.NullPotential": [[8, 3, 1, "", "filename"], [8, 3, 1, "", "potential"]], "arbdmodel.interactions.TabulatedNonbonded": [[8, 3, 1, "", "potential"], [8, 3, 1, "", "write_file"]], "arbdmodel.interactions.WLCSKAngle": [[8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.WLCSKBond": [[8, 3, 1, "", "potential"], [8, 5, 1, "", "type_"]], "arbdmodel.interactions.WLCSKPotential": [[8, 3, 1, "", "filename"]], "arbdmodel.kh_polymer_model": [[12, 2, 1, "", "KhBeads"], [12, 2, 1, "", "KhModel"], [12, 2, 1, "", "KhNonbonded"]], "arbdmodel.kh_polymer_model.KhModel": [[12, 3, 1, "", "set_damping_coefficient"], [12, 4, 1, "", "spring_constant"]], "arbdmodel.kh_polymer_model.KhNonbonded": [[12, 3, 1, "", "potential"]], "arbdmodel.logger": [[34, 1, 1, "", "get_resource_path"]], "arbdmodel.mesh_process_surface": [[19, 2, 1, "", "SurfaceMeshProcessor"], [19, 1, 1, "", "process_surface_mesh"]], "arbdmodel.mesh_process_surface.SurfaceMeshProcessor": [[19, 4, 1, "", "MICRON_TO_ANGSTROM"], [19, 3, 1, "", "calculate_damping"], [19, 3, 1, "", "generate_potential_grid"], [19, 3, 1, "", "get_attached_particles"], [19, 3, 1, "", "save_aligned_mesh"], [19, 3, 1, "", "save_aligned_mesh_both_formats"], [19, 3, 1, "", "save_as_pdb"], [19, 3, 1, "", "write_no_enter_potential_dx"]], "arbdmodel.mesh_process_volume": [[20, 2, 1, "", "MeshProcessor"], [20, 1, 1, "", "process_mesh_file"]], "arbdmodel.mesh_process_volume.MeshProcessor": [[20, 4, 1, "", "MICRON_TO_ANGSTROM"], [20, 3, 1, "", "calculate_damping"], [20, 3, 1, "", "generate_potential_grid"], [20, 3, 1, "", "get_attached_particles"], [20, 3, 1, "", "save_aligned_mesh"], [20, 3, 1, "", "save_as_pdb"], [20, 3, 1, "", "write_no_enter_potential"]], "arbdmodel.mesh_rigidbody": [[21, 2, 1, "", "MeshRigidBodyType"]], "arbdmodel.model": [[3, 2, 1, "", "ArbdModel"], [3, 2, 1, "", "PdbModel"]], "arbdmodel.model.ArbdModel": [[3, 3, 1, "", "add"], [3, 3, 1, "", "add_group_site"], [3, 3, 1, "", "add_nonbonded_interaction"], [3, 3, 1, "", "assign_IBI_degrees_of_freedom"], [3, 3, 1, "", "clear_all"], [3, 3, 1, "", "dimensions_from_structure"], [3, 3, 1, "", "extend"], [3, 3, 1, "", "getParticleTypesAndCounts"], [3, 3, 1, "", "load_target_IBI_distributions"], [3, 3, 1, "", "prepare_for_simulation"], [3, 3, 1, "", "run_IBI"], [3, 3, 1, "", "simulate"], [3, 3, 1, "", "update"], [3, 3, 1, "", "useNonbondedScheme"]], "arbdmodel.model.PdbModel": [[3, 3, 1, "", "write_pdb"], [3, 3, 1, "", "write_pqr"], [3, 3, 1, "", "write_psf"]], "arbdmodel.mpipi_polymer": [[13, 2, 1, "", "MpipiBeads"], [13, 2, 1, "", "MpipiModel"], [13, 2, 1, "", "MpipiNonbonded"]], "arbdmodel.mpipi_polymer.MpipiModel": [[13, 3, 1, "", "set_damping_coefficient"], [13, 4, 1, "", "spring_constant"]], "arbdmodel.mpipi_polymer.MpipiNonbonded": [[13, 3, 1, "", "potential"]], "arbdmodel.onck_polymer_model": [[14, 2, 1, "", "OnckBeads"], [14, 2, 1, "", "OnckModel"], [14, 2, 1, "", "OnckNonbonded"]], "arbdmodel.onck_polymer_model.OnckModel": [[14, 3, 1, "", "set_damping_coefficient"]], "arbdmodel.onck_polymer_model.OnckNonbonded": [[14, 3, 1, "", "potential"]], "arbdmodel.parmed_bd": [[29, 2, 1, "", "ParmedArbd"]], "arbdmodel.parmed_bd.ParmedArbd": [[29, 4, 1, "", "atom_types"], [29, 4, 1, "", "atoms_map"], [29, 3, 1, "", "convert_sod_to_mg"], [29, 3, 1, "", "create_dual_topology"], [29, 3, 1, "", "create_dual_topology_model"], [29, 3, 1, "", "load_structure"], [29, 4, 1, "", "parmed_structure"], [29, 3, 1, "", "simulate"], [29, 3, 1, "", "write_restraint_files"]], "arbdmodel.polymer": [[15, 2, 1, "", "ConnectableElement"], [15, 2, 1, "", "Connection"], [15, 2, 1, "", "Location"], [15, 2, 1, "", "PolymerBeads"], [15, 2, 1, "", "PolymerGroup"], [15, 2, 1, "", "PolymerModel"], [15, 2, 1, "", "PolymerSection"]], "arbdmodel.polymer.ConnectableElement": [[15, 3, 1, "", "get_connections_and_locations"], [15, 3, 1, "", "get_location_at"], [15, 3, 1, "", "get_locations"]], "arbdmodel.polymer.Connection": [[15, 3, 1, "", "delete"], [15, 3, 1, "", "other"]], "arbdmodel.polymer.Location": [[15, 3, 1, "", "get_connected_location"], [15, 3, 1, "", "get_monomer_index"], [15, 3, 1, "", "set_connection"]], "arbdmodel.polymer.PolymerBeads": [[15, 5, 1, "", "monomers_per_bead_group"], [15, 5, 1, "", "num_bead_groups"]], "arbdmodel.polymer.PolymerGroup": [[15, 3, 1, "", "add_grid_potential"], [15, 3, 1, "", "dimensions_from_structure"], [15, 3, 1, "", "extend"], [15, 3, 1, "", "get_center"], [15, 3, 1, "", "get_connections"], [15, 3, 1, "", "rotate"], [15, 3, 1, "", "translate"], [15, 3, 1, "", "update"], [15, 3, 1, "", "vmd_cylinder_tcl"], [15, 3, 1, "", "vmd_tube_tcl"]], "arbdmodel.polymer.PolymerModel": [[15, 3, 1, "", "generate_beads"], [15, 3, 1, "", "update_splines"]], "arbdmodel.polymer.PolymerSection": [[15, 3, 1, "", "add_location"], [15, 3, 1, "", "contour_to_monomer_index"], [15, 3, 1, "", "contour_to_orientation"], [15, 3, 1, "", "contour_to_position"], [15, 3, 1, "", "contour_to_tangent"], [15, 3, 1, "", "get_center"], [15, 3, 1, "", "get_contour_sorted_connections_and_locations"], [15, 3, 1, "", "insert_monomers"], [15, 3, 1, "", "iterate_connections_and_locations"], [15, 3, 1, "", "monomer_index_to_contour"], [15, 3, 1, "", "remove_monomers"], [15, 3, 1, "", "rotate"], [15, 3, 1, "", "set_orientation_splines"], [15, 3, 1, "", "set_splines"], [15, 3, 1, "", "translate"]], "arbdmodel.sali_polymer_model": [[16, 2, 1, "", "LinearBond"], [16, 2, 1, "", "SaliBeadsFromPolymer"], [16, 2, 1, "", "SaliModel"], [16, 2, 1, "", "SaliNonbonded"]], "arbdmodel.sali_polymer_model.LinearBond": [[16, 3, 1, "", "potential"]], "arbdmodel.sali_polymer_model.SaliModel": [[16, 3, 1, "", "generate_beads"], [16, 3, 1, "", "update_splines"]], "arbdmodel.sali_polymer_model.SaliNonbonded": [[16, 3, 1, "", "potential"]], "arbdmodel.shape_cg": [[26, 2, 1, "", "ShapeCGFactory"], [26, 2, 1, "", "ShapeCGModel"], [26, 2, 1, "", "ShapeCGNonbonded"], [26, 1, 1, "", "find_shape_based_sites"], [26, 1, 1, "", "get_particle_assignments"], [26, 1, 1, "", "read_files"]], "arbdmodel.shape_cg.ShapeCGFactory": [[26, 3, 1, "", "calc_atom_sasa"], [26, 3, 1, "", "generate_protein"], [26, 3, 1, "", "get_coarse_protein"], [26, 3, 1, "", "get_coarse_types"]], "arbdmodel.shape_cg.ShapeCGModel": [[26, 3, 1, "", "add_confinement"], [26, 3, 1, "", "add_protein_nb_interactions"], [26, 3, 1, "", "add_proteins"], [26, 3, 1, "", "calculate_total_mass"], [26, 3, 1, "", "concentration_to_debye_length"], [26, 3, 1, "", "from_protein_list"], [26, 3, 1, "", "generate_random_protein_positions"], [26, 3, 1, "", "get_protein_types"], [26, 3, 1, "", "run_from_minimized"], [26, 3, 1, "", "run_minimization"], [26, 3, 1, "", "setup_and_run"]], "arbdmodel.shape_cg.ShapeCGNonbonded": [[26, 3, 1, "", "filename"], [26, 3, 1, "", "potential"]], "arbdmodel.sim_config": [[4, 2, 1, "", "DefaultSimConf"], [4, 2, 1, "", "SimConf"]], "arbdmodel.sim_config.DefaultSimConf": [[4, 5, 1, "", "temperature"]], "arbdmodel.sim_config.SimConf": [[4, 3, 1, "", "combine"], [4, 3, 1, "", "get_binary"], [4, 3, 1, "", "items"], [4, 3, 1, "", "set_binary"], [4, 5, 1, "", "temperature"]], "arbdmodel.simplearbd": [[22, 2, 1, "", "SimpleArbdConfig"], [22, 1, 1, "", "main"]], "arbdmodel.simplearbd.SimpleArbdConfig": [[22, 3, 1, "", "create_engine"], [22, 3, 1, "", "create_model"], [22, 3, 1, "", "run_simulation"], [22, 3, 1, "", "setup_diffusible_objects"], [22, 3, 1, "", "setup_static_objects"]], "arbdmodel.ssdna_two_bead": [[17, 2, 1, "", "DnaModel"], [17, 2, 1, "", "DnaStrandBeads"]], "arbdmodel.ssdna_two_bead.DnaStrandBeads": [[17, 4, 1, "", "b"], [17, 4, 1, "", "nt"], [17, 4, 1, "", "p"]], "arbdmodel.structure_from_pdb": [[23, 2, 1, "", "StructureProcessor"]], "arbdmodel.structure_from_pdb.StructureProcessor": [[23, 3, 1, "", "align_structure"], [23, 3, 1, "", "apply_gaussian_smoothing"], [23, 3, 1, "", "calculate_hydrodynamic_properties"], [23, 3, 1, "", "generate_charge_distribution"], [23, 3, 1, "", "generate_electrostatic_map"], [23, 3, 1, "", "generate_vdw_maps"], [23, 3, 1, "", "get_grid_files"], [23, 3, 1, "", "process_structure"]], "arbdmodel.structure_rigidbody": [[24, 2, 1, "", "DiffusiveRigidBodyType"], [24, 2, 1, "", "SimpleArbdEngine"], [24, 2, 1, "", "StaticObject"], [24, 2, 1, "", "StructureRigidBodyModel"]], "arbdmodel.structure_rigidbody.SimpleArbdEngine": [[24, 3, 1, "", "run_simulation"], [24, 3, 1, "", "write_simulation_files"]], "arbdmodel.structure_rigidbody.StaticObject": [[24, 3, 1, "", "process"]], "arbdmodel.structure_rigidbody.StructureRigidBodyModel": [[24, 3, 1, "", "add_diffusible_object"], [24, 3, 1, "", "add_static_object"]], "arbdmodel.version": [[35, 2, 1, "", "Citation"], [35, 1, 1, "", "call_git_describe"], [35, 1, 1, "", "check_git_repository"], [35, 1, 1, "", "get_version"], [35, 1, 1, "", "is_dirty"], [35, 1, 1, "", "read_release_version"], [35, 1, 1, "", "read_version_file"], [35, 1, 1, "", "write_release_version"]], "arbdmodel.version.Citation": [[35, 3, 1, "", "display"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property"}, "terms": {"": [0, 3, 15, 37, 38, 39, 40], "0": [1, 4, 6, 8, 10, 12, 13, 14, 16, 19, 20, 21, 23, 24, 26, 27, 31, 32, 37, 38, 39, 40], "0002": 26, "0006022142": 39, "01": [4, 19, 39], "012": 39, "014393265": 38, "0173": 37, "02": [6, 39], "0215724": 40, "025": 39, "0375960171901290": 37, "03d": 39, "05": 4, "075531386": 40, "1": [1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 19, 20, 23, 24, 27, 31, 32, 38, 40, 41], "10": [8, 10, 12, 13, 14, 16, 19, 20, 26, 32, 37, 38, 39, 40], "100": [14, 32, 37, 39], "1000": [4, 19, 20, 39], "10000": [19, 20, 21, 26], "100000": [4, 26], "1000000": 27, "100000000": 26, "1005941": 39, "1016": 40, "1021": 38, "102e": 37, "104264": 40, "10491996": 40, "1063": 8, "1098": 37, "10e": 39, "10pn": 38, "119": 37, "12": [14, 29, 32], "1234": 26, "12f": 32, "13511100": 40, "1371": 39, "14": 32, "143932": 37, "1452": 40, "1453": 40, "1454": 40, "15": [27, 39], "150": 26, "153": 40, "16": 32, "161": 40, "1627": [39, 40], "1628": [39, 40], "1629": [39, 40], "1631": [39, 40], "1632": [39, 40], "1673": [39, 40], "1674": [39, 40], "1676": [39, 40], "1678": [39, 40], "1679": [39, 40], "177": 37, "18": 32, "180": [6, 39], "189": 40, "18923208": 40, "19": [13, 19, 20, 21], "19375322": 40, "1938": 37, "196": 40, "199": 40, "1bpa": 14, "1d": 38, "1e": 39, "1e2": [37, 38], "1e3": [37, 38, 39, 40], "1e4": [3, 38, 39], "1e5": [37, 38, 40], "1e6": 39, "1e7": 39, "1eyg": 40, "1nm": 39, "2": [3, 6, 8, 10, 12, 19, 20, 23, 24, 27, 31, 32, 38, 40, 41], "20": [6, 19, 20, 26, 37, 38, 39, 40], "200": 26, "2022": 40, "209": 40, "20e": [37, 40], "20th": 39, "25": 9, "250": 39, "261090254": 40, "273": 37, "295": [4, 6, 8, 26], "298": 39, "2e": 4, "3": [4, 10, 12, 13, 14, 19, 20, 21, 23, 26, 31, 32, 38, 40], "30": 6, "300": [24, 27], "3000": 40, "3027": 40, "303": 19, "3096": 40, "345": 37, "35": 6, "3547": 40, "38": 14, "39": 37, "3900574": [10, 12], "3d": [26, 31, 38, 40], "4": [6, 32, 38, 40], "40": [4, 9, 37], "400": 26, "41": 37, "41410648823": 40, "422562": 14, "43": 39, "44": 39, "45": 39, "46": 39, "47": 39, "4800": 27, "48856": 40, "4968020": 8, "5": [3, 8, 15, 23, 26, 31, 32, 38, 40], "50": [4, 6, 16, 23, 26, 27, 38, 39], "500": [39, 40], "5000": 37, "50000": 39, "55": 39, "578277": 40, "5e6": 3, "6": [27, 32, 38, 39, 40], "60": 37, "620": 37, "6241949": 39, "6400": 37, "65": [37, 38, 39], "68320292": 40, "69": 37, "7": [13, 14, 32, 35, 38], "70": 38, "702": 27, "72621629": 40, "735": 40, "75": 39, "757": 40, "779": 40, "8": [10, 12, 13, 14, 32, 38, 39, 40], "80": 39, "831447": 39, "9": [6, 9, 27, 32, 39, 40], "90": 39, "95": [13, 37], "A": [0, 1, 15, 32, 38, 40], "And": 38, "As": [38, 39, 40], "But": 40, "For": [0, 3, 36, 37, 38, 39, 40], "If": [0, 3, 26, 29, 32, 38], "In": [1, 37, 38, 39, 40], "It": [0, 29, 32, 36, 38, 39], "No": [37, 38, 39], "On": [0, 27], "One": [38, 40], "Or": 39, "That": 38, "The": [0, 1, 3, 4, 26, 29, 32, 37, 38, 39, 40], "Their": 40, "There": [], "These": [0, 38, 39, 40], "To": [0, 36], "_": 39, "__dict__": 38, "__init__": [39, 40], "_add_nonbonded_interact": 39, "_b": 40, "_beads_per_polym": 39, "_convers": 39, "_fine_to_coars": 39, "_g": 38, "_generalized_charg": 40, "_generate_ith_bead_group": 39, "_generate_polymer_bead": 39, "_get_binari": [39, 40], "_join_adjacent_bead_group": 39, "_learn_fn": 39, "_p": 40, "_pmf_grid": 40, "_potenti": 40, "_pre": 39, "_seq": 39, "_type": 39, "_updateparticleord": 40, "aa": [37, 38, 39], "abbrev": 35, "abil": 36, "abl": 38, "about": [1, 15, 38], "abov": 38, "absolut": 39, "abstract": [8, 15, 27], "abstractibipotenti": 6, "abstractli": 38, "abstractpotenti": [6, 8, 10, 12, 13, 14, 16, 26, 37, 38], "ac": 38, "accept": [0, 32], "access": [26, 40], "accord": 40, "accur": 36, "acid": [26, 38, 39], "act": 40, "actual": [0, 26, 29, 40], "ad": [0, 26, 38, 39], "adapt": 40, "add": [1, 3, 22, 24, 26, 39, 40], "add_angl": [1, 39], "add_ball_and_stick": [37, 38], "add_bond": [1, 37, 39], "add_bond_angl": 1, "add_confin": 26, "add_diffusible_object": 24, "add_dihedr": 1, "add_exclus": [1, 39], "add_grid_potenti": [1, 15, 38], "add_group_sit": [3, 38], "add_improp": 1, "add_loc": 15, "add_nonbonded_interact": [3, 37, 38, 39], "add_product_potenti": 1, "add_protein": 26, "add_protein_nb_interact": 26, "add_restraint": [1, 38, 39, 40], "add_smaller_grid": 32, "add_static_object": 24, "add_vector_angl": 1, "addit": [19, 20, 24, 26, 29, 31, 40], "address": 0, "adjac": 39, "adjust": [38, 39], "adna": 38, "advanc": 3, "advantag": 40, "aer": 27, "affin": 40, "after": [37, 38], "ag": 39, "agg": 39, "agnost": 38, "aip": 8, "al": [38, 39], "alanin": 38, "algorithm": [26, 37, 39], "align": [19, 20, 23], "align_structur": 23, "aligned_surfac": 19, "all": [0, 15, 19, 20, 23, 24, 26, 32, 37, 38, 39, 40], "all_lin": 39, "all_target": 39, "all_typ": 39, "alloc": 39, "allow": [0, 4, 39, 40], "along": [32, 38, 39, 40], "alpha": 39, "alreadi": [0, 40], "alreadli": 38, "also": [0, 29, 37, 38, 39, 40], "altern": 0, "amazon": 0, "ambigu": 0, "amino": [38, 39], "amino_acids_per_bead_group": 39, "amu": [19, 20, 27], "an": [0, 3, 15, 24, 32, 37, 39, 40], "analysi": 39, "analysisfromfunct": 39, "analyz": [0, 40], "angl": [1, 6, 31, 38, 39], "angledof": 6, "angstrom": [26, 27, 37, 38, 39], "ani": [0, 3, 32, 38, 39, 40], "anim": 39, "anoth": [0, 40], "anyth": 39, "apb": [23, 27], "apbs_path": 4, "apbsrunn": 27, "appar": 40, "append": [39, 40], "appli": [0, 23, 32, 37, 38, 39, 40], "applic": 0, "apply_gaussian_smooth": 23, "applyorient": 1, "appreci": 0, "approv": 0, "approxim": 40, "apro": 38, "ar": [0, 4, 15, 32, 37, 38, 39, 40], "arang": [38, 39], "arbd": [3, 4, 5, 8, 19, 20, 23, 24, 27, 29, 38, 39, 40], "arbd_path": 4, "arbdengin": [3, 24, 27, 37, 38, 39, 40], "arbdmodel": [1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34, 35, 38, 39, 40, 41], "arbitrari": [], "arbmodel": 39, "area": 26, "arg": [8, 31, 38], "argon": 37, "argument": [1, 19, 20, 24, 26, 29, 32, 39], "around": 40, "arrai": [1, 26, 32, 37, 38, 39, 40], "articl": 37, "asciinema": 0, "aspect": [19, 20], "assert": [38, 39], "assertionerror": 32, "assign": [3, 10, 12, 13, 26, 39], "assign_ibi_degrees_of_freedom": [3, 39], "associ": [38, 39], "assum": [32, 37], "at_monom": 15, "atom": [26, 27, 29, 37, 38, 39, 40], "atom_group": 39, "atom_slic": 26, "atom_typ": 29, "atomindex": 38, "atomist": 40, "atoms_map": 29, "attach": [1, 3, 38], "attach_particl": [1, 40], "attached_particl": [1, 40], "attribut": [1, 38, 40], "author": 35, "auto": 0, "autom": 40, "automat": [0, 39], "autoreload": 38, "avail": 37, "averag": 32, "average_grid": 32, "averaged_grid": 32, "avoid": 39, "awar": 38, "awkard": 39, "ax": [23, 38, 39], "ax1": 39, "ax2": 39, "axi": [31, 38, 39], "b": [15, 17, 31, 38, 40], "b1": 39, "b2": 39, "b3": 39, "background": 0, "barostat": 4, "base": [0, 1, 3, 4, 5, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 26, 27, 29, 32, 35, 36, 37, 38, 39, 40], "base_filenam": 19, "basi": 31, "basic": [38, 39, 41], "bbead": 40, "bd": 37, "bead": [15, 27, 39, 40], "bead_mass": 39, "becaus": [39, 40], "been": [37, 40], "befor": [3, 37, 38], "beforehand": 40, "behav": 40, "being": 38, "belong": [26, 40], "below": [0, 37, 39, 40], "bent": 40, "besid": 40, "best": 39, "beta_from_fix": 3, "better": [0, 38, 39], "between": [6, 15, 26, 32, 38, 39, 40], "big": 40, "bigger": 32, "bin": 6, "bin_aa": 39, "bin_cg": 39, "binari": [4, 27, 29, 30, 33, 39, 40], "binary_manag": 33, "binary_path": [19, 20, 27], "biolog": 40, "biomolecular": 36, "bit": [38, 39, 40], "blit": 39, "blur": 8, "bodi": [3, 21, 24, 36], "boltzmann": [3, 36, 39, 40], "bond": [1, 6, 29, 38, 39, 40], "bond_angl": 1, "bond_ub": 39, "bondangledof": 6, "bonddof": 6, "bonded_ibi_potenti": [3, 39], "bool": [3, 32], "boolean": 32, "boolean_grid": 32, "both": [19, 26, 39, 40], "bottom": 0, "bound": [32, 40], "bound_grid": 32, "boundari": [8, 32], "boundary_condit": 1, "boundary_param": 24, "boundarypotenti": 8, "box": [6, 31], "box_siz": 26, "bp": 29, "bp_file": 29, "bpro": 38, "bradlei": 39, "branch": [0, 38], "break": [0, 39, 40], "brief": 3, "brownian": 37, "browser": [0, 37], "buck": 37, "buckinghampotenti": 37, "buff": 31, "buffer": [19, 20, 23, 27, 31], "buffer_factor": [3, 24, 31], "build": [38, 39], "built": [0, 15, 38], "bv1": 31, "bv2": 31, "bv3": 31, "c": [26, 38, 39, 40], "cach": 40, "cal_typ": 27, "calc_atom_sasa": 26, "calcul": [6, 8, 19, 20, 23, 26, 27, 29, 31, 39], "calculate_damp": [19, 20], "calculate_dimensions_from_cell_vector": 31, "calculate_hydrodynamic_properti": 23, "calculate_total_mass": 26, "calibr": [19, 20], "call": [3, 30, 37, 38, 39, 40], "call_git_describ": 35, "callabl": 32, "can": [0, 1, 37, 38, 39, 40], "cannot": 40, "cartesian": [37, 38], "case": [37, 38], "caskroom": [39, 40], "cater": [], "caus": 38, "caution": 37, "caveat": 40, "cd": 0, "cell": [3, 31, 37, 38, 39, 40], "cell_origin": [3, 8, 24, 31], "cell_vector": [3, 8, 24, 31], "center": [1, 32, 38, 39, 40], "certain": 37, "cg": [3, 26, 39], "cg_coordin": 39, "cg_model": 39, "cg_u": 39, "chain": [29, 36, 38, 39], "chainid": 39, "chang": [0, 37, 38, 40], "channel": [], "charg": [1, 23, 40], "charge_grid": [1, 40], "charmm": [26, 29], "charmm36": 27, "chat": 0, "check": [0, 36, 38, 39, 40], "check_git_repositori": 35, "child": 1, "children": [1, 3, 37, 38, 39, 40], "choos": 0, "chr": 39, "ci": 0, "citat": 35, "class": [1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 26, 27, 29, 32, 35, 37, 38, 39], "classmethod": [26, 29], "clean": 22, "clean_edg": 6, "clear": [37, 38], "clear_al": [1, 3], "clear_represent": [37, 38], "clone": 1, "close": [0, 40], "closest": 26, "cluster": 40, "cmaffeo2": 40, "cm\u00b3": [19, 20, 27], "coars": [3, 25, 26, 36], "coarse_model": 39, "coarse_sit": 26, "coarsen": 39, "coat": 40, "code": [0, 40], "coeffici": [38, 39, 40], "col": 39, "collect": 1, "collis": 39, "color": 39, "color_schem": 38, "column": 39, "com": [0, 37, 39], "combin": [0, 4, 29, 38, 39], "combined_model": 38, "come": 37, "command": [0, 37, 38, 40], "common": [0, 1], "competit": 26, "complet": 0, "complex": 40, "complic": [38, 39], "compon": [2, 7, 11, 18, 25, 26, 28, 33], "composit": 39, "comprehens": 36, "compress": 39, "comput": [32, 38, 39, 40], "compute_volum": 6, "concentr": [26, 27], "concentration_to_debye_length": 26, "concret": 6, "condit": 32, "conf_param": [3, 24, 27, 29, 39, 40], "config": 27, "config_path": 22, "configur": [2, 3, 4, 22, 24, 26, 27, 29, 39, 40], "confin": [8, 26, 40], "connect": [15, 38, 39, 40], "connectableel": 15, "connection_loc": 15, "connection_typ": 15, "consecut": 39, "consid": [0, 26, 32, 39, 40], "consider_par": 1, "consist": [8, 39, 40], "const_force_1pn_z": 38, "constant": [16, 40], "constant_forc": [32, 38], "constantli": 40, "constrained_layout": 39, "construct": [32, 38, 40], "constructor": [26, 37], "contain": [3, 19, 26, 27, 32, 38, 39, 40, 41], "context": [0, 40], "continu": [0, 3], "continuum": 38, "contour": 15, "contour_filt": 15, "contour_po": 15, "contour_posit": 15, "contour_to_monomer_index": 15, "contour_to_orient": 15, "contour_to_posit": 15, "contour_to_tang": 15, "convei": 0, "conveni": [3, 37, 40], "converg": 39, "convers": 29, "convert": [26, 29], "convert_sod_to_mg": 29, "convolut": 32, "convolv": 32, "convolve_kernel_trunc": 32, "cooper": 39, "coord": [15, 16, 33, 38, 39, 40], "coordin": [6, 19, 20, 31, 37, 38, 39, 40], "coordsa": 31, "coordsb": 31, "copi": [3, 15, 24, 40], "copy_ff_from": 27, "core": 5, "core_object": [2, 17], "corner": 38, "correct_geometri": 8, "correctli": 38, "correspond": [3, 32, 40], "could": [0, 37, 38, 39], "count": [15, 26], "cours": 37, "cover": 38, "cpro": 38, "crash": [37, 38, 40], "creat": [0, 3, 4, 22, 24, 26, 29, 32, 36, 38, 39, 40], "create_arbd_polymer_object": 39, "create_bounding_grid": 32, "create_dual_topologi": 29, "create_dual_topology_model": 29, "create_engin": 22, "create_model": 22, "create_nul": 32, "crossov": 15, "crucial": 37, "cryo": [38, 40], "csv": [], "ct500193u": 38, "current": [3, 32], "custom": [26, 36, 38], "custom_properti": 37, "customiz": 26, "cut": 0, "cutoff": [4, 19, 20, 29, 32, 39], "cylindr": 38, "d": [8, 38], "dai": 40, "dalton": [26, 27, 37, 39], "damp": [38, 40], "damping_coeffici": [1, 9, 10, 12, 13, 14, 16, 37, 39, 40], "dat": [27, 39, 40], "data": [32, 38, 39], "dcd": [31, 37, 38, 39, 40], "debug": [9, 10, 12, 13, 14, 16, 17, 37, 38], "debugg": 38, "deby": 26, "debye_length": [10, 12, 13, 14, 16, 26, 39], "decomp_period": [4, 39], "decomposit": 37, "decor": 40, "def": [32, 37, 38, 39, 40], "default": [3, 4, 26, 31, 32, 39], "default_binari": [27, 39, 40], "defaultsimconf": [2, 4], "defin": [3, 24, 26, 39, 40], "deg": 39, "degre": [3, 6, 39], "degreeoffreedom": 6, "degrees_of_freedom": [6, 39], "delet": 15, "delta": [32, 38], "demonstr": [0, 37], "denresolut": 23, "densiti": [19, 20, 21, 24, 39, 40], "depend": [0, 4, 38], "deploy": 0, "deprec": [3, 37], "depth": [], "deriv": 6, "describ": [4, 15, 38], "detail": [0, 5, 36, 38, 40], "determin": [26, 32, 39, 40], "develop": [0, 27, 36, 37], "dict": [24, 39], "dictionari": [23, 26, 27, 29, 38], "differ": [0, 36, 38], "differenti": 0, "difficult": 40, "diffus": [1, 22, 24, 37, 39], "diffusiverigidbodytyp": 24, "dignon": [38, 39], "dihedr": [1, 6, 39], "dihedraldof": 6, "dimens": [3, 24, 27, 31, 32, 37, 38, 39, 40], "dimensions_from_structur": [3, 15], "direct": 39, "directli": [8, 32], "directori": [3, 24, 26, 27, 29, 37, 38, 39, 40], "dirichlet": 1, "disk": 38, "disord": [38, 40], "disordered_residu": 26, "displai": 35, "distanc": [6, 26, 32, 37, 39], "distinct": 38, "distribut": [3, 23, 39, 40], "dive": 39, "divid": 32, "dna": [36, 38], "dna_coordin": 40, "dna_model": 38, "dnamodel": [17, 38, 40], "dnastrandbead": 17, "do": [0, 20, 32, 38, 39], "document": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 31, 32, 33, 34, 35, 37], "doe": [3, 4, 37, 38, 40], "doesn": 39, "dof": 6, "doi": [8, 35, 37, 38, 39, 40], "don": [26, 29, 40], "done": 40, "doubl": [15, 38], "down": 0, "dr": 16, "drawcylind": 15, "drawtub": 15, "drift": 38, "dry_run": [26, 27, 29, 39, 40], "dsitribut": 40, "dt": [38, 40], "dt_5": 40, "dt_70": 40, "dtype": 39, "dual": 29, "due": 40, "dummy_typ": 3, "duplic": 1, "dure": [30, 40], "dx": [8, 19, 20, 27, 32, 38, 40], "dy": 27, "dynam": [26, 37, 40], "dz": 27, "e": [4, 37, 38, 39, 40], "each": [3, 15, 24, 26, 32, 38, 39, 40], "easi": 0, "ec": 0, "ec2": 0, "ecosystem": 0, "edg": 39, "editor": 37, "edu": [0, 40], "effect": 39, "effici": [26, 38], "egg": [39, 40], "elec": 40, "electrostat": [10, 12, 13, 14, 23, 26, 27, 40], "element": [15, 27, 32, 38], "elif": 39, "els": [39, 40], "em": [38, 40], "email": 0, "empti": [38, 39], "enabl": [0, 37], "end": 40, "end1": 40, "end2": 40, "end_posit": [15, 40], "energi": [0, 26, 29, 37, 40], "engin": [3, 5, 22, 24, 30, 33, 36, 37, 38, 39, 40], "engine_kwarg": 40, "engr": 0, "enhanc": 24, "enjoi": 40, "enough": 38, "ensur": [0, 32], "enter": 38, "entri": [15, 40], "enumer": [38, 39, 40], "env": [39, 40], "environ": [0, 30], "epsilon": 37, "epsilon0": 39, "equilibr": 40, "error": 4, "especi": 0, "et": [38, 39], "etc": [0, 29, 38], "even": [0, 32, 39], "everi": [0, 37, 38, 39], "everyth": 39, "evolv": 37, "exactli": 32, "examin": 37, "exampl": [0, 6, 32, 36, 38, 39, 40, 41], "exb": 29, "except": [4, 38, 39, 40], "exclud": [1, 15, 16, 39], "excludedattribut": 1, "exclus": [6, 39], "execut": [19, 20], "exercis": 40, "exist": [0, 24, 29, 39, 40], "existing_repo": 0, "exp": [32, 37], "expect": [0, 19, 20], "expected_aspect_ratio": [19, 20], "expected_mass": [19, 20], "experi": 38, "experiment": [38, 40], "explain": 0, "explicit": [0, 27], "expon": 32, "expos": 40, "extend": [3, 15, 38], "extens": [37, 38], "extern": [0, 30, 32], "extra": 39, "extra_bd_file_lin": [24, 27], "extrabond": 27, "extract": [3, 39, 40], "f": [38, 39, 40], "facilit": 29, "factor": [0, 31, 40], "factori": 26, "fall": 20, "fals": [1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 21, 24, 27, 29, 32, 38, 39], "familiar": [37, 40], "faster": 39, "favorit": 37, "featur": [0, 37, 40], "feel": [0, 38, 40], "fep": 29, "fep_fil": 29, "few": [38, 40], "field": [19, 20], "fig": 39, "figsiz": 39, "file": [3, 8, 19, 20, 22, 23, 24, 26, 27, 29, 32, 38, 39, 40], "file_nam": 15, "filenam": [3, 6, 8, 26, 35], "filename_prefix": [6, 8, 39], "fill": 32, "fill_nan": 32, "fill_valu": 32, "filled_grid": 32, "final": [26, 38, 40], "find": [15, 26, 40], "find_boundari": 32, "find_shape_based_sit": 26, "fine": 26, "fine_posit": 26, "fine_sit": 26, "first": [3, 29, 38, 39, 40], "first_fram": 31, "first_iter": 3, "first_monom": 15, "fix": [38, 40], "fjc": 38, "fjc_polymer_model": [11, 38], "fjcbeadsfrompolym": 9, "fjcmodel": [9, 38], "flexibl": [36, 38], "flux": 40, "fmt": 32, "fn": 38, "fname": [31, 39, 40], "follow": [0, 37, 39], "forc": [16, 32, 37, 39, 40], "force_const": 32, "fork": [0, 40], "form": [0, 1, 15, 37, 40], "format": [19, 38, 39, 40], "found": [4, 39, 40], "four": 39, "fragment": 40, "frame": [1, 38, 39, 40], "free": [0, 29], "freedom": [3, 6, 39], "freeli": 38, "frequent": [0, 40], "friction": 40, "from": [0, 3, 4, 6, 15, 22, 26, 29, 30, 31, 32, 37, 38, 39, 40], "from_protein_list": 26, "full": [8, 26], "fun": 38, "funcanim": 39, "function": [22, 24, 26, 30, 32, 38, 39, 40], "further": 39, "futur": [0, 40], "g": [4, 19, 20, 27, 37, 38, 39], "ga": 37, "gaussian": [23, 32], "gaussian_kernel": 32, "gaussianwidth": 23, "gencharg": 40, "gener": [4, 19, 20, 23, 24, 26, 32, 36, 37, 39, 40], "generate_bead": [15, 16, 38], "generate_charge_distribut": 23, "generate_coordin": 31, "generate_electrostatic_map": 23, "generate_potential_grid": [19, 20], "generate_protein": 26, "generate_random_protein_posit": 26, "generate_spanning_vector": 31, "generate_vdw_map": 23, "geometri": 26, "get": [4, 23, 26, 38, 39], "get_angl": 1, "get_attached_particl": [19, 20], "get_binari": 4, "get_bond": 1, "get_bond_angl": 1, "get_cent": [1, 15, 38], "get_cg_distribut": 6, "get_coarse_protein": 26, "get_coarse_typ": 26, "get_collapsed_posit": 1, "get_color": 39, "get_connect": 15, "get_connected_loc": 15, "get_connections_and_loc": 15, "get_contour_sorted_connections_and_loc": 15, "get_data": 39, "get_default_conf": 27, "get_dihedr": 1, "get_exclus": 1, "get_extens": 38, "get_grid_fil": 23, "get_improp": 1, "get_loc": 15, "get_location_at": 15, "get_monomer_index": 15, "get_original_recurs": 1, "get_particle_assign": 26, "get_product_potenti": 1, "get_protein_typ": 26, "get_resource_path": 34, "get_restraint": 1, "get_slice_enclosing_smaller_grid": 32, "get_target_distribut": [6, 39], "get_valu": 6, "get_vector_angl": 1, "get_vers": 35, "getparticletypesandcount": 3, "gif": 0, "git": 0, "gitlab": 0, "give": 40, "given": [26, 39], "glfg": 39, "glob": 39, "gmsh": 20, "gmsh_path": 4, "gnu": [], "gnumer": [], "go": [0, 37, 39], "goe": 40, "good": [37, 38], "gpu": [4, 24, 26, 37, 38, 39, 40], "grab": 39, "grace": 4, "gradient": 40, "grain": [3, 25, 26, 36], "grid": [8, 19, 20, 23, 24, 27, 33, 38, 40], "grid1": 32, "grid2": 32, "grid_fil": 15, "grid_filenam": 38, "grid_path": 32, "grid_potenti": 38, "griddataformat": 32, "gridfil": 1, "group": [1, 3, 15, 16, 17, 26, 38, 39, 40], "groupsit": 1, "guid": 38, "guidanc": 0, "ha": [0, 32, 38, 40], "halfharmon": 8, "handi": 0, "handl": [3, 4, 26], "harmon": 38, "harmonicangl": 8, "harmonicbond": [8, 16, 37], "harmonicbondedpotenti": 8, "harmonicdihedr": 8, "harmonicvectorangl": 8, "have": [0, 3, 32, 37, 39, 40], "help": [0, 39, 40], "henc": 37, "here": [0, 37, 39, 40], "heurist": 39, "hierarchi": [], "high": [0, 40], "hold": 1, "homebrew": 0, "how": [0, 37, 38, 39, 40], "howev": [0, 37], "hp": [38, 39], "hps_model": 38, "hps_polymer_model": [11, 38, 39], "hpsbead": 10, "hpsmodel": [10, 38, 39], "hpsnonbond": 10, "hre": 38, "http": [0, 8, 37, 38, 39, 40], "hydroc": 27, "hydrodynam": [19, 20, 23, 27, 36], "hydrophob": [36, 38, 39], "hydropro": [4, 19, 20, 23, 27], "hydropro_path": 4, "hydroproo": 40, "hydroprorunn": 27, "hyropro": 40, "i": [0, 1, 3, 29, 32, 36, 38, 39, 40], "i0": 39, "i1": 39, "ibi": [3, 7, 36, 40, 41], "ibiangl": [6, 39], "ibibond": [6, 39], "ibidihedr": [6, 39], "ibinonbond": [6, 39], "ibipotenti": [6, 39], "id": [26, 39], "idea": [0, 37, 38], "ideal": 40, "identifi": [], "idp_arrai": 12, "idx": 1, "ignor": [39, 40], "ij": 38, "illinoi": [0, 40], "illustr": 40, "imag": 0, "immedi": 38, "immobil": 24, "implement": [8, 32, 38, 40], "import": [32, 37, 38, 39, 40], "importlib": 38, "improv": [0, 3, 4], "inadvert": 0, "includ": [0, 3, 6, 26, 36, 37, 38], "include_ssdna": 15, "include_strand": 15, "inclus": 15, "index": [1, 24, 26, 37, 38, 39, 40], "indic": [26, 32], "inertia": [19, 20, 40], "inf": 32, "infil": 32, "infin": 32, "influenc": 38, "inform": [0, 37, 38], "init": 39, "init_func": 39, "initi": [4, 24, 30, 39, 40], "initial_region": 24, "initialize_binary_path": 30, "inlin": [0, 38], "input": 32, "insert": 1, "insert_monom": 15, "insid": [20, 37], "inspect": [38, 40], "instabl": 39, "instanc": [22, 24, 26, 39], "instead": [37, 38, 39], "instruct": 0, "int": [3, 15, 32, 39], "integ": 32, "integr": [4, 29, 39], "interact": [5, 6, 14, 26, 29, 36, 38, 39, 40], "interfac": [8, 22, 27, 37], "intern": 0, "interpol": 38, "interprett": 37, "invers": [3, 36, 39], "invit": 0, "involv": 40, "ion": 29, "ion_concentr": 39, "ipdb": [37, 38], "is_dirti": 35, "is_gigant": 24, "is_same_typ": 1, "isci": 40, "iscienc": 40, "isn": 8, "isotrop": [3, 15, 32], "isotropic_kernel": 32, "issu": 0, "item": [4, 38, 39, 40], "iter": [3, 6, 32, 36, 39], "iterate_connections_and_loc": 15, "ith": 39, "its": [26, 37, 40], "j": [1, 37, 39, 40], "java": [], "join": 39, "joint": 38, "jone": [26, 40], "journal": [35, 39], "jupyt": 37, "just": [0, 39, 40], "k": [1, 8, 16, 19, 20, 26, 27, 37, 38, 39, 40], "k_off": 40, "kcal": [37, 38, 39, 40], "kcal_mol": [37, 38], "kd": 26, "keep": 0, "keep_children": [1, 3], "kei": [37, 39, 40], "kelvin": [19, 20], "kernel": 32, "keyword": [37, 40], "kh": 38, "kh_model": 38, "kh_polymer_model": [11, 38], "khbead": 12, "khmodel": [12, 38], "khnonbond": 12, "know": 0, "knowledg": 37, "known": 0, "kscale": 8, "kt": [8, 40], "kubernet": 0, "kwarg": [1, 3, 4, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 24, 26, 29, 31, 32, 38, 39, 40], "l": [1, 32, 38], "l1": 39, "l2": 39, "label": [38, 39], "lag": 40, "langevin": [4, 39], "languag": 0, "larg": [27, 37, 40], "large_system": 27, "larger": 39, "last": [6, 8, 37, 38, 39, 40], "last_fram": 31, "last_index": 39, "last_monom": 15, "later": 40, "lattic": 39, "law": 40, "learn": [26, 37, 39], "learning_r": [6, 39], "learning_schedul": 26, "left": 38, "legend": [38, 39], "len": [37, 38, 39, 40], "length": [26, 32, 39], "lennard": [26, 40], "lennardjon": [8, 37], "less": [37, 40], "let": [0, 38, 40], "level": [], "lib": [39, 40], "liber": 0, "like": [0, 26, 32, 37, 38, 39, 40], "likelihood": 0, "limit": 39, "line": [0, 37, 38, 39, 40], "linear": [15, 38], "linearbond": 16, "lines2": 39, "link": 0, "linspac": [37, 39, 40], "lint": 0, "linux": 37, "liquid": 37, "list": [0, 1, 3, 15, 24, 26, 29, 31, 32, 37, 39, 40], "littl": [38, 39, 40], "lj": 37, "ll": [0, 37, 38, 39, 40], "ln": 39, "load": [29, 32, 39, 40], "load_ext": 38, "load_new": 39, "load_structur": 29, "load_target_ibi_distribut": 3, "loadgrid": 32, "loadtxt": [39, 40], "loc": 39, "local": [39, 40], "local_lin": 39, "locat": [15, 37, 40], "location_in_oth": 15, "location_in_self": 15, "log": [29, 39], "log_fil": [27, 29, 39, 40], "logger": 33, "long": [0, 37, 38, 40], "longer": 38, "look": 39, "lookup": 26, "loop": [39, 40], "lot": 40, "lower": 38, "lowerbound": 32, "lp": 8, "lw": 39, "lx": 39, "m": [0, 27, 38, 39], "machineri": 40, "made": 38, "magnesium": 29, "mai": [0, 32, 37, 39, 40], "main": [0, 22, 40], "maintain": 0, "make": [0, 38, 40], "make_dna_model": 40, "makeareadm": 0, "makedir": [39, 40], "manag": [0, 22, 30, 33, 39], "mani": [0, 37], "manual": 0, "manuscript": 40, "map": [23, 26, 29], "mask": 32, "mass": [1, 19, 20, 26, 27, 37, 39, 40], "match": [3, 32, 38, 40], "materi": [19, 20], "math": 37, "matplotlib": [38, 39], "matrix": 26, "max": 39, "max_dist": 26, "max_forc": [6, 8, 39], "max_iter": 32, "max_potenti": [6, 8, 16, 19, 20], "maxforc": 16, "maximum": [26, 27, 32], "md": [0, 4, 29, 37, 38], "mda": [37, 38, 39], "mdanalysi": [3, 29, 37, 38, 39], "mean": [38, 39], "meant": 40, "measur": [38, 40], "mechan": 38, "member": [0, 39], "memori": 39, "memoryread": 39, "merg": [0, 38], "mesh": [19, 20, 27], "mesh_fil": [19, 20, 21], "mesh_process_surfac": 18, "mesh_process_volum": 18, "mesh_rigidbodi": 18, "meshgrid": 38, "meshprocessor": 20, "meshrigidbodytyp": 21, "mess": 40, "messag": 32, "metadata": 0, "method": [0, 3, 4, 24, 29, 40], "methodnam": 32, "mg": 39, "micron_to_angstrom": [19, 20], "might": [0, 38, 39], "min": [6, 29, 39], "min_fep_fil": 29, "mind": 0, "miniconda": [39, 40], "minim": [3, 26, 29, 39], "minimization_fil": 26, "minimization_step": 27, "minimizermsd": 31, "minimum": [27, 39], "mirror": 32, "miss": 4, "mistak": 38, "ml": 39, "mm": [26, 39], "mobil": 24, "mode": 27, "model": [2, 5, 15, 22, 24, 26, 27, 29, 37], "model_nam": 39, "modern": 22, "modifi": [29, 38, 39], "modul": [1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 26, 27, 29, 30, 31, 32, 34, 35, 37, 38, 40], "modulenotfounderror": [37, 38], "mol": [37, 38, 39, 40], "molecul": [27, 40], "molecular": [23, 26, 27, 29, 36], "moment": 40, "moment_of_inertia": [1, 40], "monom": 39, "monomer_index_to_contour": 15, "monomer_length": [15, 38, 39, 40], "monomer_po": 15, "monomers_per_bead_group": [9, 15, 38, 39], "more": [0, 38, 39], "mortem": 38, "most": [0, 37, 38, 39, 40], "move": [39, 40], "mp4": 39, "mpipi_polym": 11, "mpipibead": 13, "mpipimodel": 13, "mpipinonbond": 13, "mpl": 39, "mrdna": [27, 38], "msh": [19, 20], "much": 40, "multipl": [26, 32, 36, 39, 40], "multiplebond": 38, "must": [1, 32, 37, 39], "my_valu": 37, "myibi": 39, "myibibead": 39, "myibimodel": 39, "n": [37, 38, 39], "n1": 31, "n2": 31, "n3": 31, "n_atom": 26, "n_cg": 26, "n_polym": 39, "namd": [4, 27], "namd_path": 4, "namdengin": 27, "name": [1, 4, 6, 15, 21, 24, 26, 27, 29, 37, 38, 39, 40], "namespac": [], "nan": 32, "nativ": 40, "natsort": 39, "natur": 40, "nb": 39, "nbextens": 37, "nbfix": 27, "nbscheme": 3, "ndarrai": 32, "ndim": 32, "nearbi": 6, "nearest": 32, "nearest_monom": 15, "necessarili": 40, "need": [0, 36, 37, 38, 39, 40], "neglect": 39, "neighbor": 32, "neighborhood": 32, "neighborhood_averag": 32, "nest": [], "nevertheless": 37, "new": [0, 4, 19, 26, 38, 40], "new_typ": 15, "next": [0, 3], "nglview": [37, 38], "ngrid": 38, "no_ssb": 40, "nobl": 37, "non": [29, 32, 38, 40], "nonbond": [14, 26, 37, 39], "nonbonded_ibi_potenti": [3, 39], "nonbonded_interact": 37, "nonbonded_learning_r": 39, "nonbonded_learning_rate0": 39, "nonbonded_learning_rate1": 39, "nonbonded_potenti": 3, "none": [1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 23, 24, 26, 27, 29, 31, 32, 35, 38, 39, 40], "normal": [26, 32], "normalizeaxi": 31, "note": [0, 3, 32, 37, 38, 39, 40], "notebook": [37, 38, 39], "notic": [38, 40], "notimplementederror": [3, 32, 39], "novic": 0, "now": [38, 39, 40], "np": [32, 37, 38, 39, 40], "nsig": 27, "nt": [15, 17, 38, 40], "nt_sigma": 26, "nucleic": 26, "nucleotid": [15, 38], "nuget": 0, "null": 32, "nullpotenti": 8, "num_bead_group": 15, "num_cg_sit": 26, "num_copi": 31, "num_heavy_clust": [4, 23], "num_monom": [15, 38, 39, 40], "num_particl": 37, "num_proc": [27, 29, 39, 40], "num_step": [4, 26, 27, 37, 38, 39, 40], "num_voxel": 38, "number": [3, 24, 26, 27, 29, 32, 35, 38, 39, 40], "numbond": 37, "numer": 39, "numpi": [32, 37, 38, 39, 40], "nupmodel": 39, "nv": [37, 38], "nx": 39, "nx3": 37, "ny": 39, "o": [38, 39, 40], "obj": [1, 3], "object": [1, 3, 4, 6, 8, 15, 17, 19, 20, 21, 22, 23, 24, 26, 27, 29, 30, 32, 35, 37, 38, 39, 41], "observ": 38, "obtain": [39, 40], "obvious": 38, "odd": [32, 40], "off": 27, "offer": 38, "offset": 1, "often": 39, "on_fwd_strand": 15, "onc": 40, "onck_model": 38, "onck_polymer_model": [11, 38], "onckbead": 14, "onckmodel": [14, 38], "oncknonbond": 14, "one": [37, 38, 39, 40], "one_bead_per_r": 39, "ones": 38, "onli": [0, 1, 32, 37, 39, 40], "open": 0, "oper": [0, 37, 40], "optim": [3, 26, 38], "option": [3, 4, 19, 20, 24, 26, 29, 32, 36, 37, 39, 40], "order": 38, "org": [8, 37, 38, 39, 40], "organ": [], "orient": [1, 24, 26, 37, 38, 39, 40], "origin": [0, 1, 29, 31, 32, 38, 39, 40], "orthonorm": 32, "orthorhomb": 3, "other": [1, 4, 15, 37, 38, 39], "other_model": 3, "otherwis": 4, "our": [38, 39, 40], "out": [0, 36, 40], "out_of_bounds_forc": 6, "outfil": 32, "outnam": 39, "output": [0, 3, 19, 20, 24, 26, 27, 29, 32, 37, 38, 39, 40], "output_directori": [27, 29, 39, 40], "output_dx": [19, 20], "output_fil": [19, 20, 27], "output_mesh": [19, 20], "output_nam": [3, 24, 27, 29, 37, 38, 39, 40], "output_path": 27, "output_period": [4, 26, 37, 38, 39, 40], "outsid": [37, 39], "over": 39, "overlap": 32, "overrid": [4, 37], "overridden": 4, "own": [0, 39, 40], "owner": 0, "p": [17, 38, 39, 40], "p1": 29, "p2": 29, "p_p": 39, "p_type": 39, "packag": [2, 7, 11, 18, 25, 27, 28, 30, 32, 33, 36, 38, 39, 40, 41], "pad": 32, "padding_factor": [3, 15], "page": 35, "pair": [6, 29, 37, 40], "pairdistributiondof": 6, "pairlist": 37, "pairlist_dist": [4, 39], "paramet": [3, 4, 15, 19, 20, 22, 23, 24, 26, 27, 29, 31, 32, 37, 39, 40], "parameter_fil": [26, 29], "parameters_fold": 23, "parent": [1, 3, 15, 38], "parm": 29, "parmed_bd": 28, "parmed_structur": 29, "parmedarbd": 29, "pars": 22, "parse_output": 27, "parser": 37, "part": 39, "partial": 27, "particl": [1, 3, 6, 20, 26, 38, 39], "particle_group": 39, "particle_i": 1, "particle_j": 1, "particles_a": 6, "particles_b": 6, "particletyp": [1, 17, 26, 29, 37, 38, 39], "particular": [0, 39], "pass": [0, 38, 39], "path": [4, 19, 20, 24, 26, 27, 29, 30, 33, 38, 39, 40], "pathlib": 39, "pbead": 40, "pcbi": 39, "pdb": [19, 20, 24, 26, 29, 31, 37, 38, 39, 40], "pdb_list": 26, "pdb_path": 26, "pdbmodel": 3, "peak": 40, "peopl": 0, "peptid": [38, 39], "per": [3, 26, 37, 39], "per_monom": 15, "perform": [3, 32, 39, 40], "perhap": 0, "period": [3, 6, 8, 32, 37], "physic": 37, "pii": 37, "pinyili": 27, "place": 0, "placement": 26, "plain": 40, "plan": 39, "pleas": [37, 40], "plot": [38, 39], "plt": [38, 39], "pm": [37, 38], "pmf": 40, "pmf_grid": [1, 40], "pn": 38, "point": [0, 1, 32, 37, 38, 39], "pointparticl": [1, 17, 37, 39], "pois": [19, 20], "poisson": 40, "poli": [38, 40], "polici": 4, "polym": [5, 9, 10, 12, 13, 14, 16, 17, 36, 40, 41], "polymer": 38, "polymer_index": 39, "polymer_mass": 39, "polymerbead": [9, 10, 12, 13, 14, 15, 17, 39], "polymergroup": [15, 38], "polymermodel": [9, 10, 12, 13, 14, 15, 17, 39], "polymersect": [15, 38, 39, 40], "poorli": 37, "posit": [1, 8, 24, 26, 37, 38, 39, 40], "position_filt": 15, "position_spline_param": 38, "posixpath": 27, "possibl": [0, 38], "post": 38, "postpon": 39, "pot": [37, 39, 40], "potenti": [1, 3, 5, 6, 8, 10, 12, 13, 14, 16, 19, 20, 23, 24, 26, 27, 32, 36, 37, 38, 39, 40], "potential_grid": [1, 40], "potential_list": 1, "potresolut": 23, "pre": [26, 39, 40], "predetermin": 40, "prefix": [16, 37, 39], "prefixes_and_limit": 39, "prepar": 40, "prepare_for_simul": 3, "prescrib": [37, 38], "preserv": 29, "pressur": 4, "prevent": [37, 40], "previou": 3, "previous": 40, "primarili": 38, "princip": 23, "print": [32, 37, 38, 39], "prior": 40, "pro": [0, 38], "procedur": 39, "process": [19, 20, 22, 23, 24, 39], "process_mesh_fil": 20, "process_structur": 23, "process_surface_mesh": 19, "processor": [29, 30, 33], "produc": 40, "product": [37, 39], "program": 0, "properti": [4, 6, 8, 15, 19, 20, 23, 26, 27, 36], "proport": 40, "prot": 38, "prot_typ": 26, "protect": 0, "protein": [25, 26, 36, 39], "protein_count": 26, "protein_factori": 26, "protein_group": 26, "protein_posit": 26, "provid": [0, 2, 3, 4, 5, 22, 24, 26, 29, 30, 32, 36, 37, 38, 39, 40], "psf": [24, 26, 29, 31, 37, 38, 39, 40], "psize_script": 27, "pub": 38, "pull": [0, 37], "push": 0, "put": [0, 39], "py": [37, 39, 40], "py3": [39, 40], "pybd": [39, 40], "pyplot": [38, 39], "python": [5, 37, 38, 39], "python3": [39, 40], "q": 31, "q1": 31, "q2": 31, "qualiti": 0, "quaternion": 15, "quaternion_exp": 31, "quaternion_from_matrix": 31, "quaternion_invers": 31, "quaternion_product": 31, "quaternion_slerp": 31, "quaternion_spline_param": 38, "quaternion_to_matrix": 31, "quickli": 0, "r": [1, 6, 8, 10, 12, 13, 14, 16, 26, 31, 37, 38, 39], "r0": [8, 16, 37], "radii": 26, "radiu": [15, 26, 27, 32, 37, 38, 39], "radiusdof": 6, "rais": [3, 4, 32, 39, 40], "random": [24, 26, 37], "random_se": 24, "rang": [36, 37, 39, 40], "range_": [6, 8, 10, 12, 13, 14, 26, 37, 39], "rate": 39, "rather": [0, 39], "ratio": [19, 20, 39], "raw": 39, "rb": 40, "rb_type": 24, "re": [0, 39], "reach": 40, "read": [0, 22, 29], "read_arbd_coordin": [31, 38], "read_average_arbd_coordin": 31, "read_cg_potenti": 6, "read_fil": 26, "read_release_vers": 35, "read_version_fil": 35, "readarbdcoord": [31, 39], "readavgarbdcoord": 31, "readi": 0, "realli": 38, "reason": [0, 37, 40], "recalcul": 6, "recent": [37, 38, 39, 40], "recommend": [0, 37, 40], "recomput": 40, "record": 39, "reduc": [0, 26, 39], "refer": 0, "region": 24, "regular": 38, "reimport": 38, "rel": 39, "relative_path": 34, "relax": 38, "releas": [0, 40], "remot": 0, "remov": [0, 1, 15], "remove_duplicate_bonded_term": [1, 3], "remove_monom": 15, "repeat": [39, 40], "replac": 39, "replace_false_with_dist": 32, "replic": 40, "replica": [3, 24, 27, 39, 40], "replica_index": 31, "replisom": 40, "replisome_grid": 40, "repositori": 0, "repres": [1, 6, 24, 26, 32, 37, 38, 39, 40], "reproduc": 26, "request": 0, "requir": [0, 3, 32, 37, 40], "research": 27, "reshap": 40, "resid": 39, "residu": 39, "resolut": [6, 8, 10, 12, 13, 14, 16, 23, 26, 32, 37, 38, 39], "resourc": 27, "rest_length": [9, 10, 12, 13, 14, 15], "restart": [26, 38, 39], "restart_fil": [4, 26], "restrain": [38, 40], "restraint": [1, 29, 38, 39, 40], "restraint1": 40, "restraint2": 40, "result": [3, 29, 32, 39, 40], "return": [4, 15, 22, 24, 26, 27, 29, 31, 32, 37, 38, 39, 40], "reus": [38, 39], "revers": 15, "rework": 39, "rgyr": 38, "rho_aa": 39, "rho_cg": 39, "rho_ylimit": 39, "right": 39, "rigid": [3, 21, 24, 36], "rigid_bodi": 40, "rigid_body_grid_grid_period": [4, 40], "rigid_body_integr": 4, "rigid_body_potenti": [1, 40], "rigid_body_typ": 40, "rigidbodi": [1, 5, 20, 24, 40], "rigidbodytyp": [1, 21, 23, 24, 40], "rmin": 26, "rmsd_threshold": 31, "room": 0, "rotat": [1, 15, 40], "rotation_damp": 27, "rotation_matrix": 15, "rotationaboutaxi": 31, "rotational_damping_coeffici": [1, 40], "rotational_diffus": 1, "routin": [3, 39], "row": 39, "royalsocietypublish": 37, "rrang": 16, "rspa": 37, "run": [0, 3, 22, 24, 26, 27, 29, 38, 40], "run_1": 26, "run_calcul": 27, "run_from_minim": 26, "run_ibi": [3, 39], "run_minim": [3, 26], "run_simul": [22, 24], "runcal": 38, "runtest": 32, "runtim": 37, "rx": 27, "ry": 27, "rz": 27, "sai": 0, "sali_polymer_model": 11, "salibeadsfrompolym": 16, "salimodel": 16, "salinonbond": 16, "salt": [26, 27], "salt_conc": 27, "salt_concentr": 26, "same": [32, 38, 39], "sampl": [32, 39], "sasa": 26, "sast": 0, "save": [19, 20, 39], "save_aligned_mesh": [19, 20], "save_aligned_mesh_both_format": 19, "save_as_pdb": [19, 20], "saw": 39, "sax": 38, "scalar": 32, "scale": [1, 15, 31, 38, 39, 40], "scaling_factor": 6, "schedul": 26, "scienc": 37, "sciencedirect": 37, "scitat": 8, "screenshot": 0, "script": [0, 39], "second": 29, "secondari": 40, "section": [0, 2, 5, 7, 11, 15, 18, 25, 28, 33, 36, 39, 41], "secur": 0, "see": [0, 36, 37, 38, 40], "seed": [4, 24, 26], "seg": 38, "segid": [38, 39], "segment": [32, 38], "segment_index": 38, "segnam": [38, 39], "select": 37, "selectign": 38, "selenium": 0, "self": [0, 4, 29, 37, 39, 40], "separ": 32, "seq": [15, 38, 39], "sequenc": [9, 10, 12, 13, 14, 15, 16, 17, 38, 39], "sequence_to_chain": 39, "server": 0, "servic": 0, "set": [0, 4, 22, 26, 37, 40], "set_binari": 4, "set_connect": 15, "set_damping_coeffici": [9, 10, 12, 13, 14, 39], "set_data": 39, "set_orientation_splin": 15, "set_splin": [15, 39, 40], "set_titl": 39, "set_xlabel": 39, "set_xlim": 39, "set_ylabel": 39, "set_ylim": 39, "setup": 0, "setup_and_run": 26, "setup_diffusible_object": 22, "setup_static_object": 22, "shape": [5, 21, 26, 27, 32, 36, 38, 40], "shape_cg": 25, "shapecgfactori": 26, "shapecgmodel": 26, "shapecgnonbond": 26, "share": 39, "sharex": 39, "shcg": 26, "shell": 27, "shield": 0, "shift": 32, "short": 0, "should": [0, 6, 30, 32, 39, 40], "show": [0, 38, 39], "show_mdanalysi": [37, 38], "side": 32, "sig": 32, "sig_max": 27, "sig_min": 27, "sigma": [26, 32], "sign": 38, "signal": 40, "sim": [37, 38], "sim_config": 2, "sim_kw": 40, "sim_kwarg": 40, "simconf": [2, 4, 19, 20, 21, 23, 24, 27], "simengin": [27, 39, 40], "simpl": [27, 37, 38, 40], "simplearbd": 18, "simplearbdconfig": 22, "simplearbdengin": [22, 24], "simplest": 38, "simpli": 37, "simul": [2, 3, 4, 5, 8, 22, 24, 25, 26, 27, 29, 30, 31, 33, 36, 38, 40], "sinc": [39, 40], "singl": 39, "singleton": 30, "site": [6, 15, 26, 38, 39, 40], "size": [27, 32, 38], "skimag": 32, "skin_depth": 39, "skip": [38, 40], "slab_potential_z": [32, 38], "slice": 26, "slow": [0, 40], "slower": 40, "small": [0, 37], "smaller": 32, "smaller_grid": 32, "smallest": 0, "smooth": [6, 23], "so": [0, 20, 37, 38, 39, 40], "sodium": 29, "solvent": [19, 20, 26], "solvent_dens": [4, 19, 20], "solver": 40, "some": [0, 37], "someon": 0, "someth": [0, 38], "sophist": 0, "sourc": [0, 1, 3, 4, 6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 26, 27, 29, 30, 31, 32, 34, 35, 38, 40], "space": [19, 20, 31, 32, 38, 40], "special": 36, "specif": [0, 4, 27, 32], "specifi": [26, 32, 37, 38, 40], "specific_volum": 27, "spefici": 38, "sphere": 26, "spheric": [26, 38], "spherical_confin": [32, 38], "spline": [38, 40], "split": 39, "spring": 38, "spring_const": [9, 10, 12, 13, 14], "sqrt": [37, 38, 39], "squar": 39, "squeez": 39, "ssb": 40, "ssb_coord": 40, "ssb_type": 40, "ssdna": [38, 40], "ssdna_two_bead": [11, 38, 40], "start": [3, 26, 38, 39, 40], "start_posit": [15, 38, 40], "state": [0, 26], "static": [0, 22, 24, 29], "staticobject": 24, "stderr": 32, "stem": 39, "step": [0, 3, 26, 40], "steric": 40, "stop": 0, "store": [3, 39], "str": [3, 32], "strand": 38, "stretch": 38, "strictli": 38, "stride": [31, 38], "string": [26, 37], "strongli": 37, "structur": [0, 3, 23, 24, 26, 27, 29, 36, 38, 40], "structure_from_pdb": 18, "structure_nam": 27, "structure_path": [23, 24], "structure_rigidbodi": 18, "structureprocessor": 23, "structurerigidbodymodel": [22, 24], "structurerigidbodytyp": 24, "studi": 40, "style": 39, "sub": [], "subclass": [21, 24], "subject": [37, 40], "subplot": 39, "subsect": 0, "sum": [32, 39], "support": [29, 40], "suppress": 38, "surfac": [19, 26], "surface_potenti": 19, "surfacemeshprocessor": 19, "swell": 38, "switch": 38, "sy": 37, "syntax": [37, 40], "system": [0, 3, 6, 26, 27, 29, 36, 39, 40], "system_s": 37, "system_typ": [26, 29], "t": [8, 26, 29, 31, 38, 39, 40], "t0": 38, "t1": 39, "t2": 39, "tabl": 26, "tablefil": 8, "tabul": 38, "tabulatednonbond": 8, "tabulatedpotenti": 1, "tail": 40, "take": [39, 40], "target": [3, 39, 40], "target_trajectori": 3, "target_univers": 3, "tbgl": 0, "tcl": [15, 40], "techniqu": 38, "tediou": 38, "tell": 0, "temperatur": [4, 6, 8, 19, 20, 26, 27, 39], "templat": 0, "terin": 40, "term": 39, "termin": [39, 40], "test_average_grid": 32, "testaveragegrid": 32, "testcas": 32, "text": 40, "than": [0, 32, 38, 39, 40], "thank": 0, "thei": [0, 4, 39, 40], "them": [0, 38], "thermostat": [4, 38], "thi": [2, 3, 4, 5, 7, 8, 11, 18, 22, 24, 25, 26, 28, 29, 30, 32, 33, 37, 38, 39, 40, 41], "thick": 27, "thing": [0, 38], "think": 0, "third": 40, "those": [0, 37, 40], "three": [38, 39], "threshold": 24, "through": [38, 39, 40], "tile": 39, "time": [0, 37, 38, 39, 40], "timescal": 38, "timeseri": 39, "timestep": [4, 26, 37, 39, 40], "titl": 35, "tkconsol": 40, "tmp": 39, "togeth": [39, 40], "tol": [6, 39], "too": [0, 37], "tool": [36, 40], "top": 0, "topologi": 29, "torqu": 40, "total": 26, "trace": [38, 40], "traceback": [37, 38, 39, 40], "tracker": 0, "tractabl": 40, "traj": 40, "trajectori": [3, 6, 37, 38, 40], "transform": [1, 3], "translat": [1, 15, 38, 40], "translation_damp": 27, "translation_vector": 15, "trash": 39, "tree": 26, "triangl": 19, "trick": 39, "trombon": 40, "trombond": 40, "true": [1, 3, 6, 15, 24, 26, 27, 29, 31, 32, 38, 39], "truncat": [32, 40], "try": [38, 39], "ttygif": 0, "tupl": [1, 26, 29, 31, 32, 40], "turn": 39, "tutori": [0, 36, 37, 38], "two": [15, 29, 38, 39, 40], "type": [6, 8, 10, 12, 13, 14, 22, 24, 26, 27, 29, 31, 32, 38, 39, 40], "type_": [1, 8, 15, 37, 38, 39], "typea": [3, 26, 37, 38, 39], "typeb": [3, 26, 37, 38, 39], "u": [37, 38, 39, 40], "u1": 29, "u2": 29, "u_pkg": 38, "u_ylimit": 39, "uf": 0, "unabl": [39, 40], "under": 37, "underli": 38, "understand": 37, "unfamiliar": 0, "unfortun": 40, "uniform": 26, "uniqu": [26, 40], "unit": [3, 37, 38, 39, 40], "unit_quat_convers": 31, "unit_scal": [19, 20, 21], "univers": [3, 6, 29, 37, 38, 39], "unreason": 37, "until": 38, "up": [0, 22, 26, 37, 40], "updat": [3, 15, 38, 39, 40], "update_dimens": 27, "update_splin": [15, 16, 38, 39], "upload": 0, "upon": 40, "upper": 39, "upperbound": 32, "urei": 39, "us": [0, 1, 3, 8, 19, 20, 22, 23, 24, 26, 29, 32, 36, 37, 38, 39, 40], "usag": 39, "use_boundari": 24, "use_surfac": 21, "usecol": 40, "usenonbondedschem": 3, "user": [27, 37], "usr": [39, 40], "usual": [38, 39, 40], "util": [0, 5], "v": [6, 38, 40], "valu": [6, 27, 32, 37, 38, 39, 40], "valueerror": [3, 32], "variabl": [0, 30], "varieti": 36, "variou": [36, 38], "vdw": [23, 40], "vdw0": 40, "vdw1": 40, "vdw2": 40, "ve": [38, 39, 40], "vector": [3, 24, 31], "veri": 40, "verifi": 38, "versatil": 38, "version": [0, 14, 33], "video": 0, "viral": 40, "viscos": [4, 19, 20], "visitor": 0, "visual": [38, 40], "vmd": [23, 37, 38, 40], "vmd_cylinder_tcl": 15, "vmd_path": 4, "vmd_tube_tcl": 15, "volum": [16, 26, 27, 35], "volunt": 0, "voxel": [32, 38, 40], "vulner": 0, "w": [37, 38], "wa": [39, 40], "wai": [0, 39], "wait": 40, "walk": 39, "walkthrough": 36, "want": [0, 37, 38, 39, 40], "warn": [4, 32], "we": [37, 38, 39, 40], "weight": [1, 3, 26, 27, 31], "welcom": 36, "well": 38, "well_depth": 8, "what": [0, 40], "whatev": 39, "when": [0, 4, 38, 39, 40], "where": [0, 40], "whether": [0, 3, 32], "which": [0, 26, 32, 37, 38, 40], "while": [0, 38], "who": 0, "whoever": 0, "whose": 4, "why": [37, 38, 40], "wide": 36, "widgetsnbextens": 37, "within": [0, 15, 26, 38, 40], "without": 15, "wlcskangl": 8, "wlcskbond": 8, "wlcskpotenti": 8, "word": 37, "work": [24, 27, 29, 37, 38, 39, 40, 41], "work_dir": [19, 20, 23, 24, 27], "workaround": 40, "would": [0, 38, 39], "wrap_vector": 6, "write": [3, 8, 20, 24, 27, 29, 37, 38, 39], "write_cg_potenti": 6, "write_conf": 27, "write_config": 27, "write_confine_dx": 32, "write_fil": [6, 8], "write_no_enter_potenti": 20, "write_no_enter_potential_dx": 19, "write_pdb": 3, "write_pqr": [3, 27], "write_psf": 3, "write_release_vers": 35, "write_restraint_fil": 29, "write_simulation_fil": [24, 27], "writedx": [32, 38], "written": [39, 40], "www": 37, "x": [1, 27, 31, 32, 38, 39], "x1": [31, 39], "x2": [31, 39], "x3": 31, "x_dim": 31, "xl": [], "xlabel": [38, 39], "xlimit": 39, "xyz_dim": 27, "y": [27, 31, 38, 39], "y1": [31, 39], "y2": [31, 39], "y3": 31, "y_dim": 31, "yarn": 0, "year": 35, "yet": 40, "ylabel": 38, "you": [0, 37, 38, 40], "your": 37, "yourself": 37, "z": [27, 31, 38, 39], "z1": 31, "z2": 31, "z3": 31, "z_dim": 31, "zero": [6, 8, 37], "zip": [38, 39], "\u00e5": [19, 20, 27], "\u00e5ngstrom": 37}, "titles": ["arbdmodel-docs", "core_objects", "Core", "model", "sim_config", "API Reference", "ibi", "Interaction Potentials", "interactions", "fjc_polymer_model", "hps_polymer_model", "Polymer Modeling", "kh_polymer_model", "mpipi_polymer", "onck_polymer_model", "polymer", "sali_polymer_model", "ssdna_two_bead", "RigidBody Models", "mesh_process_surface", "mesh_process_volume", "mesh_rigidbody", "simplearbd", "structure_from_pdb", "structure_rigidbody", "Shape-Based Models", "shape_cg", "engine", "Simulation Engines", "parmed_bd", "binary_manager", "coords", "grid", "Utilities", "logger", "version", "ARBD Model Documentation", "Basic usage of the <code class=\"docutils literal notranslate\"><span class=\"pre\">arbdmodel</span></code> package", "Some polymer models may have multiple beads per monomer", "Implementing customized coarse-grained polymer models", "Modeling rigid-body objects", "Tutorials"], "titleterms": {"1": [37, 39], "2": [37, 39], "3": [37, 39, 41], "4": [37, 39, 41], "5": [37, 39], "6": 37, "7": 37, "acknowledg": 0, "ad": 40, "add": [0, 37, 38], "api": [5, 36], "arbd": [36, 37], "arbdmodel": [0, 37], "attach": 40, "author": 0, "avail": 41, "badg": 0, "base": 25, "basic": 37, "bead": 38, "between": 37, "binary_manag": 30, "bind": 40, "bodi": [40, 41], "boltzmann": 41, "bond": 37, "build": 37, "categori": 5, "coars": 39, "coarser": 39, "collabor": 0, "configur": 37, "constant": 38, "construct": 39, "contribut": 0, "coord": 31, "core": 2, "core_object": 1, "creat": 37, "custom": [37, 39], "deploi": 0, "describ": 37, "descript": 0, "determin": 38, "dna": 40, "doc": 0, "document": 36, "edit": 0, "elast": 38, "end": 38, "engin": [27, 28], "featur": 36, "file": [0, 37], "fine": 39, "fjc_polymer_model": 9, "forc": 38, "get": [0, 36], "good": 0, "grain": 39, "grid": 32, "have": 38, "hps_polymer_model": 10, "i": 37, "ibi": [6, 39], "implement": 39, "instal": 0, "integr": 0, "interact": [7, 8, 37], "invers": 41, "iter": 41, "kh_polymer_model": 12, "licens": 0, "logger": 34, "mai": 38, "map": 39, "mesh_process_surfac": 19, "mesh_process_volum": 20, "mesh_rigidbodi": 21, "model": [3, 11, 18, 25, 36, 38, 39, 40], "modul": [2, 5, 7, 11, 18, 25, 28, 33], "monom": 38, "mpipi_polym": 13, "multipl": 38, "name": 0, "object": 40, "onck_polymer_model": 14, "overview": 36, "packag": 37, "parmed_bd": 29, "particl": [37, 40], "per": 38, "plain": 37, "point": 40, "polym": [11, 15, 38, 39], "polymer_object": [], "potenti": 7, "project": 0, "properti": 38, "protein": 40, "python": 36, "readm": 0, "refer": [5, 36], "represent": 39, "result": 37, "rigid": [40, 41], "rigidbodi": 18, "roadmap": 0, "run": [37, 39], "sali_polymer_model": 16, "set": 39, "shape": 25, "shape_cg": 26, "sim_config": 4, "simplearbd": 22, "simul": [28, 37, 39], "singl": 40, "some": 38, "ssdna_two_bead": 17, "start": [0, 36], "statu": 0, "step": [37, 39], "strand": 40, "structure_from_pdb": 23, "structure_rigidbodi": 24, "suggest": 0, "support": 0, "system": 37, "team": 0, "test": 0, "text": 37, "thi": 0, "through": 37, "tool": 0, "trajectori": 39, "tutori": 41, "type": 37, "up": 39, "usag": [0, 37], "util": 33, "version": 35, "visual": [0, 37, 39], "your": 0}})
\ No newline at end of file
diff --git a/_build/html/tutorials/index.html b/_build/html/tutorials/index.html
index d1638632b95a53b50060f7981ee21f90bfb963ae..e5e6773fd178236b1fe6afd4811a0f83dc9404a1 100644
--- a/_build/html/tutorials/index.html
+++ b/_build/html/tutorials/index.html
@@ -32,19 +32,19 @@
     <link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-book-theme.css?v=eba8b062" />
     <link rel="stylesheet" type="text/css" href="../_static/togglebutton.css?v=13237357" />
     <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
-    <link rel="stylesheet" type="text/css" href="../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css?v=be8a1c11" />
     <link rel="stylesheet" type="text/css" href="../_static/sphinx-thebe.css?v=4fa983c6" />
     <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=4c969af8" />
-    <link rel="stylesheet" type="text/css" href="../_static/proof.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/proof.css?v=b4b7a797" />
     <link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-examples.css?v=e236af4b" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.custom.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.bundle.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-shadow.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-punk.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-noir.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-light.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-borderless.min.css" />
-    <link rel="stylesheet" type="text/css" href="../_static/css/micromodal.css" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.custom.css?v=7bc2f056" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster.bundle.min.css?v=37217874" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-shadow.min.css?v=6227e517" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-punk.min.css?v=94669e23" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-noir.min.css?v=21a39f42" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-light.min.css?v=a18b2449" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/tooltipster-sideTip-borderless.min.css?v=dbff53e4" />
+    <link rel="stylesheet" type="text/css" href="../_static/css/micromodal.css?v=d7bf34ee" />
     <link rel="stylesheet" type="text/css" href="../_static/sphinx-design.min.css?v=95c83b7e" />
   
   <!-- Pre-loaded scripts that we'll load fully later -->
@@ -61,9 +61,9 @@
     <script src="../_static/copybutton.js?v=f281be69"></script>
     <script src="../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
     <script src="../_static/tabs.js?v=3ee01567"></script>
-    <script src="../_static/js/hoverxref.js"></script>
-    <script src="../_static/js/tooltipster.bundle.min.js"></script>
-    <script src="../_static/js/micromodal.min.js"></script>
+    <script src="../_static/js/hoverxref.js?v=c95ade4f"></script>
+    <script src="../_static/js/tooltipster.bundle.min.js?v=18bf091b"></script>
+    <script src="../_static/js/micromodal.min.js?v=04d6302d"></script>
     <script>let toggleHintShow = 'Click to show';</script>
     <script>let toggleHintHide = 'Click to hide';</script>
     <script>let toggleOpenOnPrint = 'true';</script>
@@ -347,8 +347,6 @@ document.write(`
             <nav aria-label="Page">
                 <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#available-tutorials">Available Tutorials</a><ul class="nav section-nav flex-column">
-<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#basics">1- basics</a></li>
-<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#polymer-objects">2-polymer_objects</a></li>
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#iterative-boltzmann-inversion">3-iterative-boltzmann-inversion</a></li>
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#rigid-bodies">4-rigid-bodies</a></li>
 </ul>
@@ -369,18 +367,6 @@ document.write(`
 <p>This section contains tutorials and examples for working with the arbdmodel package.</p>
 <section id="available-tutorials">
 <h2>Available Tutorials<a class="headerlink" href="#available-tutorials" title="Link to this heading">#</a></h2>
-<section id="basics">
-<h3>1- basics<a class="headerlink" href="#basics" title="Link to this heading">#</a></h3>
-<ul class="simple">
-<li><p><a class="reference internal" href="1-basics.html"><span class="std std-doc">1 Basics</span></a></p></li>
-</ul>
-</section>
-<section id="polymer-objects">
-<h3>2-polymer_objects<a class="headerlink" href="#polymer-objects" title="Link to this heading">#</a></h3>
-<ul class="simple">
-<li><p><a class="reference internal" href="2-polymer-objects.html"><span class="std std-doc">2 Polymer Objects</span></a></p></li>
-</ul>
-</section>
 <section id="iterative-boltzmann-inversion">
 <h3>3-iterative-boltzmann-inversion<a class="headerlink" href="#iterative-boltzmann-inversion" title="Link to this heading">#</a></h3>
 <ul class="simple">
@@ -391,6 +377,8 @@ document.write(`
 <h3>4-rigid-bodies<a class="headerlink" href="#rigid-bodies" title="Link to this heading">#</a></h3>
 <ul class="simple">
 <li><p><a class="reference internal" href="4-rigid-bodies/4-rigid-bodies.html"><span class="std std-doc">4 Rigid Bodies</span></a></p></li>
+<li><p><a class="reference internal" href="1-basics.html"><span class="std std-doc">1 Basics</span></a></p></li>
+<li><p><a class="reference internal" href="2-polymer-objects.html"><span class="std std-doc">2 Polymer Objects</span></a></p></li>
 </ul>
 </section>
 </section>
@@ -461,8 +449,6 @@ document.write(`
   <nav class="bd-toc-nav page-toc">
     <ul class="visible nav section-nav flex-column">
 <li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#available-tutorials">Available Tutorials</a><ul class="nav section-nav flex-column">
-<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#basics">1- basics</a></li>
-<li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#polymer-objects">2-polymer_objects</a></li>
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#iterative-boltzmann-inversion">3-iterative-boltzmann-inversion</a></li>
 <li class="toc-h3 nav-item toc-entry"><a class="reference internal nav-link" href="#rigid-bodies">4-rigid-bodies</a></li>
 </ul>
diff --git a/tutorials/index.md b/tutorials/index.md
index 9e0793fdac81501680e3399a8ec159606bd73e52..ae7fdbe821d5571dda7e2a7e5444f63f208cc63b 100644
--- a/tutorials/index.md
+++ b/tutorials/index.md
@@ -4,12 +4,6 @@ This section contains tutorials and examples for working with the arbdmodel pack
 
 ## Available Tutorials
 
-### 1- basics
-- [1 Basics](1-basics.ipynb)
-
-### 2-polymer_objects
-- [2 Polymer Objects](2-polymer-objects.ipynb)
-
 ### 3-iterative-boltzmann-inversion
 
 - [3 Ibi](3-iterative-boltzmann-inversion/3-ibi.ipynb)
@@ -18,4 +12,5 @@ This section contains tutorials and examples for working with the arbdmodel pack
 
 - [4 Rigid Bodies](4-rigid-bodies/4-rigid-bodies.ipynb)
 
-
+- [1 Basics](1-basics.ipynb)
+- [2 Polymer Objects](2-polymer-objects.ipynb)