PageSourceSearch

https://www.chiragjpgroup.org/

html chiragjpgroup.org collected 2026-10-02 07:18:51 UTC 26,234 bytes, 639 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 - The Patel Group | Translational Bioinformatics at Harvard Medical School</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<script id="quarto-search-options" type="application/json">{
40  "language": {
41    "search-no-results-text": "No results",
42    "search-matching-documents-text": "matching documents",
43    "search-copy-link-title": "Copy link to search",
44    "search-hide-matches-text": "Hide additional matches",
45    "search-more-match-text": "more match in this document",
46    "search-more-matches-text": "more matches in this document",
47    "search-clear-button-title": "Clear",
48    "search-text-placeholder": "",
49    "search-detached-cancel-button-title": "Cancel",
50    "search-submit-button-title": "Submit",
51    "search-label": "Search"
52  }
53}</script>
vendor: 67 bytes, lines 53-54
53
54<script async="" src="https://www.googletagmanager.com/gtag/js?id=
54G-QRGRZ5HCRW
vendor: 13 bytes, lines 54-55
54"></script>
55
56<script type="text/javascript">
57
vendor: 127 bytes, lines 58-61
58window.dataLayer = window.dataLayer || [];
59function gtag(){dataLayer.push(arguments);}
60gtag('js', new Date());
61gtag('config', '
61G-QRGRZ5HCRW
vendor: 29 bytes, line 61
61', { 'anonymize_ip': true});
62</script>
62
63
64
65<link rel="stylesheet" href="styles.css">
66</head>
67
68<body class="nav-fixed">
69
70<div id="quarto-search-results"></div>
71  <header id="quarto-header" class="headroom fixed-top">
72    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
73      <div class="navbar-container container-fluid">
74      <div class="navbar-brand-container mx-auto">
75    <a class="navbar-brand" href="./index.html">
76    <span class="navbar-title">Chirag Patel’s Group</span>
77    </a>
78  </div>
79          <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(); }">
80  <span class="navbar-toggler-icon"></span>
81</button>
82          <div class="collapse navbar-collapse" id="navbarCollapse">
83            <ul class="navbar-nav navbar-nav-scroll ms-auto">
84  <li class="nav-item">
85    <a class="nav-link active" href="./index.html" aria-current="page"> 
86<span class="menu-text">Home</span></a>
87  </li>  
88  <li class="nav-item">
89    <a class="nav-link" href="./members.html"> 
90<span class="menu-text">The Group</span></a>
91  </li>  
92  <li class="nav-item">
93    <a class="nav-link" href="./resources.html"> 
94<span class="menu-text">Resources</span></a>
95  </li>  
96  <li class="nav-item">
97    <a class="nav-link" href="./pubs.html"> 
98<span class="menu-text">Publications</span></a>
99  </li>  
100  <li class="nav-item">
101    <a class="nav-link" href="./about.html"> 
102<span class="menu-text">About</span></a>
103  </li>  
104  <li class="nav-item compact">
105    <a class="nav-link" href="https://twitter.com/chiragjp"> <i class="bi bi-twitter" role="img" aria-label="Twitter">
106</i> 
107<span class="menu-text"></span></a>
108  </li>  
109</ul>
110          </div> <!-- /navcollapse -->
111          <div class="quarto-navbar-tools">
112</div>
113      </div> <!-- /container-fluid -->
114    </nav>
115</header>
116<!-- content -->
117<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
118<!-- sidebar -->
119<!-- margin-sidebar -->
120    
121<!-- main -->
122<main class="content column-page" id="quarto-document-content">
123
124<header id="title-block-header" class="quarto-title-block default">
125<div class="quarto-title">
126<h1 class="title">The Patel Group | Translational Bioinformatics at Harvard Medical School</h1>
127</div>
128
129
130
131<div class="quarto-title-meta column-page">
132
133    
134  
135    
136  </div>
137  
138
139
140</header>
141
142
143<p><img src="img/logo.png" class="img-fluid quarto-figure quarto-figure-right" style="float: right;" alt="dots logo that says &quot;Data Science of Exposome&quot;" width="150"> The long-term goal of the <strong>Patel Group</strong> is to improve human health by developing powerful computational and AI tools that reason over two forces: <strong>genetics</strong> and our <strong>environment</strong>.</p>
144<hr>
145<section id="modeling-the-complex-phenomena-of-health-and-disease" class="level2">
146<h2 class="anchored" data-anchor-id="modeling-the-complex-phenomena-of-health-and-disease">Modeling the complex phenomena of health and disease</h2>
147<p>Mechanistic understanding requires looking at human biology from every angle. We specialize in <strong>multi-modal integration</strong>, weaving together data to create a holistic view of health:</p>
148<ul>
149<li><strong>Multi-omic pathways to health and disease:</strong> We integrate the <strong>proteome</strong> (proteins), <strong>regulome</strong> (how genes are turned on/off), and <strong>exposome</strong> (environmental factors, including the microbiome) to see how the world “gets under our skin” and perturbs biological pathways.</li>
150<li><strong>From Observation to Experiments:</strong> We map physical manifestations of environmental and genetic interactions in both observational and experimental settings, including randomized trials.</li>
151<li><strong>Personal and Real-world Signal:</strong> We harness signals from wearables, insurance claims, and satellite data to track health as it happens in the real world.</li>
152</ul>
153<hr>
154</section>
155<section id="leadership-in-a-new-paradigm-for-data-driven-discovery" class="level2">
156<h2 class="anchored" data-anchor-id="leadership-in-a-new-paradigm-for-data-driven-discovery">Leadership in a new paradigm for data-driven discovery</h2>
157<p>
157Our research provides the scientific foundation for action. By mapping how the <strong>exposome</strong>—the totality of exposures from lifestyle to pollutants—reshapes behavior, we generate the evidence needed for infrastructure and public health policies that protect the population.</p>
158<p>As leaders in <a href="https://www.nexus-exposomics.org/"><strong>NEXUS (the Network for Exposomics in the United States)</strong></a>, we are building the digital infrastructure necessary to map how a lifetime of environmental exposures shapes our biological reality.</p>
159<div class="quarto-figure quarto-figure-center">
160<figure class="figure">
161<p><a href="https://jamanetwork.com/journals/jama/article-abstract/1877218"><img src="img/corr_globes.jpg" class="img-fluid quarto-figure quarto-figure-center figure-img" alt="Patel et al, JAMA 2014"></a></p>
162<figcaption>Patel et al, JAMA 2014</figcaption>
163</figure>
164</div>
165<hr>
166</section>
167<section id="precision-meets-preventative-medicine-and-care" class="level2">
168<h2 class="anchored" data-anchor-id="precision-meets-preventative-medicine-and-care">Precision meets preventative medicine and care</h2>
169<p>We are shifting the focus from population-level inferences to personal decision-making. Instead of relying on general averages, we bring the power of ’omics down to the level of the individual.</p>
170<ul>
171<li><strong>Prognostic Trajectories:</strong> Using machine learning to project an individual’s unique health path based on their molecular signatures and daily exposures and therapeutics.</li>
172<li><strong>Personalized Sensing:</strong> Building accessible AI tools that allow individuals how a change in behavior or environment might alter their biological future in real-time.</li>
173<li><strong>Prevention First:</strong> Prioritizing and evaluating machine learning approaches to screen and treat conditions like <strong>Alzheimer’s, Cancer, and Diabetes</strong> long before they manifest.</li>
174</ul>
175<hr>
176</section>
177<section id="meta-science-ai-in-the-loop-for-trustworthy-science" class="level2">
178<h2 class="anchored" data-anchor-id="meta-science-ai-in-the-loop-for-trustworthy-science">Meta-Science: AI in the loop for trustworthy science</h2>
179<p>Are findings from high-throughput research clinically or biologically useful? <strong>How can we do the best job possible to ensure big data science is translatable?</strong></p>
180<p>We develop computer intensive approaches to make big data based findings more robust to accelerate&nbsp;<a href="https://en.wikipedia.org/wiki/Metascience">meta science</a>, or the “science of science”. We use these data approaches to study how and why we come to the conclusions that we do and if these conclusions are robust. For example, “vibration of effects” attempts to estimate how much arbitrary big data choices can&nbsp;<a href="https://www.chiragjpgroup.org/voe/">alter decision making</a>!&nbsp;</p>
181<hr>
182<section id="affiliations" class="level3">
183<h3 class="anchored" data-anchor-id="affiliations">Affiliations</h3>
184<p>We are part of the&nbsp;<a href="http://dbmi.med.harvard.edu/">Department of Biomedical Informatics</a>&nbsp;at&nbsp;<a href="http://hms.harvard.edu/">Harvard Medical School</a>. We participate in DBMI’s educational programs, including:</p>
185<ul>
186<li><a href="https://dbmi.hms.harvard.edu/education/phd-program/aim-phd-track">Artificial Intelligence in Medicine</a>,</li>
187<li><a href="https://bigphd.hms.harvard.edu">Bioinformatics and Integrative Genomics</a>,</li>
188<li><a href="https://dbmi.hms.harvard.edu/education/masters-program">Master’s in Biomedical Informatics,</a></li>
189<li><a href="https://dbmi.hms.harvard.edu/education/sibmi">Summer Institute in Biomedical Informatics</a></li>
190</ul>
191</section>
192<section id="support" class="level3">
193<h3 class="anchored" data-anchor-id="support">Support</h3>
194<p>We are or have been funded by the&nbsp;<a href="https://reporter.nih.gov/PISearch/9643320">National Institutes of Health</a>, the National Science Foundation, the <a href="https://datascience.harvard.edu">Harvard Data Science Institute</a>, and the <a href="https://www.hsph.harvard.edu/niehs/">Harvard-Chan NIEHS Center</a>
194. We are thankful for the compute and infrastructural support from Sanofi, Amazon Web Services, Microsoft Azure, Oracle Cloud, and Google.</p>
195<div>
196
197</div>
198<div class="quarto-layout-panel" data-layout-ncol="1">
199<div class="quarto-layout-row">
200<div class="quarto-layout-cell" style="flex-basis: 100.0%;justify-content: center;">
201<p><img src="img/Blavatnikbioinformatics.png" class="img-fluid" width="600"></p>
202</div>
203</div>
204</div>
205
206
207</section>
208</section>
209
210</main> <!-- /main -->
211<script id="quarto-html-after-body" type="application/javascript">
212window.document.addEventListener("DOMContentLoaded", function (event) {
213  const toggleBodyColorMode = (bsSheetEl) => {
214    const mode = bsSheetEl.getAttribute("data-mode");
215    const bodyEl = window.document.querySelector("body");
216    if (mode === "dark") {
217      bodyEl.classList.add("quarto-dark");
218      bodyEl.classList.remove("quarto-light");
219    } else {
220      bodyEl.classList.add("quarto-light");
221      bodyEl.classList.remove("quarto-dark");
222    }
223  }
224  const toggleBodyColorPrimary = () => {
225    const bsSheetEl = window.document.querySelector("link#quarto-bootstrap");
226    if (bsSheetEl) {
227      toggleBodyColorMode(bsSheetEl);
228    }
229  }
230  toggleBodyColorPrimary();  
231  const icon = "";
232  const anchorJS = new window.AnchorJS();
233  anchorJS.options = {
234    placement: 'right',
235    icon: icon
236  };
237  anchorJS.add('.anchored');
238  const isCodeAnnotation = (el) => {
239    for (const clz of el.classList) {
240      if (clz.startsWith('code-annotation-')) {                     
241        return true;
242      }
243    }
244    return false;
245  }
246  const clipboard = new window.ClipboardJS('.code-copy-button', {
247    text: function(trigger) {
248      const codeEl = trigger.previousElementSibling.cloneNode(true);
249      for (const childEl of codeEl.children) {
250        if (isCodeAnnotation(childEl)) {
251          childEl.remove();
252        }
253      }
254      return codeEl.innerText;
255    }
256  });
257  clipboard.on('success', function(e) {
258    // button target
259    const button = e.trigger;
260    // don't keep focus
261    button.blur();
262    // flash "checked"
263    button.classList.add('code-copy-button-checked');
264    var currentTitle = button.getAttribute("title");
265    button.setAttribute("title", "Copied!");
266    let tooltip;
267    if (window.bootstrap) {
268      button.setAttribute("data-bs-toggle", "tooltip");
269      button.setAttribute("data-bs-placement", "left");
270      button.setAttribute("data-bs-title", "Copied!");
271      tooltip = new bootstrap.Tooltip(button, 
272        { trigger: "manual", 
273          customClass: "code-copy-button-tooltip",
274          offset: [0, -8]});
275      tooltip.show();    
276    }
277    setTimeout(function() {
278      if (tooltip) {
279        tooltip.hide();
280        button.removeAttribute("data-bs-title");
281        button.removeAttribute("data-bs-toggle");
282        button.removeAttribute("data-bs-placement");
283      }
284      button.setAttribute("title", currentTitle);
285      button.classList.remove('code-copy-button-checked');
286    }, 1000);
287    // clear code selection
288    e.clearSelection();
289  });
290  function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
291    const config = {
292      allowHTML: true,
293      maxWidth: 500,
294      delay: 100,
295      arrow: false,
296      appendTo: function(el) {
297          return el.parentElement;
298      },
299      interactive: true,
300      interactiveBorder: 10,
301      theme: 'quarto',
302      placement: 'bottom-start',
303    };
304    if (contentFn) {
305      config.content = contentFn;
306    }
307    if (onTriggerFn) {
308      config.onTrigger = onTriggerFn;
309    }
310    if (onUntriggerFn) {
311      config.onUntrigger = onUntriggerFn;
312    }
313    window.tippy(el, config); 
314  }
315  const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
316  for (var i=0; i<noterefs.length; i++) {
317    const ref = noterefs[i];
318    tippyHover(ref, function() {
319      // use id or data attribute instead here
320      let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
321      try { href = new URL(href).hash; } catch {}
322      const id = href.replace(/^#\/?/, "");
323      const note = window.document.getElementById(id);
324      return note.innerHTML;
325    });
326  }
327  const xrefs = window.document.querySelectorAll('a.quarto-xref');
328  const processXRef = (id, note) => {
329    // Strip column container classes
330    const stripColumnClz = (el) => {
331      el.classList.remove("page-full", "page-columns");
332      if (el.children) {
333        for (const child of el.children) {
334          stripColumnClz(child);
335        }
336      }
337    }
338    stripColumnClz(note)
339    if (id === null || id.startsWith('sec-')) {
340      // Special case sections, only their first couple elements
341      const container = document.createElement("div");
342      if (note.children && note.children.length > 2) {
343        container.appendChild(note.children[0].cloneNode(true));
344        for (let i = 1; i < note.children.length; i++) {
345          const child = note.children[i];
346          if (child.tagName === "P" && child.innerText === "") {
347            continue;
348          } else {
349            container.appendChild(child.cloneNode(true));
350            break;
351          }
352        }
353        if (window.Quarto?.typesetMath) {
354          window.Quarto.typesetMath(container);
355        }
356        return container.innerHTML
357      } else {
358        if (window.Quarto?.typesetMath) {
359          window.Quarto.typesetMath(note);
360        }
361        return note.innerHTML;
362      }
363    } else {
364      // Remove any anchor links if they are present
365      const anchorLink = note.querySelector('a.anchorjs-link');
366      if (anchorLink) {
367        anchorLink.remove();
368      }
369      if (window.Quarto?.typesetMath) {
370        window.Quarto.typesetMath(note);
371      }
372      // TODO in 1.5, we should make sure this works without a callout special case
373      if (note.classList.contains("callout")) {
374        return note.outerHTML;
375      } else {
376        return note.innerHTML;
377      }
378    }
379  }
380  for (var i=0; i<xrefs.length; i++) {
381    const xref = xrefs[i];
382    tippyHover(xref, undefined, function(instance) {
383      instance.disable();
384      let url = xref.getAttribute('href');
385      let hash = undefined; 
386      if (url.startsWith('#')) {
387        hash = url;
388      } else {
389        try { hash = new URL(url).hash; } catch {}
390      }
391      if (hash) {
392        const id = hash.replace(/^#\/?/, "");
393        const note = window.document.getElementById(id);
394        if (note !== null) {
395          try {
396            const html = processXRef(id, note.cloneNode(true));
397            instance.setContent(html);
398          } finally {
399            instance.enable();
400            instance.show();
401          }
402        } else {
403          // See if we can fetch this
404          fetch(url.split('#')[0])
405          .then(res => res.text())
406          .then(html => {
407            const parser = new DOMParser();
408            const htmlDoc = parser.parseFromString(html, "text/html");
409            const note = htmlDoc.getElementById(id);
410            if (note !== null) {
411              const html = processXRef(id, note);
412              instance.setContent(html);
413            } 
414          }).finally(() => {
415            instance.enable();
416            instance.show();
417          });
418        }
419      } else {
420        // See if we can fetch a full url (with no hash to target)
421        // This is a special case and we should probably do some content thinning / targeting
422        fetch(url)
423        .then(res => res.text())
424        .then(html => {
425          const parser = new DOMParser();
426          const htmlDoc = parser.parseFromString(html, "text/html");
427          const note = htmlDoc.querySelector('main.content');
428          if (note !== null) {
429            // This should only happen for chapter cross references
430            // (since there is no id in the URL)
431            // remove the first header
432            if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
433              note.children[0].remove();
434            }
435            const html = processXRef(null, note);
436            instance.setContent(html);
437          } 
438        }).finally(() => {
439          instance.enable();
440          instance.show();
441        });
442      }
443    }, function(instance) {
444    });
445  }
446      let selectedAnnoteEl;
447      const selectorForAnnotation = ( cell, annotation) => {
448        let cellAttr = 'data-code-cell="' + cell + '"';
449        let lineAttr = 'data-code-annotation="' +  annotation + '"';
450        const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
451        return selector;
452      }
453      const selectCodeLines = (annoteEl) => {
454        const doc = window.document;
455        const targetCell = annoteEl.getAttribute("data-target-cell");
456        const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
457        const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
458        const lines = annoteSpan.getAttribute("data-code-lines").split(",");
459        const lineIds = lines.map((line) => {
460          return targetCell + "-" + line;
461        })
462        let top = null;
463        let height = null;
464        let parent = null;
465        if (lineIds.length > 0) {
466            //compute the position of the single el (top and bottom and make a div)
467            const el = window.document.getElementById(lineIds[0]);
468            top = el.offsetTop;
469            height = el.offsetHeight;
470            parent = el.parentElement.parentElement;
471          if (lineIds.length > 1) {
472            const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
473            const bottom = lastEl.offsetTop + lastEl.offsetHeight;
474            height = bottom - top;
475          }
476          if (top !== null && height !== null && parent !== null) {
477            // cook up a div (if necessary) and position it 
478            let div = window.document.getElementById("code-annotation-line-highlight");
479            if (div === null) {
480              div = window.document.createElement("div");
481              div.setAttribute("id", "code-annotation-line-highlight");
482              div.style.position = 'absolute';
483              parent.appendChild(div);
484            }
485            div.style.top = top - 2 + "px";
486            div.style.height = height + 4 + "px";
487            div.style.left = 0;
488            let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
489            if (gutterDiv === null) {
490              gutterDiv = window.document.createElement("div");
491              gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
492              gutterDiv.style.position = 'absolute';
493              const codeCell = window.document.getElementById(targetCell);
494              const gutter = codeCell.querySelector('.code-annotation-gutter');
495              gutter.appendChild(gutterDiv);
496            }
497            gutterDiv.style.top = top - 2 + "px";
498            gutterDiv.style.height = height + 4 + "px";
499          }
500          selectedAnnoteEl = annoteEl;
501        }
502      };
503      const unselectCodeLines = () => {
504        const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
505        elementsIds.forEach((elId) => {
506          const div = window.document.getElementById(elId);
507          if (div) {
508            div.remove();
509          }
510        });
511        selectedAnnoteEl = undefined;
512      };
513        // Handle positioning of the toggle
514    window.addEventListener(
515      "resize",
516      throttle(() => {
517        elRect = undefined;
518        if (selectedAnnoteEl) {
519          selectCodeLines(selectedAnnoteEl);
520        }
521      }, 10)
522    );
523    function throttle(fn, ms) {
524    let throttle = false;
525    let timer;
526      return (...args) => {
527        if(!throttle) { // first call gets through
528            fn.apply(this, args);
529            throttle = true;
530        } else { // all the others get throttled
531            if(timer) clearTimeout(timer); // cancel #2
532            timer = setTimeout(() => {
533              fn.apply(this, args);
534              timer = throttle = false;
535            }, ms);
536        }
537      };
538    }
539      // Attach click handler to the DT
540      const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
541      for (const annoteDlNode of annoteDls) {
542        annoteDlNode.addEventListener('click', (event) => {
543          const clickedEl = event.target;
544          if (clickedEl !== selectedAnnoteEl) {
545            unselectCodeLines();
546            const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
547            if (activeEl) {
548              activeEl.classList.remove('code-annotation-active');
549            }
550            selectCodeLines(clickedEl);
551            clickedEl.classList.add('code-annotation-active');
552          } else {
553            // Unselect the line
554            unselectCodeLines();
555            clickedEl.classList.remove('code-annotation-active');
556          }
557        });
558      }
559  const findCites = (el) => {
560    const parentEl = el.parentElement;
561    if (parentEl) {
562      const cites = parentEl.dataset.cites;
563      if (cites) {
564        return {
565          el,
566          cites: cites.split(' ')
567        };
568      } else {
569        return findCites(el.parentElement)
570      }
571    } else {
572      return undefined;
573    }
574  };
575  var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
576  for (var i=0; i<bibliorefs.length; i++) {
577    const ref = bibliorefs[i];
578    const citeInfo = findCites(ref);
579    if (citeInfo) {
580      tippyHover(citeInfo.el, function() {
581        var popup = window.document.createElement('div');
582        citeInfo.cites.forEach(function(cite) {
583          var citeDiv = window.document.createElement('div');
584          citeDiv.classList.add('hanging-indent');
585          citeDiv.classList.add('csl-entry');
586          var biblioDiv = window.document.getElementById('ref-' + cite);
587          if (biblioDiv) {
588            citeDiv.innerHTML = biblioDiv.innerHTML;
589          }
590          popup.appendChild(citeDiv);
591        });
592        return popup.innerHTML;
593      });
594    }
595  }
596});
597</script>
597
598</div> <!-- /content -->
599<footer class="footer">
600  <div class="nav-footer">
601    <div class="nav-footer-left">
602      <ul class="footer-items list-unstyled">
603    <li class="nav-item">
604    <a class="nav-link" href="https://dbmi.hms.harvard.edu/people/chirag-patel">
605<p>© Chirag J Patel</p>
606</a>
607  </li>  
608    <li class="nav-item">
609    <a class="nav-link" href="https://scholar.google.com/citations?user=Ecjx73cAAAAJ">
610<p>Google Scholar</p>
611</a>
612  </li>  
613    <li class="nav-item compact">
614    <a class="nav-link" href="https://github.com/chiragjp">
615      <i class="bi bi-github" role="img">
616</i> 
617    </a>
618  </li>  
619    <li class="nav-item compact">
620    <a class="nav-link" href="https://twitter.com/chiragjp">
621      <i class="bi bi-twitter" role="img" aria-label="Twitter">
622</i> 
623    </a>
624  </li>  
625</ul>
626    </div>   
627    <div class="nav-footer-center">
628      &nbsp;
629    </div>
630    <div class="nav-footer-right">
631      &nbsp;
632    </div>
633  </div>
634</footer>
635
636
637
638
639</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.