// Initialize a container to contain the containers for the tree and annotation windowhtml`<!-- Show information on hovered virus, reuse the same class for convenience --><div class="phylo-container"> <!-- Left part --> <div class="left"> <div id="info-container" class="text-center" style="visibility:hidden;"> <div id="name" class="g-col-md-12 bold"> name </div> <div id="toolbox" class="g-col-md-12"> no tools yet for this virus </div> </div> </div> <!-- Right part --> <div id="annotation-container" class="right no-gutter"> <p> </p> </div></div><div class="phylo-container"> <!-- Left part --> <div class="left"> <div id="tree-container" class="tree-container"> <svg id="tree-svg" class="tree-svg"></svg> </div> <div id="legend-container" class="text-center mb-2"> <div class="grid"> <div class="g-col-md-12 small"> <span class="phylotree-node-text" style="font-size:15px !important;">HOVER</span> for more information / <span class="phylotree-node-text-hl" style="font-size:15px !important;">BOLD NODES</span> are present in collection and can be selected </div> </div> </div> </div> <!-- Right part --> <div id="annotation-container" class="right no-gutter"> <div class="container grid small" align="center" style="--bs-gap: 1.0rem;font-weight:500;"> <div class="g-col-md-12 g-col-sm-12 card card-body tool-header opacity-100" id="virus"> Viral Toolbox </div> </div> <div class="container"> <div class="toolbox"> <div id="toolbox-contents" class="tool-container"> </div> </div> </div> </div></div>`
virusInfoOrUndefined =virusInfoOrUndefinedF(familyAnnotations)availableVirusInfo =availableVirusInfoF(familyAnnotations)availableTools =availableToolsF(familyAnnotations, toolbox)virusOfInterest =virusOfInterestF(familyAnnotations)// Initialize the toolbox when the data is loadedinit_toolbox = toolbox.map(tool => d3.select("#toolbox-contents").node().append(html` <a href=${get_link("toolbox","#"+ tool.id+"-section")} target="_top"> <div class="tool-wrapper"> <div id="${tool.id}" class="tool"> <div class="tool-tooltip-text">${tool.name}</div>${tool.icon.map( i =>html`<img class="tool-icon" height="${(tool.icon.length>1) ?150/tool.icon.length:100}%" src="${i}"/>` )} </div> </div> </a> ` ) )// Reset the tools in the ToolboxclearToolbox = () => { d3.select("#virus").text("Viral Toolbox") toolbox.map(tool => { d3.select("#"+ tool.id).attr("class","tool") })}// Update the tools in the toolbox based on the provided virus objectupdateToolbox = (virus) => { d3.select("#virus").text(virus.resVirusName) toolbox.filter(tool => virus.tools.includes(tool.id)).map(tool => d3.select("#"+ tool.id).attr("class","tool tool-selected") )}// Handle tabset depending on the number of tabsrawTabs = d3.select("#vb-tabset").select("ul").selectAll("li").select("a").nodes()nrTabs = rawTabs.lengthfunctionindexToTab(i, length) {const pre ="tabset-"+ (length +1) +"-"const post ="-tab"return pre + (i+1) + post}tabsetAnchor =indexToTab(0, nrTabs)virusIdToTabMap =newMap( toolboxAnnotatedViruses.map( (virus,i) => [ virus.resAbbreviation,indexToTab(i, nrTabs) ] ))tabToVirusIdMap =newMap(Array.from(virusIdToTabMap, a => a.reverse()))// Hide virus information tabsetfunctionhideTabset() {const virusInfo =document.getElementById(tabsetAnchor).parentNode.parentNode.parentNode virusInfo.style.display="none"}hide =hideTabset()// Instantiate treenwk = nwksAsMap[virusFamily]tree =new phylotree.phylotree(nwk) // class Phylotree// https://github.com/veg/phylotree.js/blob/master/src/main.js#L90// import { update_tree } from "/_js/functions.js"renderedTree = tree// Transform the tree (translate and prune)// based on the input Excel file for this virus family.traverse_and_compute(node => {const virus_id = node.data.nameconst isLeaf = tree.isLeafNode(node)if (isLeaf) {const virus =virusIdToVirus(virus_id)const isVirusOfInterest = (typeof virus !=="undefined") ? (virus.virus_of_interest=="Yes") :falseif (isVirusOfInterest) {const currentName = virus_idconst newName = virus.abbreviation.trim() node.data.name= newName } else { node.data.name="remove_me" tree.deleteANode(node) } } }).render({'width':600,'height':600,'left-right-spacing':'fit-to-size','top-bottom-spacing':'fit-to-size','is-radial':true,'selectable':false,'collapsible':false,'transitions':false,'show-menu':false,'show-scale':false,'align-tips':true,'zoom':false,'brush':false,'draw-size-bubbles':false,'maximum-per-node-spacing':500,'minimum-per-node-spacing':100,'maximum-per-level-spacing':500,'minimum-per-level-spacing':100,'container':"#tree-container" }).style_nodes( (element, data) => {// the virus_id is how the virus is encoded in phylotree newick fileconst virus_id = data.data.name// At this stage in the process, every node should have informationconst information =virusIdToVirus(virus_id) // virusInfoOrUndefined(virus_id)const inToolbox = (typeof information !=="undefined") && (information.availability_in_toolbox=="Yes")// Styling based on available informationconst updtElement1 = information ? element.select("text").attr("class","phylotree-node-text"): element.select("text").attr("class","phylotree-node-text-inactive")const updtElement = inToolbox ? element.select("text").attr("class","phylotree-node-text-hl") : element// Hover functionality - Virus nameif (information) element.on("mouseover",virusHoverIn(data, information, inToolbox)).on("mouseout", virusHoverOut)// Click functionality - Toolbox inToolbox? element.on('click',function(el) {clearToolbox();// Select the first tab in order to get to the root of the tabsetconst virusInfo =document.getElementById(tabsetAnchor).parentNode.parentNode.parentNode virusInfo.style.display="block" virusInfo.scrollIntoView(true)// Now get the proper tab and open itconst thisVirusInfo =document.getElementById(virusIdToTabMap.get(information.virusPointer)) // either the virus_id or the group abbreviation thisVirusInfo.click();// ExperimentsclearNodes()highlightNodes(virus_id)// Render the toolbox for this virusupdateToolbox(information); }): element.on('click',function() {hideTabset()clearToolbox() }) }).layout(true)// Based on a virus ID (abbreviation), highlight the virus or the whole group it belongs tohighlightNodes = (virus_id) => {const abbreviations =virusIdToViruses(virus_id).map(v => v.abbreviation) d3.selectAll("g").filter(function (d) { return (typeof d.data!=="undefined") ? abbreviations.includes(d.data.name) :false}).select("text").attr("class","phylotree-node-text-selected")}// Initialize all viruses in the treeclearNodes = () => {const inLst = annotatedViruses.map(v => v.abbreviation)const inToolboxLst = annotatedViruses.filter(v => v.availability_in_toolbox=="Yes").map(v => v.abbreviation)// Initialize all text d3.selectAll("g").filter(function (d) { return (typeof d.data!=="undefined") }).select("text").attr("class","phylotree-node-text")// Update toolbox entries d3.selectAll("g").filter(function (d) { return (typeof d.data!=="undefined") ? inToolboxLst.includes(d.data.name) :false}).select("text").attr("class","phylotree-node-text-hl")}// console.log(renderedTree)showTree = renderedTree.svg.node()// Show small virus information box on hovervirusHoverIn = (data, information, is_available) => () => {// First, populate the contentconst virusNameToShow = (information.resVirusName)? information.resVirusName: (typeof information.virus_name!=="undefined")? information.virus_name:"" d3.select("#name").text(virusNameToShow)if (information.tools.length>0) d3.select("#toolbox").text("Viral tools are available, please select the virus for more information")else d3.select("#toolbox").text("No viral tools have been developed yet")// ... then show the content d3.select("#info-container").attr("style","visibility:visible;")}virusHoverOut = () => { d3.select("#info-container").attr("style","visibility:hidden;")}// Clicking on the tabs feeds the info back to the toolbox infofeedbackToolbox = d3.selectAll(".nav-item").on('click',function(){const _id = d3.select(this).select("a").attr('id')const _virus_id = tabToVirusIdMap.get(_id)// We should only update the toolbox if an actual virus is selected// not if for instance the 'toolbox' tab is selectedif (typeof _virus_id !=="undefined") {const _virus =virusIdToVirus(_virus_id)clearToolbox();updateToolbox(_virus)clearNodes()highlightNodes(_virus_id) } })// Add SVG to the DOMtmp = d3.select("#tree-container").node().appendChild(showTree)// If the size of the SVG is smaller than the allocated 600px// then resize it relatively to the fraction// Allow for a bit of padding, hence the .95 factor.newSizeF = (curSize) => {if (curSize <600) {return600* (0.95*600/ curSize) } else {return curSize } }newSize =newSizeF(renderedTree.size[0])updateSize = renderedTree.set_size([newSize,newSize]).update()
No human-to-human transmission is recorded up to now.
Cedar virus shares a significant genomic similarities with the Nipah and Hendra viruses. For instance, they use the ephrin-B2 receptor for entry during infection. Therefore, Cedar virus represents a unique opportunity of research.
Human parainfluenza viruses (HPIVs) commonly cause upper and lower respiratory illnesses in infants, young children, older adults, and people with weakened immune systems, but anyone can get infected.
Symptoms generally appear 2 to 6 days after infection.
HPIVs usually spread by direct contact with infectious droplets or by airborne spread when an infected person breathes, coughs, or sneezes.
HPIVs may remain infectious in airborne droplets for over an hour and on surfaces for a few hours depending on environmental conditions
(Reference: Graphs pertaining to RSV seasonality in Belgium have been sourced from Sciensano.)
Long-term side effects in survivors of Nipah virus infection have been noted, including persistent convulsions and personality changes.
Infections that lead to symptoms and sometimes death much later after exposure (known as dormant or latent infections) have also been reported months and even years after exposure.
High biosafety level viruses. Please, contact us via info@virusbankplatform.be to inform about toolbox access.
Genetically similar and low pathogenic Cedar virus currently used as a surrogate for the highly pathogenic Henipa viruses.