PageSourceSearch

https://www.chiragjpgroup.org/resources.html

html chiragjpgroup.org collected 2026-10-02 07:18:56 UTC 34,702 bytes, 706 lines download raw bytes

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&nbsp;<strong>EX</strong>posomics in the&nbsp;<strong>U</strong>nited&nbsp;<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&nbsp;<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      &nbsp;
696    </div>
697    <div class="nav-footer-right">
698      &nbsp;
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.