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 "Data Science of Exposome"" 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 <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 <a href="https://www.chiragjpgroup.org/voe/">alter decision making</a>! </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 <a href="http://dbmi.med.harvard.edu/">Department of Biomedical Informatics</a> at <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 <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 629 </div> 630 <div class="nav-footer-right"> 631 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.