{"id":22794802,"url":"https://github.com/menchelab/vrnetzer","last_synced_at":"2025-06-22T00:06:31.009Z","repository":{"id":135233664,"uuid":"331998963","full_name":"menchelab/VRNetzer","owner":"menchelab","description":"A Virtual Reality platform for interactive, immersive network exploration.","archived":false,"fork":false,"pushed_at":"2023-09-18T12:40:18.000Z","size":7352,"stargazers_count":35,"open_issues_count":11,"forks_count":4,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-30T16:44:09.751Z","etag":null,"topics":["network-analysis","network-visualization","virtual-reality"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/menchelab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-22T16:18:41.000Z","updated_at":"2025-02-23T17:05:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"80ae8921-9c25-4b35-81df-ffc64952d704","html_url":"https://github.com/menchelab/VRNetzer","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/menchelab/VRNetzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/menchelab%2FVRNetzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/menchelab%2FVRNetzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/menchelab%2FVRNetzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/menchelab%2FVRNetzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/menchelab","download_url":"https://codeload.github.com/menchelab/VRNetzer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/menchelab%2FVRNetzer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261212483,"owners_count":23125583,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["network-analysis","network-visualization","virtual-reality"],"created_at":"2024-12-12T04:10:28.528Z","updated_at":"2025-06-22T00:06:25.998Z","avatar_url":"https://github.com/menchelab.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"## THERE IS A NEW VERSION OF THIS BEING DEVELOPED HERE: [DataDiVR](https://github.com/menchelab/DataDiVR_WebApp) PLEASE USE THE NEW VERSION IF YOU WANT TO TRY THE APPLICATION, THIS REPOSITORY IS ONLY HERE FOR HISTORIC REASONS\n\n## **VRNetzer - A Virtual Reality Framework for Network Visualization and Analytics**\n\n![alt text](pictures/DataDiVR_Fig_1b_notext.png)\n\n\nNetworks provide a powerful representation of complex systems of interacting components. In addition to a wide range of available analytical and computational tools, networks also offer a visual interface for exploring large data in a uniquely intuitive fashion. \u003cbr\u003eHowever, the size and complexity of many networks render static visualizations on common screen or paper sizes impractical and result in proverbial 'hairballs'. Here, we introduce an immersive Virtual Reality (VR) platform that overcomes these limitations and unlocks the full potential of visual, interactive exploration of large networks. \u003cbr\u003eOur platform is designed towards maximal customization and extendability, with key features including import of custom code for data analysis, easy integration of external databases, and design of arbitrary user interface elements. As a proof of concept, we show how our platform can be used to interactively explore genome-scale molecular networks for identifying genetic aberrations responsible for rare diseases and develop hypotheses on their respective pathobiological mechanisms. \u003cbr\u003eOur platform represents a first-of-its-kind, general purpose VR data exploration platform in which human intuition can work seamlessly together with state-of-the-art analysis methods for large and diverse data. \n\u003cbr\u003e\n\u003cbr\u003e\n**Note:** This project is still in an infant state of development. This is a public beta release, meaning it is not fit to be used in any critical applications yet and may still contain some bugs.\nYou can [get in touch](mailto:vrnetzer@menchelab.com) with us if you would like to contribute to the further development of this project.\n\u003cbr\u003e\n\u003cbr\u003e\n\n## **Content**\n\n[**Hardware Requirements**](#Hardware-Requirements)\n\n[**Installation: Quick Start**](#Installation-Quick-Start)\n\n[**Installation: Stand Alone**](#Installation-Stand-Alone)\n\n[**Desktop Mode**](#Desktop-Mode) \n\n[**Data Logging**](#Data-Logging)\n\n[**Take screenshots and record videos**](#Take-screenshots-and-record-videos)\n\n[**Tutorial 1: Using the Uploader to add your own network**](#Tutorial-1-Using-the-Uploader-to-add-your-own-network)\n\n[**VRNetzer Architecture Overview**](#VRNetzer-Architecture-Overview)\n\n[**Tutorial 2: Creating custom User Interfaces**](#Tutorial-2-Creating-custom-User-Interfaces)\n\n[**Tutorial 3: Creating a route on the backend**](#Tutorial-3-Creating-a-route-on-the-backend)\n\n[**USE CASE Gene prioritization**](#USE-CASE-Gene-prioritization)\n\n[**VRnet API Documentation**](#VRnet-API-Documentation)\n\n[**Dependencies**](#Dependencies)\n\n[**License**](#License)\n\n\n\n\n\n## **Hardware Requirements**\n\n We are running the platform on an MSI gaming laptop with the following specs:\n - CPU: i7 - 7820HK\n - RAM: 16 GB\n - GPU: NVIDIA 1070 TI\n - OS: WINDOWS 10\n\n and a VR HEADSET - we tested the following:\n - HTC VIVE VR Headset + controllers\n - OCULUS QUEST (tethered to windows with link) + controllers\n\n## **Installation: Quick Start** \nTime required ~ 10min\n\nFor a quick start, you can just [download the VR Module executable](https://menchelab.com/VRNetzer/VR_Module.zip) and run VR_Module.exe on your windows computer with a [SteamVR compatible headset](https://store.steampowered.com/app/250820/SteamVR/?l=english). Please watch this [video](https://youtu.be/W5tW_tb3LGk) that will help to get you started.\nThe VR Module comes preconfigured to connect to the other modules that we already installed on our server to make it easy for you to get a first impression. \nIt has the ability to upload your own datasets, but we don't recommend it. **Do NOT upload any sensitive data here**, this is **only for demonstration purposes** and for the whole world to see. We don't guarantee your data's safety! If you want to work with your own data you should use the [Stand Alone](#Installation-Stand-Alone) version.\n\n## **Installation: Stand Alone** \nTime required ~ 60min\n\nHowever, if you want to implement your own datasets and functionalities, you can also **run everything localy on your machine (the SAFE option if you are dealing with sensitive data)** or run the Analytics Module and UI Module on a networkserver or cloud service (if you need scalability and processing power).\u003cbr\u003eHere is a step by step guide how to do a local installation on a windows computer. Note that the Analytics Module and the UI Module can also run on a (linux) server,\nwhile the VR Module needs to run on a windows 10 machine as gaming hardware is required for Virtual Reality which is best supported under windows.\n\n### **1.) Set up a MySql Database**\n\n- download and install [MySql Workbench](https://dev.mysql.com/downloads/workbench/)\n- download the .dump file of our database [from here](https://ucloud.univie.ac.at/index.php/s/k3IP6in8BXH17oA)\n- Create a new database, user and password and upload .sql file to it\n\nyou have now a clone of our database on your local machine.\n\n### **2.) Clone the [Analytics Module repository](https://github.com/menchelab/Analytics_Module)** into a new folder somewhere on your computer called \"VRNetzer\"\n\n- install [python \u003e3.6 \u003c3.9,](https://www.python.org/downloads/) make sure its added to path variable\n- install [pip](https://pypi.org/project/pip/) for python\n\n- edit VRNetzer/Analytics_Module/db_config.py to match the database host and user you created before and save\n\n\n\n- right click on VRNetzer/Analytics_Module/runAnalytics_Module.ps1 -\u003e \"run with power shell\" \u003cbr\u003e![alt text](pictures/runpowershell.png)\n\n- if the output of the console window that just opened ends with \"Running on http://127.0.0.1:1337/\"\nyou are good to go, if there are errors you will need to install dependencies.\n\n### **3.) Clone the [UI Module repository](https://github.com/menchelab/UI_Module/)** into \"VRNetzer\"\n\n- install [python \u003e3.6,](https://www.python.org/downloads/) make sure its added to path variable\n- install [pip](https://pypi.org/project/pip/) for python\n- edit VRNetzer/uiserver/static/js/UI_Module_Config.js and set \"dbprefix\" to the address of your dataServer , here: 'http://127.0.0.1:1337' and save.\n- edit VRNetzer/UI_Module/static/js/ UI_Module_Config.js and set \"dbprefix\" to the address of your Analytics Module, here: 'http://127.0.0.1:1337' and save.\n\n\n- right click on VRNetzer/UI_Module/run_UI_Module.ps1 -\u003e \"run with power shell\"\n\n- if the output of the console window that just opened ends with \"Running on http://127.0.0.1:5000/\"\nyou are good to go, if there are errors you will need to install dependencies.\n    \n### **4.) Download the [VR Module executable](https://menchelab.com/VRNetzer/VR_Module.zip)** and extract it to \"VRNetzer\"\n- if you haven't already, make a Steam account and install [SteamVR](https://store.steampowered.com/app/250820/SteamVR/) and test your headset\n- edit VRNetzer/VRnet/viveNet/Content/data/Config.txt and change the address to the one where your UI Module is, here http://127.0.0.1:5000/ \n- run VR_Module.exe\n\n## **Desktop Mode**\n\nIt is possible to run the VR Module in desktop mode which is useful for development tasks but does not provide the full functionality as with a headset.\u003cbr\u003eTo do so, change the value `\"vr\":true` in the config file of the VR Module to `\"vr\":false` and restart the VR Module.\n\n## **Data Logging**\nThe VR Module can produce log files that contain a list of all that has happened during a VR session. This produces quite big textfiles and is therefore turned off by default. \u003cbr\u003eTo enable logging change the value `\"logging\":false` in the config file of the VR Module to `\"logging\":true` and restart the VR Module. The log files are generated in `VRNetzer/VR_Module/viveNet/Content/data`.\n\n## **Take screenshots and record videos**\n\nIf you want you can take screenshots and videos of the running application using nvidia geforce experience, which is a free download for nvidia graphics cards, find it here: [geforce experience](https://www.nvidia.com/de-at/geforce/geforce-experience/).\nAfter installation the default key combination for taking a screenshot is alt+f1 and to start or stop a video recording you press alt+f9. Depending on your setup you might need to enable the ingame overlay and enable desktop recording in the privacy settings in the geforce experience settings if the hotkeys do not work right away.\n\n\n## **Tutorial 1: Using the Uploader to add your own network**\n\n\nWINDOWS\n- right click on VRNetzer/ Analytics_Module/runAnalyticsModule.ps1 -\u003e \"run with power shell\" to start the Analytics Module\n- right click on VRNetzer/ UI_Module/run_UI_Module.ps1 -\u003e \"run with power shell\" to start the UI Module\n- open the web frontend of the UI Module in a browser /http://127.0.0.1:5000/upload \n\nMAC/LINUX\n- open terminal, cd to Analytics_Module and run app.py with python3\n- open terminal, cd to UI_Module and run json_io.py with python3\n#\n- open the web frontend of the UI Module in a browser http://127.0.0.1:5000/upload \u003cbr\u003e ![alt text](pictures/upload.jpg)\n\n\u003c!---\n- tick \"Create Project\" and choose a name that isn't already in the dropdown menu\n--\u003e\n\n- select .csv files to upload, [they must be formatted after these guidelines](#Csv-file-formats) as sketched in the picture above.  \n- Required is as least a layout file with xyz coordinated (normalized each in [0,1]) and colors and you will obtain a 3D point cloud.\n- If you add an edge list that refers to the identifiers given in the 1st column of the layout file you will obtain a network with nodes and edges.\n- Uploading a node file with symbols, names and functions/features (optional, can remain empty) you will find the symbols as labels in VR and the node characteristics on the node panel when clicking on a node.\n- restart the VR Module and load your project \n\n\n## **VRNetzer Architecture Overview**\n\nThe **VRNetzer** platform consists of 5 Modules:\u003cbr\u003e![alt text](pictures/architecture.png )\n\n### **VRNet** - the virtual reality module written in Unreal Engine\n\nUnreal Engine is one of the industry leaders in the videogame world. We chose it as the base for our VR Module for it's astounding graphics performance, continuous support of upcoming VR hardware and because it's open source.\n\n### [**UI Module** - a jQuery and html website ](https://github.com/menchelab/UI_Module)\n\n**The UI Module** is running in the browser of your local machine and can **SEND GET and POST requests TO the Analytics Module.** \nNearly all actions originate here (exept the ones in the VR Module, like if the user touches a node or moves the network with the VR controllers).\n\u003cbr\u003e**Think of the UI Module as the frontend of a website and the Analytics Module as it's backend.**\n\u003cbr\u003eA User clicks on a button on the frontend, this makes it to send a post request to a specific URL (route) on the backend (the Analytics Module), await it's response and finally display the result as text or as a graph on the user interface and/or call functions in the VR Module to alter the appearence of the network displayed in VR. \u003cbr\u003eThe Analytics Module can only RESPOND to those requests, meaning the Analytics Module can never send something to the frontend without being asked. Every communication is Initiated by the UI Module.\n\nNow here is what's special about the UI Module:\n\n - It can also **SEND api function calls to the VR Module**\n \n \u003cbr\u003e**AND**\u003cbr\u003e\n\n - It can **RECEIVE calls from the VR Module** \n\nIn contrast to the Analytics Module, the VR Module CAN initiate communication with the UI Module and call special functions set up in the UI Module.\nThis picture illustrates the different routes of communication in the framework. \n\n![alt text](pictures/communication.png )\n\n\n### [**Analytics Module** - a Flask/Python webserver](https://github.com/menchelab/Analytics_Module)\n\nThe Analytics Module is the backend that performs all the data science tasks. It has \n- **separate routes (URLs) defined for each task** \u003cbr\u003e When the UI Module sends a request to one of these, it parses the input parameters, makes database queries and performs calculations, and finally returns it's response to the UI Module.\n- **it can run on the local machine or on a powerful cloud server** if more power is needed\n\n### **SQL database**\n\nAll data is stored within a MySQL database.  The following schema shows the minimal set of tables that describes one single network. \n\u003cbr\u003e \u003c/br\u003e \n\u003cimg src=\"pictures/dataserver_schema.jpg\" alt=\"drawing\" width=\"75%\" class=\"center\"/\u003e\n\nThe schema and the related tables are auto-generated and auto-populated upon user upload.  To upload your own network, see [Tutorial 1](https://github.com/menchelab/VRNetzer/blob/main/README.md#Tutorial-1-Using-the-Uploader-to-add-your-own-network).\n\nFor advanced users: \n\nAdditionally, you may want to include more data to contextualize your nodes or edges.  For example, in our proof of concept application, we use additional tables to store:\n- hierarchical information of our taxonomic node annotations (attribute_taxonomies)\n- articles mentioning specific genes (articles, nodes_articles)\n- gene expression levels of genes in different tissues (gtex_values)\n\nThe possibilities are endless!  Functions to query or manipulate the database are in [tables.py](https://github.com/menchelab/Analytics_Module/blob/master/tables.py) of the Analytics Module.\n\n\n\n## **Tutorial 2: Creating custom User Interfaces**\n\nThe User Interface in the virtual reality module is a website made with jQuery. In this tutorial you will learn how to make UI elements like buttons or dropdown lists and how to communicate with the VR and Analytics Module. \u003cbr\u003eBasic JavaScript and HTML skills required.\n\u003cbr\u003ePrerequisites: install the VRNetzer framework on your local machine [**Installation: Stand Alone**](#Installation-Stand-Alone) \n\n### **Step 1: Create a button**\n\n- in [Visual Studio Code](https://code.visualstudio.com/) (or the text editor of your choice) File -\u003e Open Folder -\u003e navigate to your UI Module Folder\n\n- right click on VRNetzer/Analytics_Module/runAnalyticsModule.ps1 -\u003e \"run with power shell\" \u003cbr\u003e ![alt text](pictures/runpowershell.png)\n\n- right click on VRNetzer/UI_Module/runUIModule.ps1 -\u003e \"run with power shell\" \n\n- open the VR Module's config.txt file located at `VRNetzer/VR_Module/viveNet/Content/data` in your text editor and change `\"vr\":true` to `\"vr\":false` and `\"UIServerAdress\":\".....\"` to  `\"UIServerAdress\":\"http://127.0.0.1:5000/\"` or where your UI Module is running and save the file\n- run VR_Modul.exe\n- it might promt you to install DirectXRuntime, follow the instructions\n\n- Once the VR Module opens, you will see the main UI to which we will add something in the right-most tab in the left upper corner of the 3D view.\n- press Alt + Enter to switch from fullscreen to windowed mode.\n\n- click on the user interface in the left corner and hit 'Ctrl + Shift + i' to open the developer tools, click on \"Network\" and tick the \"Disable Cache\" checkbox. Note the \"Console\" window, where debugging output is displayed. \u003cbr\u003e ![alt text](pictures/t2-7.png)\n- open `VRNetzer/UI_Module/templates/main.html` in your editor\n- at the end of the file, after` \u003cdiv id=\"tabs-7\"\u003e` add `\u003cbutton id=\"MyNewButton\"\u003e EXIT \u003c/button\u003e`\n- save changes to main.html and refresh the browser by clicking in the red area and hit F5 \u003cbr\u003e![alt text](pictures/t2-3.png)\n- if you now navigate to the right most tab again, the button appeared. It looks grey though, not like the other buttons. \n\nThe different elements of the page are set up in the html documents. All the logic happens in the JavaScript, in the `UI_Module\\static\\js` folder.\n\n**VRNetzer_API.js** is the most important, it has **all the functions to communicate between the Analytics Module and the VR Module.**\n\nThen there is **a file for each of the html files** (main_UI.js). These all have this initialization function `$(document).ready(function () {....}` and in there are functions **that bind to the UI elements created in Html**. For our button we do this:\n\n- at the end of main_UI.js, but still inside the document.ready() function put this code:\u003cbr\u003e \n```\n$(function () {\n        $(\"#MyNewButton\").button();\n        $(\"#MyNewButton\").click(function (event) {\n            event.preventDefault();\n            logger(\"click!\") \n        });\n    });\n```\n- save and refresh the browser \u003cbr\u003e ![alt text](pictures/t2-4.png)\n\nNow that jQuery is aware of the new button the css styling also works. Click it and the console outputs the message so we know it works.\n\n### **Step 2: Communicate with the VR Module**\n\n- put this code in the MyNewButton.click() function\n```          \nvar args = {\n    \"content\": \"somecoolName\",\n    \"route\": \"tutorial\"\n};\n\nue4(\"GetSelection\", args);\n```\n\nEverything that looks like `ue4(\"name\",\"argument\")` are calls to the VR module, the so called VRnet API documented [here](#VRnet-API-Documentation).\n\nThe variable \"args\" is a JavaScript object and follows the [JSON syntax](https://www.json.org/json-en.html). \n\nThe \"GetSelection\" call above returns the currently selected nodes in the VR module to this **return function** `ue.interface.getSelection` specified in VRNetzer_API.js around line 30\n\n```\n//// FUNCTIONS CALLED BY UE4\n\nue.interface.getSelection = function (data) {\n    logger(data);\n\n    switch (data.route) {\n     case \"saveSelection\":\n         SaveSelectionDB(data);\n         break;\n     case \"reLayout\":\n         ReLayoutSubSet(data);\n         break;\n     case \"GSEA\":\n         GSEASubSet(data);\n         break;\n\n    }\n\n};\n```\n\nBecause the GetSelection call is used for different things, it's arguments contain `\"route\": \"tutorial\"` that is used in the return function to determine what to do with the response. \n\n- in the return function above, add a case \"tutorial\" to the switch statement\n```\n    case \"tutorial\":\n        LogOnUIServer(data);\n        break;\n```       \n`LogOnUIServer(data);` prints out the data we receive from the VR Module on our python console.\n\nThat's it! let's start the VR Module and check if everything works.\n\n* start viveNet.exe\n* open a layout \u003cbr\u003e![alt text](pictures/t2-5.png)\n* load a selection\u003cbr\u003e![alt text](pictures/t2-6.png)\n* click on MyNewButton\n\nYou should see some printout in the UI Module console window.\nWe have now initiated communication from the UI module to the VR module (by pressing the button) and received a response. In the next step we will see how to do the same with the backend, the Analytics Module.\n\n## **Tutorial 3: Creating a route on the backend**\n\nBasic Python knowledge required \u003cbr\u003e Prerequisites: \n- local installation of the VRNetzer framework [**Installation: Stand Alone**](#Installation-Stand-Alone)\n- Tutorial 2 finished \n\n- in a new instance of [Visual Studio Code](https://code.visualstudio.com/) (or the text editor of your choice) \u003cbr\u003e File -\u003e Open Folder -\u003e navigate to your ** Analytics_Module ** folder\n- in `app.py`, at the end of the document but before `if __name__ == \"__main__\":` insert\n```\n@app.route('/api/\u003cstring:db_namespace\u003e/MyNewRoute', methods=['POST'])\n@cross_origin()\ndef my_new_route(db_namespace):\n    data =request.get_json()\n    node_ids = [int(x) for x in data['node_ids']]\n    print(node_ids)\n    return jsonify(node_ids)\n```\n- save `app.py` and bring up the Analytics Module console, it should detect the change and restart automatically \u003cbr\u003e ![alt text](pictures/t3-1.png)\n\nThat’s it! Now we will go back to the UI Module and forward the output of the VR module that we created previously in tutorial 2. \u003cbr\u003e For this we will use a POST request.\n\n- go to the UI Module project and open it in a new Visual Studio Instance.\n- paste this code at the end of `VRNetzer_API.js`\n```\nfunction MyNewPostRequest(data) {\n\n    payload = JSON.stringify(data);\n    //logger(payload);\n    path = dbprefix + \"/api/\" + thisNamespace.namespace + \"/MyNewRoute\";\n    $.ajax({\n        type: \"POST\",\n        url: path,\n        contentType: \"application/json\",\n        data: payload,\n        dataType: \"json\",\n        headers: {\n            \"Authorization\": \"Basic \" + btoa(dbuser + \":\" + dbpw)\n        },\n        success: function (response) {\n        // DO SOMETHING WITH RESPONSE HERE!\n            logger(response);\n        },\n        error: function (err) {\n            logger(err);\n            logger(data);\n        }\n    });\n\n}\n```\nThis is a blank POST request that calls the route we created before.\n\n`path = dbprefix + \"/api/\" + thisNamespace.namespace + \"/MyNewRoute\"` is the target URL, dbprefix comes from `UI_Module_Config.js` and `thisNamespace.namespace` is the name of the project. \n`path = dbprefix + \"/api/\" + thisNamespace.namespace + \"/MyNewRoute\"` is the target URL, dbprefix comes from `Analytics_ModuleConfig.js` and `thisNamespace.namespace` is the name of the project. \n\n- also in VRNetzer_API.js, in the function `ue.interface.getSelection` put `MyNewPostRequest(data);` instead of `LogOnUIServer(data);`\n\n## CSV file formats ##\n\nYou can find examples of all used .csv formats [HERE](https://github.com/menchelab/Analytics_Module/tree/master/sample_inputs) to to use as templates for the formatting.\n\n**Note:** You need to assign **unique node integer IDs (like EntrezID in case of genes) for your files to upload** \n\u003cbr\u003e**Don't use commas** in string fields, as they are reserved delimiters.\n\n\n**Layout Lists** look like this:\n```\n8473,0.4993,0.4544,0.640,188,20,26,100,3dportrait\n...\n```\nwhere each line is a node with the following data:\n\n|8473|0.4993|0.4544|0.640|188|20|26|100|3dportrait|\n|---|---|---|---|---|---|---|---|---|\n|NodeID|X-Pos|Y-Pos|Z-Pos|R|G|B|A|Namespace|\n\n**Note:** Please provide XYZ coordinates for the layout that are normalised between 0 - 1\n\nRGBA colours range from 0 - 255\n**Note:**  \"A\" (in RGBA) value's should be 100.\nBigger values makes nodes glow, smaller values make them darker.\n\n**Node Lists**\n\nIt is recommended to provide a Node file that converts NodeIDs given in the Layout file into \nreadable symbols and names. There is also the possibility to fill the 4th column with functions, \ndescriptions or other properties that should show up on the node panel within the VR.\nPlease make sure that no commas appear within these fields as the are used as delimiters!\n\nThe format could look like this:\n\n|8473|OGT|O-linked N-acetylglucosamine (GlcNAc) transferase|protein coding|3dportrait|\n|---|---|---|---|---|\n|NodeID|Symbol|Name|Function|Namespace|\n\nSymbols will appear as labels directly at selected nodes and at nodes in the proximity. \n \n**Link Lists**\n```\n1267,2945\n...\n```\nwhere\n\n|1267|2945|\n|---|---|\n|Start|End|\n\nThe identifiers refer to the NodeIDs given in the Layout file.\nFor now, unweighted link lists are supported and only one link list per project is allowed. \n\n**Attributes**\n\nFor every node multiple types of attributes can be given.\nThe type can be specified as namespace (e.g. DISEASE).\nOne gene can have multiple attributes (such as a gene can be \nassociated to multiple diseases). And vice versa \none specific attribute can be distributed over several nodes.\n\n|node_id|attribute_id|namespace|name|description|\n|---|---|---|---|---|\n3543|DOID:2825|DISEASE|nose disease|none|\n25836|DOID:2825|DISEASE|nose disease|none|\n4852|DOID:2825|DISEASE|nose disease|none|\n4524|DOID:1936|DISEASE|atherosclerosis|none|\n4524|DOID:7148|DISEASE|rheumatoid arthritis|none|\n4524|DOID:4535|DISEASE|hypotrichosis|none|\n\n**Note**\nThe database structure allows also attributes that are organized as an ontology tree. However it is not part of the uploader functionality yet. \nWe plan to provide it with the next release.\n\n**Selection Lists**\n\nAn important feature are selection lists. \nThey define subsets of your nodes that are of interest for specific task.\n(Such as a gene subset representing a list of patient variants.)\nThey can be loaded separately in a VR session to always have them highlighted. Moreover they serve as the initial set for several analytical procedures such as seeds for a random walk.\n\nSelection lists are a sub category of attributes and can be uploaded \nin the following way:\n\n|node_id|attribute_id|namespace|name|description|\n|---|---|---|---|---|\n3543|my_ID:1|SELECTION|my_set_1|none|\n4524|my_ID:1|SELECTION|my_set_1|none|\n25836|my_ID:2|SELECTION|my_set_2|none|\n4852|my_ID:2|SELECTION|my_set_2|none|\n\nPlease provide as attribute_id an user defined ID for your selection.\nThe name can be picked up in the VR session.\n\n\n**Labels**\n\n|x_loc|y_loc|z_loc|text|namespace|\n|---|---|---|---|---|\n|0.5000000|0.5000000|0.5000000|C E L L U L A R  C O M P O N E N T S|my_layout|\n\nA simple way to add textlabels at certain positions to a specific layout (namespace)\n\n\n\n**Note**\n\n\n## **USE CASE Gene prioritization**\n\nThis refers to the chapter 'Application to prioritization of genomic variants' from the publication\ndescribing one specific use case for identifying a single disease causing gene out of a set of given variant genes.\n\nIn the VRNetzer release 1.1 candidate and seed genes are already contained as a prepared data set.\nFor this specific task we include an extra patient panel that looks like this \n\n\u003cbr\u003e ![alt text](pictures/sidepanel_1.png)\n\nIt may include patient and diagnosis data and a list of variants.\nThe second tab shows the manually curated seed genes:\n\n\u003cbr\u003e ![alt text](pictures/sidepanel_2.png)\n\nFrom both lists the genes symbols can be clicked to be highlighted in the network while \nthe gene panel shows the gene characteristics for individual inspection.\nAs described in the publication the sets can be analyzed in terms of their network properties for example.\nIn order to show their interconnectivity or lcc size select the network analytics tab on the control panel \n(turn your left wrist/controller) and use the isolate and re-layout functions. (NOTE: the LINKS needs to be loaded)\n\n\u003cbr\u003e ![alt text](pictures/mainpanel_6.png)\n\nTo contextualize the variant genes in the functional set of seeds run the random walk on the 3rd tab of side panel.\nIt will highlight the variants (shiny red), seeds (shiny yellow) and linker genes (shiny blue) in the 3D network. \nA bar chart within the side panel presents a list of genes resulting from the random walk ranked \nby their visiting probabilty.\nDepending on the choice of the restart parameter value (high r means higher localization around initial gene set) you will find DOCK2 \namong the first few candidates.\n\n\u003cbr\u003e ![alt text](pictures/sidepanel_3.png)\n\nA force-graph layout of the resulting random-walk network can be inspected separately in the 5th tab of the side panel. \nThe color legend is the same as in the 3D network and the nodes are interactive so that clicking on them refers directly to the \n3D network where the gene panel opens as well.\n\n\u003cbr\u003e ![alt text](pictures/sidepanel_5.png)\n\nSaving your results makes them accessible from outside the VR session: http://127.0.0.1:5000/_side  \n\n\n\n\n## **VRnet API Documentation**\n\nThe following function calls are sent from jQuery to the VR module.\n\nThe syntax looks like this:\n\n**`ue4(\"rw_result\", response);`**\n\nwhere \"rw_results\" is the function name and \"response\" the parameters.\n\nThis list will grow in the future.\n\n| function | parameters | type | description |\n| ------ | ------ |  ------ |  ------ | \n| LoadDbNodeList | node list object | json  | loads a node list into channel A of the layout | \n| LoadDbNodeListB |node list object | json  | loads a node list into channel B of the layout (only xyz, no colors) | \n| LoadDbLinkList | link list object | json  | loads a link list from db | \n| LoadDbLabelList |  label list object | json  | loads a label list for channel A of the layout | \n| LoadDbLabelListB | label list object | json  | loads a label list for channel B of the layout |\n| Init | --- | --- | start initialization routine, OnDocumentReady()  |\n| Morph | \"A\" or \"B\" | string | Morph between layout channel A and B |\n| GetSelection |  { \"content\": \"Name\",\"route\": \"saveSelection\"} | json  | Get active selection and do different things depending on route (save it on db in this case) | \n| SetScale | value | float | set Network Scale  | \n| SetNodeSize | value | float | set Network SetNodeSize (linksize is also affected by this)  |\n| SetLinkSize | value | float | set Network SetLinkSize ATTENTION: big diameters cause lag  |\n| SetLinkAlpha | value | float | set Network Link transperancy  |\n| SetLight | value | float | set scene light intensity |\n| ShortestPathPoint | \"p1\" or \"p2\" |  string | get selected node ID from VR and define it either as start or endpoint | \n| ExitIsolate | --- |  --- | exit Isolate Selection Mode (show all links) | \n| Rw_Result | rw object | json  | display the random walk results in VR | \n| Julia | {\"seeds\":[{\"node_id\":123}...],\"variants\":[...],\"linker\":[...]} | json  | Gene Priorization example on side panel |\n| ActivateNode | id | int | select and highlight single node in network | \n| ReLayout | node list object | json   | show newly created layout of subset in VR (this resorts the link list) |\n| VRkeyboard | route |  string | opens a keyboard in VR - after user presses ENTER, typed string is returned to a .js function by the same name as route - so you need to create this | \n| loadSelection | name | string | Deprecated Load selection from csv file |\n\n## **Dependencies**\n| **Analytics Module** |**UI Module** |**VR Module** |\n|---|---|---|\n|Win, Mac, Linux|Win, Mac, Linux|Win 10|\n|python==3.6 \u003cbr\u003e click==7.1.2 \u003cbr\u003e decorator==4.4.2 \u003cbr\u003e fisher==0.1.9 \u003cbr\u003e Flask==1.1.2 \u003cbr\u003e Flask-Cors==3.0.8 \u003cbr\u003e itsdangerous==1.1.0 \u003cbr\u003e Jinja2==2.11.2 \u003cbr\u003e MarkupSafe==1.1.1 \u003cbr\u003e networkx==2.4 \u003cbr\u003e numpy==1.19.4 \u003cbr\u003e pandas==1.2.0 \u003cbr\u003e PyMySQL==0.9.3 \u003cbr\u003e python-dateutil==2.8.1 \u003cbr\u003e pytz==2020.5 \u003cbr\u003e six==1.15.0 \u003cbr\u003e Werkzeug==0.16.1 \u003cbr\u003e jquery==3.4.1 \u003cbr\u003e jquery-ui | python==3.6 \u003cbr\u003e Flask==1.1.2 \u003cbr\u003e Flask-Cors==3.0.8 \u003cbr\u003e jquery==3.4.1 \u003cbr\u003e jquery-ui \u003cbr\u003e d3v4 | Epic Unreal Engine 4.23 \u003cbr\u003e WebUI by Tracer Interactive \u003cbr\u003e Direct X Runtime  \u003cbr\u003e SteamVR|\n\n## **Data availability**\n\n| **source** |**url** |**version/realease date** |\n|---|---|---|\n|GO taxonomy | http://geneontology.org/docs/download-ontology/ |  Mar 2019 |\n|GO annotations|http://current.geneontology.org/products/pages/downloads.html|Mar 2019 |\n|DO taxonomy|https://github.com/DiseaseOntology/HumanDiseaseOntology/\u003cbr\u003etree/main/src/ontology/releases| Dec 2018|\n|DisGeNET|https://www.disgenet.org/downloads |Dec 2018|\n|OMIM |https://www.omim.org/ |Feb 2019|\n|HPO taxonomy| https://hpo.jax.org/app/download/ontology|Sep 2018|\n|HPO annotation| https://hpo.jax.org/app/download/annotation|Sep 2018|\n|KeGG|https://www.genome.jp/kegg/genes.html|Feb 2019|\n|BioGRID|https://downloads.thebiogrid.org/|Jun 2019|\n|REACTOME|https://reactome.org/download-data |Jul 2019|\n|Gtex |https://gtexportal.org/home/datasets|V7|\n|Pubmed articles from INDRA|INDRA module|May 2019|\n|INDRA|https://github.com/sorgerlab/indra|May 2019|\n|HIPPIE (Interactome)|http://cbdm-01.zdv.uni-mainz.de/~mschaefer/hippie/download.php |Jul 2017|\n\n\n## **Software**\n\nPython==3.6 \u003cbr\u003e JavaScript==ES6 \u003cbr\u003e  MySQL==8.0 \u003cbr\u003e Apache==2.4.29 (Ubuntu) \u003cbr\u003e EPIC Unreal Engine 4 \n\n## **License**\n\nCopyright (c) 2021 Menche Lab\n\nThis project is licensed under the terms of the MIT license. Check the LICENSE.md file for details.\n\u003cbr\u003e\n\u003cbr\u003e\nThis Readme:\n\u003cbr\u003e\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4597735.svg)](https://doi.org/10.5281/zenodo.4597735)\n\u003cbr\u003e\nUI Module:\n\u003cbr\u003e\n[![DOI](https://zenodo.org/badge/327021828.svg)](https://zenodo.org/badge/latestdoi/327021828)\n\u003cbr\u003e\nAnalytics Module:\n\u003cbr\u003e\n[![DOI](https://zenodo.org/badge/213907077.svg)](https://zenodo.org/badge/latestdoi/213907077)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmenchelab%2Fvrnetzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmenchelab%2Fvrnetzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmenchelab%2Fvrnetzer/lists"}