') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - RuleWorld/SIAMLS26: Materials and setup instructions for the SIAM LS26 minitutorial on rule-based modeling with BioNetGen and NFsim. · GitHub
Skip to content

Repository files navigation

Structure-based Modeling of Biochemical Reaction Networks using BioNetGen

A minitutorial at SIAM Life Sciences 2026

This page has everything you need before, during, and after the tutorial: a schedule, software setup instructions, and links to all example models we'll walk through.

Note: This is not a hands-on coding session — you don't need to install anything to follow along. But if you'd like to try the examples yourself afterward (or follow along live), see Getting Started below.


Schedule

TopicPresenter
Introduction to rule-based modeling, BioNetGen VSCode extension, SBMLJames Faeder
Demonstration in VSCode, Interfacing with MATLABLaura Strube (LFStrube@gmail.com)
PyBioNetGen, Stochastic Simulation, Sensitivity Analysis, Parameter EstimationJames Faeder
Network-based vs. network-free simulation, NFsimAlex DiBiasi
Model integration and simulation pipelines with BNGPlayground (INDRA, EGFR case study)Achyudhan Kutuva
Applications: WESTPA/WEBNG, RuleHub, and the broader ecosystemVarious

What we'll cover

  • Rule-based modeling concepts — why some biochemical systems (like multivalent ligand-receptor binding) can't be described with a fixed set of ODEs
  • BioNetGen — building rule-based models with .bngl files, generating reaction networks, and simulating with ODE/SSA solvers
  • Python ecosystem — PyBioNetGen, Jupyter-based workflows, sensitivity analysis, parameter estimation, identifiability
  • NFsim — simulating systems whose reaction networks are too large (or infinite) to enumerate, using network-free simulation
  • Applications — weighted ensemble simulation (WESTPA/WEBNG), model integration with INDRA, and the broader RuleHub model repository

Getting started

To follow along with the example models (optional, not required for the talk itself), consider one of avenues for accessing BioNetGen:

  1. BNGPlayground Simply click this link

  2. Install BioNetGen. Follow the instructions from the BioNetGen website or install the BioNetGen VSCode extension for an integrated editing/simulation experience.

  3. Install PyBioNetGen for Python-based workflows:

    pip install bionetgen

Example models

All example .bngl files discussed in the tutorial are in the models/ folder of this repo:

  • Example_SimpleSTAT.bngl— Simple model of IL10-induced STAT phosphorylation
  • LR.bngl — basic L + R ⇌ LR ligand-receptor model
  • TLBR.bngl — trivalent ligand / bivalent receptor model (NFsim)
  • LAT.bngl — LAT-Grb2-SOS1 aggregation model (NFsim)
  • translation.bngl — ribosome translation model (NFsim)

Resources


Questions?

We'll have time for Q&A throughout the session — feel free to interrupt with questions. After the tutorial, you can reach us at [bionetgen.main@gmail.com] or open an issue on this repo.


Faeder Lab, University of Pittsburgh

About

Materials and setup instructions for the SIAM LS26 minitutorial on rule-based modeling with BioNetGen and NFsim.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages