1<!DOCTYPE html> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head> 3 4<meta charset="utf-8"> 5<meta name="generator" content="quarto-1.4.550"> 6 7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> 8 9 10<title>Chirag Patelâs Group - Resources</title> 11<style> 12code{white-space: pre-wrap;} 13span.smallcaps{font-variant: small-caps;} 14div.columns{display: flex; gap: min(4vw, 1.5em);} 15div.column{flex: auto; overflow-x: auto;} 16div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} 17ul.task-list{list-style: none;} 18ul.task-list li input[type="checkbox"] { 19 width: 0.8em; 20 margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 21 vertical-align: middle; 22} 23</style> 24 25
26<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 26
26
27<script src="site_libs/quarto-nav/headroom.min.js"></script>
27 28<link href="./img/logo.png" rel="icon" type="image/png">
29<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-html/quarto.js"></script>
vendor: 1 bytes, line 30
30
31<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 31
31
32<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-html/anchor.min.js"></script>
33 34<link href="site_libs/quarto-html/tippy.css" rel="stylesheet"> 35<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">
36<script src="site_libs/bootstrap/bootstrap.min.js"></script>
36 37<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet"> 38<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light"> 39<link href="site_libs/quarto-contrib/fontawesome6-0.1.0/all.css" rel="stylesheet"> 40<link href="site_libs/quarto-contrib/fontawesome6-0.1.0/latex-fontsize.css" rel="stylesheet">
41<script id="quarto-search-options" type="application/json">{ 42 "language": { 43 "search-no-results-text": "No results", 44 "search-matching-documents-text": "matching documents", 45 "search-copy-link-title": "Copy link to search", 46 "search-hide-matches-text": "Hide additional matches", 47 "search-more-match-text": "more match in this document", 48 "search-more-matches-text": "more matches in this document", 49 "search-clear-button-title": "Clear", 50 "search-text-placeholder": "", 51 "search-detached-cancel-button-title": "Cancel", 52 "search-submit-button-title": "Submit", 53 "search-label": "Search" 54 } 55}</script>
vendor: 67 bytes, lines 55-56
55 56<script async="" src="https://www.googletagmanager.com/gtag/js?id=
56G-QRGRZ5HCRW
vendor: 13 bytes, lines 56-57
56"></script> 57
58<script type="text/javascript"> 59
vendor: 127 bytes, lines 60-63
60window.dataLayer = window.dataLayer || []; 61function gtag(){dataLayer.push(arguments);} 62gtag('js', new Date()); 63gtag('config', '
63G-QRGRZ5HCRW
vendor: 29 bytes, line 63
63', { 'anonymize_ip': true});
64</script>
64 65 66 67<link rel="stylesheet" href="styles.css"> 68</head> 69 70<body class="nav-fixed"> 71 72<div id="quarto-search-results"></div> 73 <header id="quarto-header" class="headroom fixed-top"> 74 <nav class="navbar navbar-expand-lg " data-bs-theme="dark"> 75 <div class="navbar-container container-fluid"> 76 <div class="navbar-brand-container mx-auto"> 77 <a class="navbar-brand" href="./index.html"> 78 <span class="navbar-title">Chirag Patelâs Group</span> 79 </a> 80 </div> 81 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }"> 82 <span class="navbar-toggler-icon"></span> 83</button> 84 <div class="collapse navbar-collapse" id="navbarCollapse"> 85 <ul class="navbar-nav navbar-nav-scroll ms-auto"> 86 <li class="nav-item"> 87 <a class="nav-link" href="./index.html"> 88<span class="menu-text">Home</span></a> 89 </li> 90 <li class="nav-item"> 91 <a class="nav-link" href="./members.html"> 92<span class="menu-text">The Group</span></a> 93 </li> 94 <li class="nav-item"> 95 <a class="nav-link active" href="./resources.html" aria-current="page"> 96<span class="menu-text">Resources</span></a> 97 </li> 98 <li class="nav-item"> 99 <a class="nav-link" href="./pubs.html"> 100<span class="menu-text">Publications</span></a> 101 </li> 102 <li class="nav-item"> 103 <a class="nav-link" href="./about.html"> 104<span class="menu-text">About</span></a> 105 </li> 106 <li class="nav-item compact"> 107 <a class="nav-link" href="https://twitter.com/chiragjp"> <i class="bi bi-twitter" role="img" aria-label="Twitter"> 108</i> 109<span class="menu-text"></span></a> 110 </li> 111</ul> 112 </div> <!-- /navcollapse --> 113 <div class="quarto-navbar-tools"> 114</div> 115 </div> <!-- /container-fluid --> 116 </nav> 117</header> 118<!-- content --> 119<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar"> 120<!-- sidebar --> 121<!-- margin-sidebar --> 122 <div id="quarto-margin-sidebar" class="sidebar margin-sidebar"> 123 <nav id="TOC" role="doc-toc" class="toc-active"> 124 <h2 id="toc-title">On this page</h2> 125 126 <ul> 127 <li><a href="#nexus-network-of-exposomics-in-the-us" id="toc-nexus-network-of-exposomics-in-the-us" class="nav-link active" data-scroll-target="#nexus-network-of-exposomics-in-the-us">NEXUS: Network of Exposomics in the US</a></li> 128 <li><a href="#the-confluence-projects" id="toc-the-confluence-projects" class="nav-link" data-scroll-target="#the-confluence-projects">The Confluence Projects</a></li> 129 <li><a href="#exposome-wide-studies" id="toc-exposome-wide-studies" class="nav-link" data-scroll-target="#exposome-wide-studies">Exposome-wide studies</a> 130 <ul class="collapse"> 131 <li><a href="#human-exposomic-architecture-of-the-proteome" id="toc-human-exposomic-architecture-of-the-proteome" class="nav-link" data-scroll-target="#human-exposomic-architecture-of-the-proteome">Human Exposomic Architecture of the Proteome</a></li> 132 <li><a href="#the-architecture-of-physiological-phenotypes-exposome-phenome-atlas" id="toc-the-architecture-of-physiological-phenotypes-exposome-phenome-atlas" class="nav-link" data-scroll-target="#the-architecture-of-physiological-phenotypes-exposome-phenome-atlas">The Architecture of Physiological Phenotypes: Exposome-Phenome Atlas</a></li> 133 <li><a href="#claims-analysis-of-twins-correlation-and-heritability" id="toc-claims-analysis-of-twins-correlation-and-heritability" class="nav-link" data-scroll-target="#claims-analysis-of-twins-correlation-and-heritability">Claims Analysis of Twins Correlation and Heritability</a></li> 134 <li><a href="#exposome-globe-browser" id="toc-exposome-globe-browser" class="nav-link" data-scroll-target="#exposome-globe-browser">Exposome Globe Browser</a></li> 135 </ul></li> 136 <li><a href="#databases" id="toc-databases" class="nav-link" data-scroll-target="#databases">Databases</a> 137 <ul class="collapse"> 138 <li><a href="#repodb" id="toc-repodb" class="nav-link" data-scroll-target="#repodb">RepoDB</a></li> 139 <li><a href="#meshdd" id="toc-meshdd" class="nav-link" data-scroll-target="#meshdd">MeshDD</a></li> 140 </ul></li> 141 <li><a href="#software" id="toc-software" class="nav-link" data-scroll-target="#software">Software</a> 142 <ul class="collapse"> 143 <li><a href="#exposome-atlas-creation" id="toc-exposome-atlas-creation" class="nav-link" data-scroll-target="#exposome-atlas-creation">Exposome Atlas Creation</a></li> 144 <li><a href="#human-exposomic-architecture-of-the-proteome-1" id="toc-human-exposomic-architecture-of-the-proteome-1" class="nav-link" data-scroll-target="#human-exposomic-architecture-of-the-proteome-1">Human Exposomic Architecture of the Proteome</a></li> 145 <li><a href="#vibration-of-effects" id="toc-vibration-of-effects" class="nav-link" data-scroll-target="#vibration-of-effects">
145Vibration of Effects</a></li> 146 </ul></li> 147 <li><a href="#course-materials" id="toc-course-materials" class="nav-link" data-scroll-target="#course-materials">Course Materials</a></li> 148 <li><a href="#other-resources" id="toc-other-resources" class="nav-link" data-scroll-target="#other-resources">Other Resources</a> 149 <ul class="collapse"> 150 <li><a href="#machine-learning-and-biological-age" id="toc-machine-learning-and-biological-age" class="nav-link" data-scroll-target="#machine-learning-and-biological-age">Machine Learning and Biological Age</a></li> 151 <li><a href="#hiv-exposure-wide-study-across-sub-saharan-africa" id="toc-hiv-exposure-wide-study-across-sub-saharan-africa" class="nav-link" data-scroll-target="#hiv-exposure-wide-study-across-sub-saharan-africa">HIV+ Exposure-wide study across Sub-Saharan Africa</a></li> 152 <li><a href="#non-linear-relationships-between-physiological-indicators-and-all-cause-mortality-in-the-us" id="toc-non-linear-relationships-between-physiological-indicators-and-all-cause-mortality-in-the-us" class="nav-link" data-scroll-target="#non-linear-relationships-between-physiological-indicators-and-all-cause-mortality-in-the-us">Non-linear relationships between physiological indicators and all-cause mortality in the US</a></li> 153 <li><a href="#data-driven-characterization-of-exposome-risk-variables-for-type-2-diabetes-in-the-netherlands" id="toc-data-driven-characterization-of-exposome-risk-variables-for-type-2-diabetes-in-the-netherlands" class="nav-link" data-scroll-target="#data-driven-characterization-of-exposome-risk-variables-for-type-2-diabetes-in-the-netherlands">Data-driven characterization of exposome risk variables for type 2 diabetes in the Netherlands</a></li> 154 <li><a href="#probing-the-space-of-covid-19-non-pharmaceutical-interventions" id="toc-probing-the-space-of-covid-19-non-pharmaceutical-interventions" class="nav-link" data-scroll-target="#probing-the-space-of-covid-19-non-pharmaceutical-interventions">Probing the space of COVID-19 non-pharmaceutical interventions</a></li> 155 </ul></li> 156 <li><a href="#section" id="toc-section" class="nav-link" data-scroll-target="#section"></a></li> 157 </ul> 158</nav> 159 </div> 160<!-- main --> 161<main class="content" id="quarto-document-content"> 162 163<header id="title-block-header" class="quarto-title-block default"> 164<div class="quarto-title"> 165<h1 class="title">Resources</h1> 166</div> 167 168 169 170<div class="quarto-title-meta"> 171 172 173 174 175 </div> 176 177 178 179</header> 180 181 182<section id="nexus-network-of-exposomics-in-the-us" class="level3"> 183<h3 class="anchored" data-anchor-id="nexus-network-of-exposomics-in-the-us"><a href="https://www.nexus-exposomics.org" title="NEXUS">NEXUS: Network of Exposomics in the US</a></h3> 184<p>The NEXUS (<strong>N</strong>etwork of <strong>EX</strong>posomics in the <strong>U</strong>nited <strong>S</strong>tates) is a Center for Exposome Research Coordination (CERC). The center aims to serve the broad biomedical research community by orchestrating the advancement and promotion of exposome research. The center is supported by the National Institutes of Health under grant number <a href="https://reporter.nih.gov/project-details/10993456" title="NIH Reporter"><strong>U24ES036819</strong></a>.</p> 185</section> 186<section id="the-confluence-projects" class="level3"> 187<h3 class="anchored" data-anchor-id="the-confluence-projects"><a href="https://www.confluence-project.org">The Confluence Projects</a></h3> 188<p>Analytics and data resources to study the geospatial exposome in exacerbating health outcomes of the elderly population.</p> 189</section> 190<section id="exposome-wide-studies" class="level2"> 191<h2 class="anchored" data-anchor-id="exposome-wide-studies">Exposome-wide studies</h2> 192<section id="human-exposomic-architecture-of-the-proteome" class="level3"> 193<h3 class="anchored" data-anchor-id="human-exposomic-architecture-of-the-proteome"><a href="https://heap.bio">Human Exposomic Architecture of the Proteome</a></h3> 194<p>HEAP (Human Exposomic Architecture of the Proteome) is a comprehensive tool designed to analyze the interactions between genetics, exposures, proteomics, and disease outcomes. It leverages data from the UK Biobank to provide insights into how various factors contribute to health and disease.</p> 195</section> 196<section id="the-architecture-of-physiological-phenotypes-exposome-phenome-atlas" class="level3"> 197<h3 class="anchored" data-anchor-id="the-architecture-of-physiological-phenotypes-exposome-phenome-atlas"><a href="https://pe.exposomeatlas.com">The Architecture of Physiological Phenotypes: Exposome-Phenome Atlas</a></h3> 198<p>How much variation do exposures explain in phenotype? This is an atlas of exposome-clinical phenotype relationships, demonstrating the complex role of the exposome in health and disease risk.</p> 199</section> 200<section id="claims-analysis-of-twins-correlation-and-heritability" class="level3"> 201<h3 class="anchored" data-anchor-id="claims-analysis-of-twins-correlation-and-heritability"><a href="https://catch.exposomeatlas.com">Claims Analysis of Twins Correlation and Heritability</a></h3> 202<p>We estimate the relative contribution of genetics and shared exposome in 560 phenotypes in a large health insurance cohort analyzing data from ~60,000 twins and ~500,000 siblings.</p> 203</section> 204<section id="exposome-globe-browser" class="level3"> 205<h3 class="anchored" data-anchor-id="exposome-globe-browser"><a href="http://bit.ly/globebrowse">Exposome Globe Browser</a></h3> 206<p>What is the âlinkage disequilibriumâ of the exposome? View how biomarkers of exposures are correlated with one another and disease-related phenotypes.</p> 207</section> 208</section> 209<section id="databases" class="level2"> 210<h2 class="anchored" data-anchor-id="databases">Databases</h2> 211<section id="repodb" class="level3"> 212<h3 class="anchored" data-anchor-id="repodb"><a href="http://apps.chiragjpgroup.org/repoDB/">RepoDB</a></h3> 213<p>Developing new computational approach for predicting new drug repositioning candidates? Test your predictions with our standard database for drug repositioning.</p> 214</section> 215<section id="meshdd" class="level3"> 216<h3 class="anchored" data-anchor-id="meshdd"><a href="http://apps.chiragjpgroup.org/MeSHDD/">MeshDD</a></h3> 217<p>MeSHDD uses MeSH-term enrichment to discover literature-based similarities between FDA approved drugs.</p> 218</section> 219</section> 220<section id="software" class="level2"> 221<h2 class="anchored" data-anchor-id="software">Software</h2> 222<section id="exposome-atlas-creation" class="level3"> 223<h3 class="anchored" data-anchor-id="exposome-atlas-creation"><a href="https://github.com/chiragjp/nhanespewas">Exposome Atlas Creation</a></h3> 224<p>Software to document exposome-phenome correlations and systematically assesses replicability across independent cohorts.</p> 225</section> 226<section id="human-exposomic-architecture-of-the-proteome-1" class="level3"> 227<h3 class="anchored" data-anchor-id="human-exposomic-architecture-of-the-proteome-1"><a href="https://github.com/shakson-isaac/HEAP">Human Exposomic Architecture of the Proteome</a></h3> 228<p>Software to develop associations between the exposome and proteome, considering GxE, mediation, and longitudinal outcomes.</p> 229</section> 230<section id="vibration-of-effects" class="level3"> 231<h3 class="anchored" data-anchor-id="vibration-of-effects"><a href="https://www.chiragjpgroup.org/voe/">
231Vibration of Effects</a></h3> 232<p>How do inferences change based on the parameters of statistical models? Estimate the distribution of association sizes, and p-values based on model selection, called the Vibration of Effects (VoE).</p> 233<ol type="1"> 234<li><i class="fa-brands fa-github" aria-label="github"></i> <a href="https://github.com/chiragjp/voe">Journal of Clinical Epidemiology 2016: Mortality</a></li> 235<li><i class="fa-brands fa-github" aria-label="github"></i> <a href="https://github.com/chiragjp/microbiome_voe">PLOS Biology 2022 Microbiome</a></li> 236<li><i class="fa-brands fa-github" aria-label="github"></i> <a href="https://github.com/chiragjp/quantvoe">PLOS Biology 2021: Data-driven for quantitative phenotypes</a> (quantvoe)</li> 237</ol> 238<section id="polyexposure-risk-scores-pxs-via-pxstools" class="level4"> 239<h4 class="anchored" data-anchor-id="polyexposure-risk-scores-pxs-via-pxstools"><a href="https://github.com/yixuanh/PXStools">Polyexposure Risk Scores (PXS) via PXSTools</a></h4> 240<p>PXStools provides an analytical package to standardize exposome-wide studies as well as derive and validate polyexposure risk scores in the UK Biobank. <i class="fa-brands fa-github" aria-label="github"></i> <a href="https://github.com/yixuanh/PXStools">PXSTools</a></p> 241</section> 242</section> 243</section> 244<section id="course-materials" class="level2"> 245<h2 class="anchored" data-anchor-id="course-materials">Course Materials</h2> 246<p><i class="fa-brands fa-github" aria-label="github"></i> Course materials and starter code for exposome-phenome data analysis.</p> 247</section> 248<section id="other-resources" class="level2"> 249<h2 class="anchored" data-anchor-id="other-resources">Other Resources</h2> 250<section id="machine-learning-and-biological-age" class="level3"> 251<h3 class="anchored" data-anchor-id="machine-learning-and-biological-age"><a href="https://www.multidimensionality-of-aging.net">Machine Learning and Biological Age</a></h3> 252<p>Biological age is the deviation from chronological age and is hypothesized to be one causal factor for age-related disease. Biological age, however, is difficult to measure. Here, we analyzed 676,787 samples from 502,211 UK Biobank participants aged 37-82 years with deep learning artificial intelligence approaches to build a total of 331 biological age predictors on different data modalities (e.g., Magnetic Resonance Imaging)</p> 253</section> 254<section id="hiv-exposure-wide-study-across-sub-saharan-africa" class="level3"> 255<h3 class="anchored" data-anchor-id="hiv-exposure-wide-study-across-sub-saharan-africa"><a href="https://www.chiragjpgroup.org/dhs_hiv_meta/">HIV+ Exposure-wide study across Sub-Saharan Africa</a></h3> 256<p>Predisposition to become HIV positive (HIVâ+â) is influenced by a wide range of correlated economic, environmental, demographic, social, and behavioral factors. A data-driven approach to identify risk factors for HIV+ in across Sub-Saharan Africa in over 600,000 individuals.</p> 257</section> 258<section id="non-linear-relationships-between-physiological-indicators-and-all-cause-mortality-in-the-us" class="level3"> 259<h3 class="anchored" data-anchor-id="non-linear-relationships-between-physiological-indicators-and-all-cause-mortality-in-the-us"><a href="https://chiragjp.shinyapps.io/%20nhanes_mortality_associations/">Non-linear relationships between physiological indicators and all-cause mortality in the US</a></h3> 260<p>We document linear and non-linear relationships of 27 physiological indicators with all-cause mortality to evaluate whether the current clinical thresholds are suitable in distinguishing patients at high risk for mortality from those at low risk.</p> 261</section> 262<section id="data-driven-characterization-of-exposome-risk-variables-for-type-2-diabetes-in-the-netherlands" class="level3"> 263<h3 class="anchored" data-anchor-id="data-driven-characterization-of-exposome-risk-variables-for-type-2-diabetes-in-the-netherlands"><a href="https://chiragjp.shinyapps.io/t2d_relative_risk_variables/">Data-driven characterization of exposome risk variables for type 2 diabetes in the Netherlands</a></h3> 264<p>We query for environmental and modifiable drivers of type 2 diabetes risk in the Lifelines Biobank Cohort.</p> 265</section> 266<section id="probing-the-space-of-covid-19-non-pharmaceutical-interventions" class="level3"> 267<h3 class="anchored" data-anchor-id="probing-the-space-of-covid-19-non-pharmaceutical-interventions">
267<a href="https://eranbendavid.shinyapps.io/CovidGovPolicies/" title="Multiverse of COVID-19">Probing the space of COVID-19 non-pharmaceutical interventions</a></h3> 268<p>We use a<a href="https://www.science.org/doi/10.1126/sciadv.adn0671">âmultiverse approachâ</a> to evaluate the role of non-pharmaceutical inventions deployed during the pandemic to assess what worked and what didnât. TL;DR: not enough data.</p> 269</section> 270</section> 271<section id="section" class="level2"> 272<h2 class="anchored" data-anchor-id="section"></h2> 273 274 275</section> 276 277</main> <!-- /main -->
278<script id="quarto-html-after-body" type="application/javascript"> 279window.document.addEventListener("DOMContentLoaded", function (event) { 280 const toggleBodyColorMode = (bsSheetEl) => { 281 const mode = bsSheetEl.getAttribute("data-mode"); 282 const bodyEl = window.document.querySelector("body"); 283 if (mode === "dark") { 284 bodyEl.classList.add("quarto-dark"); 285 bodyEl.classList.remove("quarto-light"); 286 } else { 287 bodyEl.classList.add("quarto-light"); 288 bodyEl.classList.remove("quarto-dark"); 289 } 290 } 291 const toggleBodyColorPrimary = () => { 292 const bsSheetEl = window.document.querySelector("link#quarto-bootstrap"); 293 if (bsSheetEl) { 294 toggleBodyColorMode(bsSheetEl); 295 } 296 } 297 toggleBodyColorPrimary(); 298 const icon = "î§"; 299 const anchorJS = new window.AnchorJS(); 300 anchorJS.options = { 301 placement: 'right', 302 icon: icon 303 }; 304 anchorJS.add('.anchored'); 305 const isCodeAnnotation = (el) => { 306 for (const clz of el.classList) { 307 if (clz.startsWith('code-annotation-')) { 308 return true; 309 } 310 } 311 return false; 312 } 313 const clipboard = new window.ClipboardJS('.code-copy-button', { 314 text: function(trigger) { 315 const codeEl = trigger.previousElementSibling.cloneNode(true); 316 for (const childEl of codeEl.children) { 317 if (isCodeAnnotation(childEl)) { 318 childEl.remove(); 319 } 320 } 321 return codeEl.innerText; 322 } 323 }); 324 clipboard.on('success', function(e) { 325 // button target 326 const button = e.trigger; 327 // don't keep focus 328 button.blur(); 329 // flash "checked" 330 button.classList.add('code-copy-button-checked'); 331 var currentTitle = button.getAttribute("title"); 332 button.setAttribute("title", "Copied!"); 333 let tooltip; 334 if (window.bootstrap) { 335 button.setAttribute("data-bs-toggle", "tooltip"); 336 button.setAttribute("data-bs-placement", "left"); 337 button.setAttribute("data-bs-title", "Copied!"); 338 tooltip = new bootstrap.Tooltip(button, 339 { trigger: "manual", 340 customClass: "code-copy-button-tooltip", 341 offset: [0, -8]}); 342 tooltip.show(); 343 } 344 setTimeout(function() { 345 if (tooltip) { 346 tooltip.hide(); 347 button.removeAttribute("data-bs-title"); 348 button.removeAttribute("data-bs-toggle"); 349 button.removeAttribute("data-bs-placement"); 350 } 351 button.setAttribute("title", currentTitle); 352 button.classList.remove('code-copy-button-checked'); 353 }, 1000); 354 // clear code selection 355 e.clearSelection(); 356 }); 357 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 358 const config = { 359 allowHTML: true, 360 maxWidth: 500, 361 delay: 100, 362 arrow: false, 363 appendTo: function(el) { 364 return el.parentElement; 365 }, 366 interactive: true, 367 interactiveBorder: 10, 368 theme: 'quarto', 369 placement: 'bottom-start', 370 }; 371 if (contentFn) { 372 config.content = contentFn; 373 } 374 if (onTriggerFn) { 375 config.onTrigger = onTriggerFn; 376 } 377 if (onUntriggerFn) { 378 config.onUntrigger = onUntriggerFn; 379 } 380 window.tippy(el, config); 381 } 382 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 383 for (var i=0; i<noterefs.length; i++) { 384 const ref = noterefs[i]; 385 tippyHover(ref, function() { 386 // use id or data attribute instead here 387 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 388 try { href = new URL(href).hash; } catch {} 389 const id = href.replace(/^#\/?/, ""); 390 const note = window.document.getElementById(id); 391 return note.innerHTML; 392 }); 393 } 394 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 395 const processXRef = (id, note) => { 396 // Strip column container classes 397 const stripColumnClz = (el) => { 398 el.classList.remove("page-full", "page-columns"); 399 if (el.children) { 400 for (const child of el.children) { 401 stripColumnClz(child); 402 } 403 } 404 } 405 stripColumnClz(note) 406 if (id === null || id.startsWith('sec-')) { 407 // Special case sections, only their first couple elements 408 const container = document.createElement("div"); 409 if (note.children && note.children.length > 2) { 410 container.appendChild(note.children[0].cloneNode(true)); 411 for (let i = 1; i < note.children.length; i++) { 412 const child = note.children[i]; 413 if (child.tagName === "P" && child.innerText === "") { 414 continue; 415 } else { 416 container.appendChild(child.cloneNode(true)); 417 break; 418 } 419 } 420 if (window.Quarto?.typesetMath) { 421 window.Quarto.typesetMath(container); 422 } 423 return container.innerHTML 424 } else { 425 if (window.Quarto?.typesetMath) { 426 window.Quarto.typesetMath(note); 427 } 428 return note.innerHTML; 429 } 430 } else { 431 // Remove any anchor links if they are present 432 const anchorLink = note.querySelector('a.anchorjs-link'); 433 if (anchorLink) { 434 anchorLink.remove(); 435 } 436 if (window.Quarto?.typesetMath) { 437 window.Quarto.typesetMath(note); 438 } 439 // TODO in 1.5, we should make sure this works without a callout special case 440 if (note.classList.contains("callout")) { 441 return note.outerHTML; 442 } else { 443 return note.innerHTML; 444 } 445 } 446 } 447 for (var i=0; i<xrefs.length; i++) { 448 const xref = xrefs[i]; 449 tippyHover(xref, undefined, function(instance) { 450 instance.disable(); 451 let url = xref.getAttribute('href'); 452 let hash = undefined; 453 if (url.startsWith('#')) { 454 hash = url; 455 } else { 456 try { hash = new URL(url).hash; } catch {} 457 } 458 if (hash) { 459 const id = hash.replace(/^#\/?/, ""); 460 const note = window.document.getElementById(id); 461 if (note !== null) { 462 try { 463 const html = processXRef(id, note.cloneNode(true)); 464 instance.setContent(html); 465 } finally { 466 instance.enable(); 467 instance.show(); 468 } 469 } else { 470 // See if we can fetch this 471 fetch(url.split('#')[0]) 472 .then(res => res.text()) 473 .then(html => { 474 const parser = new DOMParser(); 475 const htmlDoc = parser.parseFromString(html, "text/html"); 476 const note = htmlDoc.getElementById(id); 477 if (note !== null) { 478 const html = processXRef(id, note); 479 instance.setContent(html); 480 } 481 }).finally(() => { 482 instance.enable(); 483 instance.show(); 484 }); 485 } 486 } else { 487 // See if we can fetch a full url (with no hash to target)
488 // This is a special case and we should probably do some content thinning / targeting 489 fetch(url) 490 .then(res => res.text()) 491 .then(html => { 492 const parser = new DOMParser(); 493 const htmlDoc = parser.parseFromString(html, "text/html"); 494 const note = htmlDoc.querySelector('main.content'); 495 if (note !== null) { 496 // This should only happen for chapter cross references 497 // (since there is no id in the URL) 498 // remove the first header 499 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 500 note.children[0].remove(); 501 } 502 const html = processXRef(null, note); 503 instance.setContent(html); 504 } 505 }).finally(() => { 506 instance.enable(); 507 instance.show(); 508 }); 509 } 510 }, function(instance) { 511 }); 512 } 513 let selectedAnnoteEl; 514 const selectorForAnnotation = ( cell, annotation) => { 515 let cellAttr = 'data-code-cell="' + cell + '"'; 516 let lineAttr = 'data-code-annotation="' + annotation + '"'; 517 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 518 return selector; 519 } 520 const selectCodeLines = (annoteEl) => { 521 const doc = window.document; 522 const targetCell = annoteEl.getAttribute("data-target-cell"); 523 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 524 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 525 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 526 const lineIds = lines.map((line) => { 527 return targetCell + "-" + line; 528 }) 529 let top = null; 530 let height = null; 531 let parent = null; 532 if (lineIds.length > 0) { 533 //compute the position of the single el (top and bottom and make a div) 534 const el = window.document.getElementById(lineIds[0]); 535 top = el.offsetTop; 536 height = el.offsetHeight; 537 parent = el.parentElement.parentElement; 538 if (lineIds.length > 1) { 539 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 540 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 541 height = bottom - top; 542 } 543 if (top !== null && height !== null && parent !== null) { 544 // cook up a div (if necessary) and position it 545 let div = window.document.getElementById("code-annotation-line-highlight"); 546 if (div === null) { 547 div = window.document.createElement("div"); 548 div.setAttribute("id", "code-annotation-line-highlight"); 549 div.style.position = 'absolute'; 550 parent.appendChild(div); 551 } 552 div.style.top = top - 2 + "px"; 553 div.style.height = height + 4 + "px"; 554 div.style.left = 0; 555 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 556 if (gutterDiv === null) { 557 gutterDiv = window.document.createElement("div"); 558 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 559 gutterDiv.style.position = 'absolute'; 560 const codeCell = window.document.getElementById(targetCell); 561 const gutter = codeCell.querySelector('.code-annotation-gutter'); 562 gutter.appendChild(gutterDiv); 563 } 564 gutterDiv.style.top = top - 2 + "px"; 565 gutterDiv.style.height = height + 4 + "px"; 566 } 567 selectedAnnoteEl = annoteEl; 568 } 569 }; 570 const unselectCodeLines = () => { 571 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 572 elementsIds.forEach((elId) => { 573 const div = window.document.getElementById(elId); 574 if (div) { 575 div.remove(); 576 } 577 }); 578 selectedAnnoteEl = undefined; 579 }; 580 // Handle positioning of the toggle 581 window.addEventListener( 582 "resize", 583 throttle(() => { 584 elRect = undefined; 585 if (selectedAnnoteEl) { 586 selectCodeLines(selectedAnnoteEl); 587 } 588 }, 10) 589 ); 590 function throttle(fn, ms) { 591 let throttle = false;
592 let timer; 593 return (...args) => { 594 if(!throttle) { // first call gets through 595 fn.apply(this, args); 596 throttle = true; 597 } else { // all the others get throttled 598 if(timer) clearTimeout(timer); // cancel #2 599 timer = setTimeout(() => { 600 fn.apply(this, args); 601 timer = throttle = false; 602 }, ms); 603 } 604 }; 605 } 606 // Attach click handler to the DT 607 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 608 for (const annoteDlNode of annoteDls) { 609 annoteDlNode.addEventListener('click', (event) => { 610 const clickedEl = event.target; 611 if (clickedEl !== selectedAnnoteEl) { 612 unselectCodeLines(); 613 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 614 if (activeEl) { 615 activeEl.classList.remove('code-annotation-active'); 616 } 617 selectCodeLines(clickedEl); 618 clickedEl.classList.add('code-annotation-active'); 619 } else { 620 // Unselect the line 621 unselectCodeLines(); 622 clickedEl.classList.remove('code-annotation-active'); 623 } 624 }); 625 } 626 const findCites = (el) => { 627 const parentEl = el.parentElement; 628 if (parentEl) { 629 const cites = parentEl.dataset.cites; 630 if (cites) { 631 return { 632 el, 633 cites: cites.split(' ') 634 }; 635 } else { 636 return findCites(el.parentElement) 637 } 638 } else { 639 return undefined; 640 } 641 }; 642 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 643 for (var i=0; i<bibliorefs.length; i++) { 644 const ref = bibliorefs[i]; 645 const citeInfo = findCites(ref); 646 if (citeInfo) { 647 tippyHover(citeInfo.el, function() { 648 var popup = window.document.createElement('div'); 649 citeInfo.cites.forEach(function(cite) { 650 var citeDiv = window.document.createElement('div'); 651 citeDiv.classList.add('hanging-indent'); 652 citeDiv.classList.add('csl-entry'); 653 var biblioDiv = window.document.getElementById('ref-' + cite); 654 if (biblioDiv) { 655 citeDiv.innerHTML = biblioDiv.innerHTML; 656 } 657 popup.appendChild(citeDiv); 658 }); 659 return popup.innerHTML; 660 }); 661 } 662 } 663}); 664</script>
664 665</div> <!-- /content --> 666<footer class="footer"> 667 <div class="nav-footer"> 668 <div class="nav-footer-left"> 669 <ul class="footer-items list-unstyled"> 670 <li class="nav-item"> 671 <a class="nav-link" href="https://dbmi.hms.harvard.edu/people/chirag-patel"> 672<p>© Chirag J Patel</p> 673</a> 674 </li> 675 <li class="nav-item"> 676 <a class="nav-link" href="https://scholar.google.com/citations?user=Ecjx73cAAAAJ"> 677<p>Google Scholar</p> 678</a> 679 </li> 680 <li class="nav-item compact"> 681 <a class="nav-link" href="https://github.com/chiragjp"> 682 <i class="bi bi-github" role="img"> 683</i> 684 </a> 685 </li> 686 <li class="nav-item compact"> 687 <a class="nav-link" href="https://twitter.com/chiragjp"> 688 <i class="bi bi-twitter" role="img" aria-label="Twitter"> 689</i> 690 </a> 691 </li> 692</ul> 693 </div> 694 <div class="nav-footer-center"> 695 696 </div> 697 <div class="nav-footer-right"> 698 699 </div> 700 </div> 701</footer> 702 703 704 705 706</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.