// 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()
More than 50% of the infected patients develop a chronic, long-term disease, characterized by a debilitating arthralgia that can persist for weeks to months.
Death from MAYV is rare.
The virus is endemic to the tropical forests of the Amazon and was repeatedly detected in humans and mosquitoes in Latin America and the Caribbean. Despite being rarely fatal, MAYV infections have high socioeconomic impact due to the chronic painful incapacitating phase of the disease. There are no approved vaccines or antivirals available at the moment for the prevention or treatment of MAYV infection.
SFV is usually transmitted by female mosquitoes of the Aedes subspecies. Human cases are not common and can occur via spillover (Through bite of infected mosquitoes).
Several patients suffer from a chronic polyarthritis that can severely incapacitate the patient for weeks up to several years after the acute stage.
Death from chikungunya is rare.
Millions of CHIKV cases have been reported in the Caribbean region and several countries of Central and South America. Local transmission cases have been also reported in Europe (e.g. Italy and France). Despite being rarely fatal, CHIKV infections have high socioeconomic impact due to the chronic painful incapacitating phase of the disease. There are no approved vaccines or antivirals available for the prevention or treatment of CHIKV infection.
The virus is endemic to Central and South America where outbreaks in humans and equids have been reported in at least 12 countries. The mortality of VEEV in humans is lower than 1%, but neurological symptoms are seen in up to 14% of the infected persons. Currently, there is no approved antiviral or vaccine for treatment or prevention of VEEV infections in humans.
The toolbox for this virus is currently in development. Please contact us via info@virusbankplatform.be for more information.
Although many SINV infections are asymptomatic, SINV can result in a febrile illness associated with maculopapular rash and joint pain.
The virus is widely distributed throughout the world including Europe, Africa, Asia, and Australia. SINV is used as tool to study alphaviruses at lower biosafety level. There are no approved vaccines or antivirals available at the moment for the prevention or treatment of SINV infection.
Some patients can suffer from a chronic long-term disease, characterized by a debilitating arthralgia that can persist for weeks to months.
Death from RRV is rare.
The virus is endemic in Australia, Papua New Guinea and other islands in the South Pacific. Despite being rarely fatal, RRV infections have high socioeconomic impact due to the chronic painful incapacitating phase of the disease. There are no approved vaccines or antivirals available for the prevention or treatment of RRV infection.