diff --git a/.ipynb_checkpoints/band_structure_visualization-Copy1-checkpoint.ipynb b/.ipynb_checkpoints/band_structure_visualization-Copy1-checkpoint.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..ae802f47de3dca31c7508a4235089d6b4bb680f0 --- /dev/null +++ b/.ipynb_checkpoints/band_structure_visualization-Copy1-checkpoint.ipynb @@ -0,0 +1,4968 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "init_cell": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<style>.container { width:100% !important; }</style>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.core.display import display, HTML\n", + "display(HTML(\"<style>.container { width:100% !important; }</style>\"))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "init_cell": true + }, + "outputs": [], + "source": [ + "from IPython.core.display import Javascript\n", + "from IPython.display import display\n", + "\n", + "def run_cell_by_tag(tags):\n", + " display(Javascript(\"window.runCells('\"+tags+\"')\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "init_cell": true, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " code_show=true; \n", + " function code_toggle() {\n", + " if (code_show)\n", + " {\n", + " $('div.input').hide();\n", + " } \n", + " else \n", + " {\n", + " $('div.input').show();\n", + " }\n", + " code_show = !code_show\n", + " } \n", + " $( document ).ready(code_toggle);\n", + "</script>\n", + "The raw code for this notebook is by default hidden for easier reading.\n", + "To toggle on/off the raw code, click <a href=\"javascript:code_toggle()\">here</a>.\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " code_show=true; \n", + " function code_toggle() {\n", + " if (code_show)\n", + " {\n", + " $('div.input').hide();\n", + " } \n", + " else \n", + " {\n", + " $('div.input').show();\n", + " }\n", + " code_show = !code_show\n", + " } \n", + " $( document ).ready(code_toggle);\n", + "</script>\n", + "The raw code for this notebook is by default hidden for easier reading.\n", + "To toggle on/off the raw code, click <a href=\"javascript:code_toggle()\">here</a>." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "init_cell": true, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "<div align=\"left\" style=\"background-color: rgba(149,170,79, 1.0); width: 100%; height: 390px; overflow: hidden;\">\n", + " <div >\n", + " <table>\n", + " <tr></tr>\n", + " <tr>\n", + " <td><img src=\"Nomad_tutorial_head.png\"></td>\n", + " </tr>\n", + " </table>\n", + " </div>\n", + "\n", + " <br><br>\n", + " <div style=\"position:relative; left:3%\"><font size=6em color=\"#20335d\" ><b> - Visualization of the band structure of materials </b></font></div>\n", + " <p style=\"position:relative;left:10%; \">\n", + " <br>\n", + " Created by:\n", + "\n", + " Xiangyue Liu<sup>1</sup>(<a href=\"mailto:xyliu@fhi-berlin.mpg.de\">email</a>),\n", + " \n", + " Fawzi Mohamed<sup>1</sup>,\n", + " \n", + " and Luca M. Ghiringhelli<sup>1</sup>(<a href=\"mailto:ghiringhelli@fhi-berlin.mpg.de\">email</a>), <br>\n", + "\n", + " <br><br>\n", + " <sup>1</sup> Fritz Haber Institute of the Max Planck Society, Faradayweg 4-6, D-14195 Berlin, Germany <br>\n", + " <br>\n", + "\n", + "\n", + " </p>\n", + " <br>\n", + " <div style=\"position:relative;bottom:3%\">\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#999999\" size=\"10em\">v2.0.0</font></div>\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#666666\" size=\"2.7em\">[Last updated: August 5, 2019]</font></div>\n", + " </div>\n", + "\n", + "</div>\n", + "\n", + "\n", + "<div style='text-align: right;'>\n", + " <a href=\"https://analytics-toolkit.nomad-coe.eu/home/\" class=\"btn btn-primary\" style=\"font-size:larger;\">Back to Analytics Home</a> \n", + " <a href=\"https://www.nomad-coe.eu/\" class=\"btn btn-primary\" style=\"font-size:larger; \">Back to nomad-coe</a> \n", + "</div>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "\n", + "\n", + "<div align=\"left\" style=\"background-color: rgba(149,170,79, 1.0); width: 100%; height: 390px; overflow: hidden;\">\n", + " <div >\n", + " <table>\n", + " <tr></tr>\n", + " <tr>\n", + " <td><img src=\"Nomad_tutorial_head.png\"></td>\n", + " </tr>\n", + " </table>\n", + " </div>\n", + "\n", + " <br><br>\n", + " <div style=\"position:relative; left:3%\"><font size=6em color=\"#20335d\" ><b> - Visualization of the band structure of materials </b></font></div>\n", + " <p style=\"position:relative;left:10%; \">\n", + " <br>\n", + " Created by:\n", + "\n", + " Xiangyue Liu<sup>1</sup>(<a href=\"mailto:xyliu@fhi-berlin.mpg.de\">email</a>),\n", + " \n", + " Fawzi Mohamed<sup>1</sup>,\n", + " \n", + " and Luca M. Ghiringhelli<sup>1</sup>(<a href=\"mailto:ghiringhelli@fhi-berlin.mpg.de\">email</a>), <br>\n", + "\n", + " <br><br>\n", + " <sup>1</sup> Fritz Haber Institute of the Max Planck Society, Faradayweg 4-6, D-14195 Berlin, Germany <br>\n", + " <br>\n", + "\n", + "\n", + " </p>\n", + " <br>\n", + " <div style=\"position:relative;bottom:3%\">\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#999999\" size=\"10em\">v2.0.0</font></div>\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#666666\" size=\"2.7em\">[Last updated: August 5, 2019]</font></div>\n", + " </div>\n", + "\n", + "</div>\n", + "\n", + "\n", + "<div style='text-align: right;'>\n", + " <a href=\"https://analytics-toolkit.nomad-coe.eu/home/\" class=\"btn btn-primary\" style=\"font-size:larger;\">Back to Analytics Home</a> \n", + " <a href=\"https://www.nomad-coe.eu/\" class=\"btn btn-primary\" style=\"font-size:larger; \">Back to nomad-coe</a> \n", + "</div>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "init_cell": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " window.findCellIndicesByTag = function findCellIndicesByTag(tagName) {\n", + " return (Jupyter.notebook.get_cells()\n", + " .filter(\n", + " ({metadata: {tags}}) => tags && tags.includes(tagName)\n", + " )\n", + " .map((cell) => Jupyter.notebook.find_cell_index(cell))\n", + " );\n", + " };\n", + "\n", + "\n", + " window.runCells = function runPlotCells(tags) {\n", + " var c = window.findCellIndicesByTag(tags);\n", + " Jupyter.notebook.execute_cells(c);\n", + " };\n", + "</script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " window.findCellIndicesByTag = function findCellIndicesByTag(tagName) {\n", + " return (Jupyter.notebook.get_cells()\n", + " .filter(\n", + " ({metadata: {tags}}) => tags && tags.includes(tagName)\n", + " )\n", + " .map((cell) => Jupyter.notebook.find_cell_index(cell))\n", + " );\n", + " };\n", + "\n", + "\n", + " window.runCells = function runPlotCells(tags) {\n", + " var c = window.findCellIndicesByTag(tags);\n", + " Jupyter.notebook.execute_cells(c);\n", + " };\n", + "</script>" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "init_cell": true, + "tags": [ + "search_materials" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<br><br>\n", + "\n", + "<p style=\"color: #20335d;font-weight: 450; font-size: 14pt;font-family: Arial;\"> This tutorial visulizes the band structures and density of states (DOS) of the NOMAD materials.</p>\n", + "<br><br>\n", + "\n", + "<style>\n", + ".button {\n", + " background-color: #e7e7e7;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 15px 32px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-family: Arial;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + "}\n", + "\n", + " .text-normal-black{\n", + " color: #000;font-weight: 200; font-size: 10pt;\n", + " font-family: Arial;\n", + " }\n", + " .div_band_dos{\n", + " box-sizing: border-box;\n", + " width: 100%;\n", + " height: 600px;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band_dos_compare{\n", + " box-sizing: border-box;\n", + " width: 1600px;\n", + " height: 600px;\n", + " color: #00AEFF;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 37%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_dos{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 13%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_tools{\n", + " color: #20335d;font-weight: 150; font-size: 13pt;\n", + " width: 35%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " margin-left:20pt;\n", + " float:left;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_checkbox_compare{\n", + " color: #888;font-weight: 150; font-size: 12pt;\n", + " width: 10%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " border: solid #fff 1px;\n", + " float:right;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_overview{\n", + " width: 300px;\n", + " height: 200px;\n", + " background-color: #fff;\n", + " margin-left:10px; \n", + " margin-top: 20px;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .button_tools {\n", + " background-color: #F0F0F0;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 10px 15px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + " font-family: Arial;\n", + "\n", + " }\n", + "\n", + " \n", + " .g-before-after{position:relative;overflow:hidden;width:500px}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%}\n", + "</style>\n", + "\n", + "<script>\n", + " //Search for certain keyword: https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\n", + " //FjiYy5-ETRCrs5ktzJA55w/bOY0cPkBvvNAY7pZdbginlKXJ2kF\n", + " //\"upload_id\"/\"calc_id\"\n", + " \n", + " //Global variables\n", + " var paths_section_k_band_segment = []; \n", + " var paths_section_dos = [];\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " \n", + " var band_paths = [];\n", + " var dos_paths = [];\n", + " var N_materials = 0; //Number of materials that have both band and DOS in the same calculation \n", + " \n", + " \n", + " function getJSON(url) {\n", + " var resp ;\n", + " var xmlHttp ;\n", + "\n", + " resp = '' ;\n", + " xmlHttp = new XMLHttpRequest();\n", + "\n", + " if(xmlHttp != null)\n", + " {\n", + " xmlHttp.open( \"GET\", url, false );\n", + " xmlHttp.send( null );\n", + " resp = xmlHttp.responseText;\n", + " }\n", + "\n", + " return resp;\n", + " }\n", + " function match_band_dos()\n", + " {\n", + " //TMP for local tests\n", + " /*\n", + " paths_section_k_band_segment = [\"data/kOJR-AlPSgiNG9AdZoxd4g_9mxjIU0edrPosfsTc4uyDG9H_UXr.json\",\"data/kOJR-AlPSgiNG9AdZoxd4g_lfkGCmWozYENeiGhu5W7dJUqLTkj.json\"];\n", + " paths_section_dos = [\"data/kOJR-AlPSgiNG9AdZoxd4g_8tEGnaz0yY91eSyysKZkIUH9qx8J.json\", \"data/kOJR-AlPSgiNG9AdZoxd4g_lxUT3viRZcC_1IsH_KvO5tChAtV1.json\"];\n", + " */\n", + "\n", + " //band_paths = [];\n", + " //dos_paths = [];\n", + " //N_materials = 0; \n", + " \n", + " var data_k_band = [];\n", + " for(var i_path_k_band = 0; i_path_k_band < paths_section_k_band_segment.length; i_path_k_band ++)\n", + " {\n", + " var i_data_k_band_json = JSON.parse(getJSON(paths_section_k_band_segment[i_path_k_band]));\n", + " var i_data_k_band = {};\n", + " i_data_k_band[\"program_name\"] = i_data_k_band_json[\"section_run\"][\"program_name\"];\n", + " i_data_k_band[\"k_mesh_points\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_k_band[\"simulation_cell\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_k_band[\"atom_positions\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_k_band[\"atom_labels\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_k_band[\"XC_functional_name\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_k_band[\"path\"] = paths_section_k_band_segment[i_path_k_band];\n", + " data_k_band.push(i_data_k_band);\n", + " }\n", + "\n", + " var data_dos = [];\n", + " for(var i_path_dos = 0; i_path_dos < paths_section_dos.length; i_path_dos ++)\n", + " {\n", + " var i_data_dos_json = JSON.parse(getJSON(paths_section_dos[i_path_dos]));\n", + " var i_data_dos = {};\n", + " i_data_dos[\"program_name\"] = i_data_dos_json[\"section_run\"][\"program_name\"];\n", + " i_data_dos[\"k_mesh_points\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_dos[\"simulation_cell\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_dos[\"atom_positions\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_dos[\"atom_labels\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_dos[\"XC_functional_name\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_dos[\"path\"] = paths_section_dos[i_path_dos];\n", + " data_dos.push(i_data_dos); \n", + " }\n", + "\n", + " //Matching: band[i] ~ dos[i] (the same systems are arranged with the same index)\n", + " band_paths = [];\n", + " dos_paths = [];\n", + " N_materials = 0;\n", + " for(var i_k_band = 0; i_k_band < data_k_band.length; i_k_band ++)\n", + " {\n", + " for(var i_dos = 0; i_dos < data_dos.length; i_dos ++)\n", + " {\n", + " if(data_k_band[i_k_band][\"program_name\"] != data_dos[i_dos][\"program_name\"])\n", + " continue; \n", + " //if(data_k_band[i_k_band][\"k_mesh_points\"].join() != data_dos[i_dos][\"k_mesh_points\"].join())\n", + " // continue;\n", + " if(data_k_band[i_k_band][\"simulation_cell\"].join() != data_dos[i_dos][\"simulation_cell\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_positions\"].join() != data_dos[i_dos][\"atom_positions\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_labels\"].join() != data_dos[i_dos][\"atom_labels\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"XC_functional_name\"] != data_dos[i_dos][\"XC_functional_name\"])\n", + " continue;\n", + " band_paths.push(data_k_band[i_k_band][\"path\"]);\n", + " dos_paths.push(data_dos[i_dos][\"path\"]);\n", + " N_materials ++;\n", + " }\n", + " }\n", + " //Pass the arrays to python\n", + "\n", + " var command = \"N_materials = \" + N_materials + \";\"\n", + " var kernel = IPython.notebook.kernel;\n", + " command += \"band_paths = \" + \"[\\'\" + band_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " command += \"dos_paths = \" + \"[\\'\" + dos_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " kernel.execute(command);\n", + " \n", + " \n", + " }\n", + "\n", + " function get_paths_from_search_results(result_json, div_id_search_results,div_head)\n", + " {\n", + " paths = [];\n", + " search_results_content = [div_head, '<table>', '<tr><th>Chemical formula</th><th>Spacegroup</th><th>Code</th><th>XC functional</th><th>Upload ID</th><th>Calculation ID</th><th>URL</th></tr>'];\n", + " for(var i_key in result_json)\n", + " {\n", + " if(i_key == \"results\")\n", + " {\n", + " for(var system in result_json[i_key])\n", + " {\n", + " //Get the path to the data files (json): https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/upload_id/calc_id \n", + " path = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/\" + result_json[i_key][system][\"upload_id\"] + \"/\" + result_json[i_key][system][\"calc_id\"]\n", + " paths.push(path);\n", + " \n", + " //Show the results in div\n", + " // \"formula\" \"spacegroup_symbol\" \"code_name\" \"xc_functional\"\n", + " content = '<tr>';\n", + " content += '<td>' + result_json[i_key][system][\"formula\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"spacegroup_symbol\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"code_name\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"xc_functional\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"upload_id\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"calc_id\"] + '</td>'; \n", + " content += '<td>' + path + '</td>';\n", + " content += '</tr>';\n", + " search_results_content.push(content);\n", + " }\n", + " }\n", + " }\n", + " search_results_content.push('</table>');\n", + " document.getElementById(div_id_search_results).innerHTML = search_results_content.join('');\n", + " return paths\n", + " }\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " function submit_search()\n", + " {\n", + " \n", + " var result;\n", + " var formula = document.getElementById(\"keyword_chemical_formula\").value;\n", + " var query_command_k_band = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_k_band_segment\";\n", + " var query_command_dos = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_dos\";\n", + " //result = getJSON(\"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\");\n", + " var result_k_band = getJSON(query_command_k_band);\n", + " var result_dos = getJSON(query_command_dos);\n", + " var result_json_k_band = JSON.parse(result_k_band);//parse the searching results to json from URL\n", + " var result_json_dos = JSON.parse(result_dos);\n", + " paths_section_k_band_segment = []; \n", + " paths_section_dos = [];\n", + " paths_section_k_band_segment = get_paths_from_search_results(result_json_k_band, \"search_results_section_k_band_segment\", \"<br><br><font size=4em>Calculations containing band structures:</font><br>\");\n", + " paths_section_dos = get_paths_from_search_results(result_json_dos, \"search_results_section_dos\", \"<br><font size=4em>Calculations containing DOS:</font><br>\");\n", + " \n", + " var promise = Promise.resolve();\n", + " promise\n", + " .then(match_band_dos())\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')))\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')));\n", + " \n", + " //match_band_dos();\n", + " \n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')); //Read the json files, and prepare data for plot\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')); //Prepare for plot\n", + " }\n", + " function reset_search()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('search_materials'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot'));\n", + " }\n", + " \n", + " \n", + "</script>\n", + "<font size=4em>Please input the chemical formula:</font>\n", + "<input type=\"text\" id=\"keyword_chemical_formula\" value=\"AlInO3\"> \n", + "<button class=\"button\" onclick=\"submit_search()\">Search</button>\n", + "<button class=\"button\" onclick=\"reset_search()\">Reset</button>\n", + "<br><br><br>\n", + "<div id=\"search_results_section_k_band_segment\"></div>\n", + "<div id=\"search_results_section_dos\"></div>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%html\n", + "<br><br>\n", + "\n", + "<p style=\"color: #20335d;font-weight: 450; font-size: 14pt;font-family: Arial;\"> This tutorial visulizes the band structures and density of states (DOS) of the NOMAD materials.</p>\n", + "<br><br>\n", + "\n", + "<style>\n", + ".button {\n", + " background-color: #e7e7e7;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 15px 32px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-family: Arial;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + "}\n", + "\n", + " .text-normal-black{\n", + " color: #000;font-weight: 200; font-size: 10pt;\n", + " font-family: Arial;\n", + " }\n", + " .div_band_dos{\n", + " box-sizing: border-box;\n", + " width: 100%;\n", + " height: 600px;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band_dos_compare{\n", + " box-sizing: border-box;\n", + " width: 1600px;\n", + " height: 600px;\n", + " color: #00AEFF;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 37%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_dos{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 13%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_tools{\n", + " color: #20335d;font-weight: 150; font-size: 13pt;\n", + " width: 35%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " margin-left:20pt;\n", + " float:left;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_checkbox_compare{\n", + " color: #888;font-weight: 150; font-size: 12pt;\n", + " width: 10%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " border: solid #fff 1px;\n", + " float:right;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_overview{\n", + " width: 300px;\n", + " height: 200px;\n", + " background-color: #fff;\n", + " margin-left:10px; \n", + " margin-top: 20px;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .button_tools {\n", + " background-color: #F0F0F0;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 10px 15px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + " font-family: Arial;\n", + "\n", + " }\n", + "\n", + " \n", + " .g-before-after{position:relative;overflow:hidden;width:500px}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%}\n", + "</style>\n", + "\n", + "<script>\n", + " //Search for certain keyword: https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\n", + " //FjiYy5-ETRCrs5ktzJA55w/bOY0cPkBvvNAY7pZdbginlKXJ2kF\n", + " //\"upload_id\"/\"calc_id\"\n", + " \n", + " //Global variables\n", + " var paths_section_k_band_segment = []; \n", + " var paths_section_dos = [];\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " \n", + " var band_paths = [];\n", + " var dos_paths = [];\n", + " var N_materials = 0; //Number of materials that have both band and DOS in the same calculation \n", + " \n", + " \n", + " function getJSON(url) {\n", + " var resp ;\n", + " var xmlHttp ;\n", + "\n", + " resp = '' ;\n", + " xmlHttp = new XMLHttpRequest();\n", + "\n", + " if(xmlHttp != null)\n", + " {\n", + " xmlHttp.open( \"GET\", url, false );\n", + " xmlHttp.send( null );\n", + " resp = xmlHttp.responseText;\n", + " }\n", + "\n", + " return resp;\n", + " }\n", + " function match_band_dos()\n", + " {\n", + " //TMP for local tests\n", + " /*\n", + " paths_section_k_band_segment = [\"data/kOJR-AlPSgiNG9AdZoxd4g_9mxjIU0edrPosfsTc4uyDG9H_UXr.json\",\"data/kOJR-AlPSgiNG9AdZoxd4g_lfkGCmWozYENeiGhu5W7dJUqLTkj.json\"];\n", + " paths_section_dos = [\"data/kOJR-AlPSgiNG9AdZoxd4g_8tEGnaz0yY91eSyysKZkIUH9qx8J.json\", \"data/kOJR-AlPSgiNG9AdZoxd4g_lxUT3viRZcC_1IsH_KvO5tChAtV1.json\"];\n", + " */\n", + "\n", + " //band_paths = [];\n", + " //dos_paths = [];\n", + " //N_materials = 0; \n", + " \n", + " var data_k_band = [];\n", + " for(var i_path_k_band = 0; i_path_k_band < paths_section_k_band_segment.length; i_path_k_band ++)\n", + " {\n", + " var i_data_k_band_json = JSON.parse(getJSON(paths_section_k_band_segment[i_path_k_band]));\n", + " var i_data_k_band = {};\n", + " i_data_k_band[\"program_name\"] = i_data_k_band_json[\"section_run\"][\"program_name\"];\n", + " i_data_k_band[\"k_mesh_points\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_k_band[\"simulation_cell\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_k_band[\"atom_positions\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_k_band[\"atom_labels\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_k_band[\"XC_functional_name\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_k_band[\"path\"] = paths_section_k_band_segment[i_path_k_band];\n", + " data_k_band.push(i_data_k_band);\n", + " }\n", + "\n", + " var data_dos = [];\n", + " for(var i_path_dos = 0; i_path_dos < paths_section_dos.length; i_path_dos ++)\n", + " {\n", + " var i_data_dos_json = JSON.parse(getJSON(paths_section_dos[i_path_dos]));\n", + " var i_data_dos = {};\n", + " i_data_dos[\"program_name\"] = i_data_dos_json[\"section_run\"][\"program_name\"];\n", + " i_data_dos[\"k_mesh_points\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_dos[\"simulation_cell\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_dos[\"atom_positions\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_dos[\"atom_labels\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_dos[\"XC_functional_name\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_dos[\"path\"] = paths_section_dos[i_path_dos];\n", + " data_dos.push(i_data_dos); \n", + " }\n", + "\n", + " //Matching: band[i] ~ dos[i] (the same systems are arranged with the same index)\n", + " band_paths = [];\n", + " dos_paths = [];\n", + " N_materials = 0;\n", + " for(var i_k_band = 0; i_k_band < data_k_band.length; i_k_band ++)\n", + " {\n", + " for(var i_dos = 0; i_dos < data_dos.length; i_dos ++)\n", + " {\n", + " if(data_k_band[i_k_band][\"program_name\"] != data_dos[i_dos][\"program_name\"])\n", + " continue; \n", + " //if(data_k_band[i_k_band][\"k_mesh_points\"].join() != data_dos[i_dos][\"k_mesh_points\"].join())\n", + " // continue;\n", + " if(data_k_band[i_k_band][\"simulation_cell\"].join() != data_dos[i_dos][\"simulation_cell\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_positions\"].join() != data_dos[i_dos][\"atom_positions\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_labels\"].join() != data_dos[i_dos][\"atom_labels\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"XC_functional_name\"] != data_dos[i_dos][\"XC_functional_name\"])\n", + " continue;\n", + " band_paths.push(data_k_band[i_k_band][\"path\"]);\n", + " dos_paths.push(data_dos[i_dos][\"path\"]);\n", + " N_materials ++;\n", + " }\n", + " }\n", + " //Pass the arrays to python\n", + "\n", + " var command = \"N_materials = \" + N_materials + \";\"\n", + " var kernel = IPython.notebook.kernel;\n", + " command += \"band_paths = \" + \"[\\'\" + band_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " command += \"dos_paths = \" + \"[\\'\" + dos_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " kernel.execute(command);\n", + " \n", + " \n", + " }\n", + "\n", + " function get_paths_from_search_results(result_json, div_id_search_results,div_head)\n", + " {\n", + " paths = [];\n", + " search_results_content = [div_head, '<table>', '<tr><th>Chemical formula</th><th>Spacegroup</th><th>Code</th><th>XC functional</th><th>Upload ID</th><th>Calculation ID</th><th>URL</th></tr>'];\n", + " for(var i_key in result_json)\n", + " {\n", + " if(i_key == \"results\")\n", + " {\n", + " for(var system in result_json[i_key])\n", + " {\n", + " //Get the path to the data files (json): https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/upload_id/calc_id \n", + " path = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/\" + result_json[i_key][system][\"upload_id\"] + \"/\" + result_json[i_key][system][\"calc_id\"]\n", + " paths.push(path);\n", + " \n", + " //Show the results in div\n", + " // \"formula\" \"spacegroup_symbol\" \"code_name\" \"xc_functional\"\n", + " content = '<tr>';\n", + " content += '<td>' + result_json[i_key][system][\"formula\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"spacegroup_symbol\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"code_name\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"xc_functional\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"upload_id\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"calc_id\"] + '</td>'; \n", + " content += '<td>' + path + '</td>';\n", + " content += '</tr>';\n", + " search_results_content.push(content);\n", + " }\n", + " }\n", + " }\n", + " search_results_content.push('</table>');\n", + " document.getElementById(div_id_search_results).innerHTML = search_results_content.join('');\n", + " return paths\n", + " }\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " function submit_search()\n", + " {\n", + " \n", + " var result;\n", + " var formula = document.getElementById(\"keyword_chemical_formula\").value;\n", + " var query_command_k_band = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_k_band_segment\";\n", + " var query_command_dos = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_dos\";\n", + " //result = getJSON(\"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\");\n", + " var result_k_band = getJSON(query_command_k_band);\n", + " var result_dos = getJSON(query_command_dos);\n", + " var result_json_k_band = JSON.parse(result_k_band);//parse the searching results to json from URL\n", + " var result_json_dos = JSON.parse(result_dos);\n", + " paths_section_k_band_segment = []; \n", + " paths_section_dos = [];\n", + " paths_section_k_band_segment = get_paths_from_search_results(result_json_k_band, \"search_results_section_k_band_segment\", \"<br><br><font size=4em>Calculations containing band structures:</font><br>\");\n", + " paths_section_dos = get_paths_from_search_results(result_json_dos, \"search_results_section_dos\", \"<br><font size=4em>Calculations containing DOS:</font><br>\");\n", + " \n", + " var promise = Promise.resolve();\n", + " promise\n", + " .then(match_band_dos())\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')))\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')));\n", + " \n", + " //match_band_dos();\n", + " \n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')); //Read the json files, and prepare data for plot\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')); //Prepare for plot\n", + " }\n", + " function reset_search()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('search_materials'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot'));\n", + " }\n", + " \n", + " \n", + "</script>\n", + "<font size=4em>Please input the chemical formula:</font>\n", + "<input type=\"text\" id=\"keyword_chemical_formula\" value=\"AlInO3\"> \n", + "<button class=\"button\" onclick=\"submit_search()\">Search</button>\n", + "<button class=\"button\" onclick=\"reset_search()\">Reset</button>\n", + "<br><br><br>\n", + "<div id=\"search_results_section_k_band_segment\"></div>\n", + "<div id=\"search_results_section_dos\"></div>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": { + "tags": [ + "process_band_dos_data" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " //alert(\"process_band_dos_data: \" +band_paths)\n", + " //alert(\"process_band_dos_data: \" +info_obj_all)\n", + " function get_label_flag(coor_array)\n", + " {\n", + " var coor = coor_array.sort().join();\n", + " if(coor == '0,0.5,0.5')\n", + " return \"X\";\n", + " if(coor == '0,0,0.5')\n", + " return \"M\";\n", + " else if(coor == '0.5,0.5,0.5')\n", + " return \"L\";\n", + " else if(coor == '0.375,0.375,0.75')\n", + " return \"K\";\n", + " else if(coor == '0.25,0.5,0.75')\n", + " return \"W\";\n", + " else if(coor == '0,0,0')\n", + " return \"\\u0393\";\n", + " else if(coor == '0.25,0.625,0.625')\n", + " return \"U\";\n", + " else\n", + " {\n", + " //alert(\"k label not found: \" + coor);\n", + " return \"?\";\n", + " }\n", + " }\n", + "\n", + "\n", + " //============Process the band structure data============\n", + " function get_band_obj(band_path, dos_fermi_energy)\n", + " {\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + "\n", + " //---------Read section_k_band_segment------------\n", + " var section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']\n", + "\n", + " //--------Get the number of k band segments-------------\n", + " var N_k_band_segments = section_k_band_segment.length;\n", + "\n", + "\n", + " //----------Get the total number of k points in all segments---------\n", + " var N_k_points_all = 0;\n", + " for(var i = 0; i < N_k_band_segments; i++)\n", + " N_k_points_all = N_k_points_all + section_k_band_segment[i]['band_k_points'].length;\n", + "\n", + "\n", + " //--------Get the x axis for the band structure figure: the coordinates of k points in 1D\n", + " // store in k_coor_1D[N_k_points_total]-----------------\n", + "\n", + " var band_distance_segments = [];\n", + " for(i = 0; i < N_k_band_segments; i++)\n", + " {\n", + " var x1, x2, y1, y2, z1, z2;\n", + " [[x1, y1, z1],[x2, y2, z2]]= section_k_band_segment[i]['band_segm_start_end']; //\"band_segm_start_end\": [[0.5, 0.0, 0.5],[0.5, 0.25, 0.75]],\n", + " band_distance_segments.push(Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) + Math.pow((z1-z2), 2));\n", + " }\n", + "\n", + "\n", + " var band_distance_total = band_distance_segments.reduce((x,y) => x+y); //sum of band_distance_segments\n", + "\n", + " var average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total;\n", + "\n", + " //Prepare the parameters to rescale the k coordinates into [0,1]\n", + " var step_k_point = 1.0 / N_k_points_all;\n", + " var step_k_point = (1.0 + step_k_point) / N_k_points_all;\n", + "\n", + " var k_coor_1D = [];\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points ++)\n", + " {\n", + " k_coor_1D.push(step_k_point * i_k_points)\n", + " }\n", + "\n", + "\n", + " //--------Get the eigenvalues of each band trajectory--------------\n", + " /*\n", + " N_k_points_per_segment = len(section_k_band_segment[0]['band_energies'][0]) #suppose the numebr of k points in all the segments are the same\n", + " N_bands = len(section_k_band_segment[0]['band_energies'][0][0])\n", + " band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues\n", + " N_k_points_all = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " band_energies = section_k_band_segment[i_segments]['band_energies']\n", + " N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized\n", + " N_k_points_per_segment = len(band_energies[0])\n", + " for i_k_points in range(N_k_points_per_segment):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))\n", + " N_k_points_all = N_k_points_all + 1\n", + " */\n", + " //var N_k_points_per_segment = section_k_band_segment[0]['band_energies'][0].length; //suppose the numebr of k points in all the segments are the same\n", + " var N_bands = section_k_band_segment[0]['band_energies'][0][0].length;\n", + " var band_energies_all = new Array(N_bands);\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " band_energies_all[i_bands] = new Array(N_k_points_all);// new Array(N_bands, N_k_points_all); //store the eigenvalues\n", + "\n", + " var i_k_points_all = 0;\n", + "\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var band_energies = section_k_band_segment[i_segments]['band_energies'];\n", + " var N_spin_channel = band_energies.length; //Number of the spin channel --FIXME: no spin polarized\n", + " var N_k_points_per_segment = band_energies[0].length;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_per_segment; i_k_points ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " band_energies_all[i_bands][i_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * Math.pow(10, -19)) - dos_fermi_energy;\n", + " }\n", + " i_k_points_all = i_k_points_all + 1 ;\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " var N_labels = 0\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " for(var j = 0; j < 2; j++)\n", + " //labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];\n", + " N_labels = N_labels + 1\n", + " }\n", + " var label_flag = [];//[\"\" for i in range(N_labels)] //stores the flags of the labels (X, W, G, etc)\n", + "\n", + "\n", + " var i_label = 0;\n", + " var label_flag_last_final = \"\";\n", + " var label_flag_current_initial = \"\";\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0].sort();\n", + " var labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1].sort();\n", + "\n", + " var label_flag_0 = get_label_flag(labels_coor_0);\n", + " var label_flag_1 = get_label_flag(labels_coor_1);\n", + "\n", + " var label_flag_current_initial = label_flag_0;\n", + " if(label_flag_last_final == \"\")\n", + " label_flag_last_final = label_flag_0;\n", + "\n", + " if(label_flag_last_final == label_flag_current_initial)\n", + " label_flag[i_label] = label_flag_current_initial;\n", + " else\n", + " label_flag[i_label] = label_flag_last_final + '|' + label_flag_current_initial;\n", + " label_flag_last_final = label_flag_1\n", + "\n", + "\n", + " i_label = i_label + 1;\n", + " if(i_segments == N_k_band_segments - 1)\n", + " {\n", + " label_flag[i_label] = label_flag_1;\n", + " i_label = i_label + 1;\n", + " }\n", + " }\n", + " N_labels = i_label;\n", + "\n", + " //------------Get the coordinates for the labels------------\n", + " //label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels\n", + " var label_coor_relative = [];//np.zeros((N_labels))\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " //Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates\n", + " //x = labels_coor_0[0]\n", + " //y = labels_coor_0[1]\n", + " //z = labels_coor_0[2]\n", + " //label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)\n", + " label_coor_relative.push(step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all));\n", + " }\n", + " //----Store the label-----------\n", + " var label_obj = [];//[['' for i in range(2)] for j in range(N_labels)]\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " label_obj.push([label_coor_relative[i_label], label_flag[i_label]]);\n", + " }\n", + "\n", + "\n", + " //-------Get VBM, CBM----------------\n", + "\n", + " var HOMO = -1000;\n", + " var LUMO = 1000;\n", + " var coor_k_point_HOMO = []; //the coordinate of k point that stores HOMO\n", + " var coor_k_point_LUMO = [];//np.zeros((3)) #the coordinate of k point that stores LUMO\n", + " //band_gap_direct = 0.0\n", + " var band_gap_indirect = 0.0;\n", + "\n", + "\n", + " //band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " //band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " var band_energy_max = 10;\n", + " var band_energy_min = -10;\n", + " //N_band_energy_index = 10000\n", + " //band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " //N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " //i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level\n", + "\n", + "\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " for(var i_k_points_all = 0; i_k_points_all< N_k_points_all; i_k_points_all ++)\n", + " {\n", + " //i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)\n", + " //N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if(band_energy > 0)\n", + " {\n", + " if(band_energy < LUMO)\n", + " LUMO = band_energy;\n", + " }\n", + " else\n", + " {\n", + " if(band_energy > HOMO)\n", + " HOMO = band_energy;\n", + " }\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + " //#for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO\n", + " // if(N_allowed_states[i_band_index] > 0):\n", + " // LUMO = band_energy_min + band_energy_step * i_band_index\n", + " //print('HOMO, LUMO: ',HOMO, LUMO)\n", + " band_gap_indirect = Math.abs(LUMO - HOMO);\n", + "\n", + " if(band_gap_indirect < 0.5) //VBM and CBM has to be found in another way for metals/charged system:\n", + " {\n", + " HOMO = -1000.0;\n", + " LUMO = 1000.0;\n", + " band_energy_max = 10.0;\n", + " band_energy_min = 0.0;\n", + " var N_band_energy_index = 10000;\n", + " var band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index;\n", + " var N_allowed_states = [];\n", + " for(var i_state = 0; i_state < N_band_energy_index+1; i_state++)\n", + " N_allowed_states.push(0);\n", + "\n", + "\n", + " //get the DOS and store in N_allowed_states[]\n", + " for(var i_k_points_all = 0; i_k_points_all < N_k_points_all; i_k_points_all ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if((band_energy_min < band_energy)&&(band_energy < band_energy_max))\n", + " {\n", + " var i_band_index = Math.floor((band_energy - band_energy_min) / band_energy_step);\n", + " N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1;\n", + " }\n", + " }\n", + " }\n", + "\n", + "\n", + " var if_gapped = 0;\n", + " for(var i_band_index = 0; i_band_index < N_band_energy_index; i_band_index ++)//go through the energy levels from the bottom\n", + " {\n", + " var band_energy = band_energy_min + band_energy_step * i_band_index\n", + " if(N_allowed_states[i_band_index] == 0)\n", + " if_gapped = if_gapped + 1;\n", + " if((band_energy > band_energy_max - 0.5) && (if_gapped == 0))\n", + " {\n", + " //alert(\"No gap found in this system. It seems to be a metal.\");\n", + " HOMO = 1000;\n", + " LUMO = 1000;\n", + " break;\n", + " }\n", + " //print(\"At \", band_energy,\": # allowed states = \", N_allowed_states[i_band_index],\" if_gapped = \", if_gapped)\n", + "\n", + " if(N_allowed_states[i_band_index] > 0)\n", + " {\n", + " if(if_gapped * band_energy_step > 0.3 )//above VBM-CBM gap: LUMO\n", + " {\n", + " if(band_energy < LUMO)\n", + " {\n", + " //print(\"LUMO got!\")\n", + " LUMO = band_energy;\n", + " break; //break before touching another gap that is above the band gap\n", + " }\n", + " }\n", + "\n", + " if(if_gapped * band_energy_step < 0.3) //below VBM-CBM gap: HOMO\n", + " {\n", + " if(band_energy > HOMO)\n", + " {\n", + " //print(\"HOMO got!\")\n", + " HOMO = band_energy;\n", + " }\n", + " } \n", + " if_gapped = 0;\n", + " }\n", + " }\n", + " //alert('HOMO, LUMO for metal/charged system: '+ HOMO +\",\"+LUMO)\n", + "\n", + " }\n", + "\n", + "\n", + "\n", + "\n", + " //Find the position of HOMO, LUMO\n", + " var coor_k_point_HOMO = 0, coor_k_point_LUMO = 0;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001)\n", + " coor_k_point_HOMO = k_coor_1D[i_k_points];\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001)\n", + " coor_k_point_LUMO = k_coor_1D[i_k_points]; \n", + " }\n", + " }\n", + "\n", + " //alert(coor_k_point_HOMO +\",\" + coor_k_point_LUMO);\n", + "\n", + "\n", + " //Store the band data to band_obj\n", + "\n", + " var band_obj = {};\n", + " band_obj[\"band_x_axis\"] = k_coor_1D;\n", + " band_obj[\"band_y_axis\"] = band_energies_all\n", + " band_obj[\"labels\"] = label_obj;\n", + " band_obj[\"HOMO_energy\"] = HOMO;\n", + " band_obj[\"HOMO_coor\"] = coor_k_point_HOMO;\n", + " band_obj[\"LUMO_energy\"] = LUMO;\n", + " band_obj[\"LUMO_coor\"] = coor_k_point_LUMO;\n", + " band_obj[\"average_N_k_points_per_inverse_distance\"] = average_N_k_points_per_inverse_distance;\n", + "\n", + "\n", + " return band_obj\n", + "\n", + " }\n", + "\n", + "\n", + " function get_dos_obj(dos_path)\n", + " {\n", + "\n", + " var dos_data = JSON.parse(getJSON(dos_path));\n", + "\n", + " var N_dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'].length;\n", + "\n", + " //in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]\n", + "\n", + " //dos_energies = new Array(N_dos_values).fill(0.0);\n", + " //dos_energies_tmp = new Array(N_dos_values).fill(0.0) #tmp array for unit convertion\n", + " //dos_values = new Array(N_dos_values).fill(0.0)\n", + "\n", + " var dos_energies = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'];\n", + " var dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_integrated_values'];//[0]\n", + "\n", + " //To do: check if every section_dos has 'dos_fermi_energy'\n", + " var dos_fermi_energy = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_fermi_energy'];\n", + " dos_fermi_energy = dos_fermi_energy / (1.60217656535 * Math.pow(10,-19));\n", + " \n", + " for(var i = 0; i < N_dos_values; i++)\n", + " {\n", + " dos_energies[i] = dos_energies[i] / (1.60217656535 * Math.pow(10,-19)) - dos_fermi_energy;\n", + " }\n", + " \n", + " dos_obj = {}\n", + " dos_obj[\"dos_x_axis\"] = dos_energies;\n", + " dos_obj[\"dos_y_axis\"] = dos_values;\n", + " dos_obj[\"dos_fermi_energy\"] = dos_fermi_energy;\n", + " return dos_obj\n", + " }\n", + " function get_info_obj(band_path)\n", + " {\n", + "\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + " var info_obj = {};\n", + " //---------Read the information of the calculation--------\n", + " info_obj[\"program_name\"] = band_data[\"section_run\"][\"program_name\"];\n", + " info_obj[\"program_basis_set_type\"] = band_data[\"section_run\"][\"program_basis_set_type\"];\n", + " info_obj[\"atom_labels\"] = band_data[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " info_obj[\"XC_functional_name\"] = band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \" + \"+ band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"];\n", + "\n", + " //----------Get the space group information----------\n", + " /*\n", + " [space_group_symbol, lattice_constant] = get_space_group(band_data);\n", + " info_obj[\"space_group_symbol\"] = np.array(space_group_symbol).tolist();\n", + " info_obj[\"lattice_constant\"] = np.array(lattice_constant).tolist();\n", + " */\n", + "\n", + " return info_obj\n", + " }\n", + " function process_band_dos_data()\n", + " {\n", + " info_all = [];\n", + " band_obj_all = [];\n", + " dos_obj_all = [];\n", + "\n", + " for(var i = 0; i < N_materials; i++)\n", + " {\n", + " var band_path = band_paths[i];\n", + " var dos_path = dos_paths[i];\n", + "\n", + "\n", + " var dos_obj = get_dos_obj(dos_path);\n", + " var dos_fermi_energy = dos_obj[\"dos_fermi_energy\"];\n", + " band_obj = get_band_obj(band_path, dos_fermi_energy);\n", + " var info_obj = get_info_obj(band_path);\n", + "\n", + " band_obj_all.push(band_obj);\n", + " dos_obj_all.push(dos_obj);\n", + " info_obj_all.push(info_obj);\n", + " }\n", + " }\n", + " process_band_dos_data();\n", + " //alert(\"process_band_dos_data: info_obj_all: \"+JSON.stringify(info_obj_all));\n", + "</script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " //alert(\"process_band_dos_data: \" +band_paths)\n", + " //alert(\"process_band_dos_data: \" +info_obj_all)\n", + " function get_label_flag(coor_array)\n", + " {\n", + " var coor = coor_array.sort().join();\n", + " if(coor == '0,0.5,0.5')\n", + " return \"X\";\n", + " if(coor == '0,0,0.5')\n", + " return \"M\";\n", + " else if(coor == '0.5,0.5,0.5')\n", + " return \"L\";\n", + " else if(coor == '0.375,0.375,0.75')\n", + " return \"K\";\n", + " else if(coor == '0.25,0.5,0.75')\n", + " return \"W\";\n", + " else if(coor == '0,0,0')\n", + " return \"\\u0393\";\n", + " else if(coor == '0.25,0.625,0.625')\n", + " return \"U\";\n", + " else\n", + " {\n", + " //alert(\"k label not found: \" + coor);\n", + " return \"?\";\n", + " }\n", + " }\n", + "\n", + "\n", + " //============Process the band structure data============\n", + " function get_band_obj(band_path, dos_fermi_energy)\n", + " {\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + "\n", + " //---------Read section_k_band_segment------------\n", + " var section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']\n", + "\n", + " //--------Get the number of k band segments-------------\n", + " var N_k_band_segments = section_k_band_segment.length;\n", + "\n", + "\n", + " //----------Get the total number of k points in all segments---------\n", + " var N_k_points_all = 0;\n", + " for(var i = 0; i < N_k_band_segments; i++)\n", + " N_k_points_all = N_k_points_all + section_k_band_segment[i]['band_k_points'].length;\n", + "\n", + "\n", + " //--------Get the x axis for the band structure figure: the coordinates of k points in 1D\n", + " // store in k_coor_1D[N_k_points_total]-----------------\n", + "\n", + " var band_distance_segments = [];\n", + " for(i = 0; i < N_k_band_segments; i++)\n", + " {\n", + " var x1, x2, y1, y2, z1, z2;\n", + " [[x1, y1, z1],[x2, y2, z2]]= section_k_band_segment[i]['band_segm_start_end']; //\"band_segm_start_end\": [[0.5, 0.0, 0.5],[0.5, 0.25, 0.75]],\n", + " band_distance_segments.push(Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) + Math.pow((z1-z2), 2));\n", + " }\n", + "\n", + "\n", + " var band_distance_total = band_distance_segments.reduce((x,y) => x+y); //sum of band_distance_segments\n", + "\n", + " var average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total;\n", + "\n", + " //Prepare the parameters to rescale the k coordinates into [0,1]\n", + " var step_k_point = 1.0 / N_k_points_all;\n", + " var step_k_point = (1.0 + step_k_point) / N_k_points_all;\n", + "\n", + " var k_coor_1D = [];\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points ++)\n", + " {\n", + " k_coor_1D.push(step_k_point * i_k_points)\n", + " }\n", + "\n", + "\n", + " //--------Get the eigenvalues of each band trajectory--------------\n", + " /*\n", + " N_k_points_per_segment = len(section_k_band_segment[0]['band_energies'][0]) #suppose the numebr of k points in all the segments are the same\n", + " N_bands = len(section_k_band_segment[0]['band_energies'][0][0])\n", + " band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues\n", + " N_k_points_all = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " band_energies = section_k_band_segment[i_segments]['band_energies']\n", + " N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized\n", + " N_k_points_per_segment = len(band_energies[0])\n", + " for i_k_points in range(N_k_points_per_segment):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))\n", + " N_k_points_all = N_k_points_all + 1\n", + " */\n", + " //var N_k_points_per_segment = section_k_band_segment[0]['band_energies'][0].length; //suppose the numebr of k points in all the segments are the same\n", + " var N_bands = section_k_band_segment[0]['band_energies'][0][0].length;\n", + " var band_energies_all = new Array(N_bands);\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " band_energies_all[i_bands] = new Array(N_k_points_all);// new Array(N_bands, N_k_points_all); //store the eigenvalues\n", + "\n", + " var i_k_points_all = 0;\n", + "\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var band_energies = section_k_band_segment[i_segments]['band_energies'];\n", + " var N_spin_channel = band_energies.length; //Number of the spin channel --FIXME: no spin polarized\n", + " var N_k_points_per_segment = band_energies[0].length;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_per_segment; i_k_points ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " band_energies_all[i_bands][i_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * Math.pow(10, -19)) - dos_fermi_energy;\n", + " }\n", + " i_k_points_all = i_k_points_all + 1 ;\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " var N_labels = 0\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " for(var j = 0; j < 2; j++)\n", + " //labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];\n", + " N_labels = N_labels + 1\n", + " }\n", + " var label_flag = [];//[\"\" for i in range(N_labels)] //stores the flags of the labels (X, W, G, etc)\n", + "\n", + "\n", + " var i_label = 0;\n", + " var label_flag_last_final = \"\";\n", + " var label_flag_current_initial = \"\";\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0].sort();\n", + " var labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1].sort();\n", + "\n", + " var label_flag_0 = get_label_flag(labels_coor_0);\n", + " var label_flag_1 = get_label_flag(labels_coor_1);\n", + "\n", + " var label_flag_current_initial = label_flag_0;\n", + " if(label_flag_last_final == \"\")\n", + " label_flag_last_final = label_flag_0;\n", + "\n", + " if(label_flag_last_final == label_flag_current_initial)\n", + " label_flag[i_label] = label_flag_current_initial;\n", + " else\n", + " label_flag[i_label] = label_flag_last_final + '|' + label_flag_current_initial;\n", + " label_flag_last_final = label_flag_1\n", + "\n", + "\n", + " i_label = i_label + 1;\n", + " if(i_segments == N_k_band_segments - 1)\n", + " {\n", + " label_flag[i_label] = label_flag_1;\n", + " i_label = i_label + 1;\n", + " }\n", + " }\n", + " N_labels = i_label;\n", + "\n", + " //------------Get the coordinates for the labels------------\n", + " //label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels\n", + " var label_coor_relative = [];//np.zeros((N_labels))\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " //Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates\n", + " //x = labels_coor_0[0]\n", + " //y = labels_coor_0[1]\n", + " //z = labels_coor_0[2]\n", + " //label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)\n", + " label_coor_relative.push(step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all));\n", + " }\n", + " //----Store the label-----------\n", + " var label_obj = [];//[['' for i in range(2)] for j in range(N_labels)]\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " label_obj.push([label_coor_relative[i_label], label_flag[i_label]]);\n", + " }\n", + "\n", + "\n", + " //-------Get VBM, CBM----------------\n", + "\n", + " var HOMO = -1000;\n", + " var LUMO = 1000;\n", + " var coor_k_point_HOMO = []; //the coordinate of k point that stores HOMO\n", + " var coor_k_point_LUMO = [];//np.zeros((3)) #the coordinate of k point that stores LUMO\n", + " //band_gap_direct = 0.0\n", + " var band_gap_indirect = 0.0;\n", + "\n", + "\n", + " //band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " //band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " var band_energy_max = 10;\n", + " var band_energy_min = -10;\n", + " //N_band_energy_index = 10000\n", + " //band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " //N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " //i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level\n", + "\n", + "\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " for(var i_k_points_all = 0; i_k_points_all< N_k_points_all; i_k_points_all ++)\n", + " {\n", + " //i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)\n", + " //N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if(band_energy > 0)\n", + " {\n", + " if(band_energy < LUMO)\n", + " LUMO = band_energy;\n", + " }\n", + " else\n", + " {\n", + " if(band_energy > HOMO)\n", + " HOMO = band_energy;\n", + " }\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + " //#for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO\n", + " // if(N_allowed_states[i_band_index] > 0):\n", + " // LUMO = band_energy_min + band_energy_step * i_band_index\n", + " //print('HOMO, LUMO: ',HOMO, LUMO)\n", + " band_gap_indirect = Math.abs(LUMO - HOMO);\n", + "\n", + " if(band_gap_indirect < 0.5) //VBM and CBM has to be found in another way for metals/charged system:\n", + " {\n", + " HOMO = -1000.0;\n", + " LUMO = 1000.0;\n", + " band_energy_max = 10.0;\n", + " band_energy_min = 0.0;\n", + " var N_band_energy_index = 10000;\n", + " var band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index;\n", + " var N_allowed_states = [];\n", + " for(var i_state = 0; i_state < N_band_energy_index+1; i_state++)\n", + " N_allowed_states.push(0);\n", + "\n", + "\n", + " //get the DOS and store in N_allowed_states[]\n", + " for(var i_k_points_all = 0; i_k_points_all < N_k_points_all; i_k_points_all ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if((band_energy_min < band_energy)&&(band_energy < band_energy_max))\n", + " {\n", + " var i_band_index = Math.floor((band_energy - band_energy_min) / band_energy_step);\n", + " N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1;\n", + " }\n", + " }\n", + " }\n", + "\n", + "\n", + " var if_gapped = 0;\n", + " for(var i_band_index = 0; i_band_index < N_band_energy_index; i_band_index ++)//go through the energy levels from the bottom\n", + " {\n", + " var band_energy = band_energy_min + band_energy_step * i_band_index\n", + " if(N_allowed_states[i_band_index] == 0)\n", + " if_gapped = if_gapped + 1;\n", + " if((band_energy > band_energy_max - 0.5) && (if_gapped == 0))\n", + " {\n", + " //alert(\"No gap found in this system. It seems to be a metal.\");\n", + " HOMO = 1000;\n", + " LUMO = 1000;\n", + " break;\n", + " }\n", + " //print(\"At \", band_energy,\": # allowed states = \", N_allowed_states[i_band_index],\" if_gapped = \", if_gapped)\n", + "\n", + " if(N_allowed_states[i_band_index] > 0)\n", + " {\n", + " if(if_gapped * band_energy_step > 0.3 )//above VBM-CBM gap: LUMO\n", + " {\n", + " if(band_energy < LUMO)\n", + " {\n", + " //print(\"LUMO got!\")\n", + " LUMO = band_energy;\n", + " break; //break before touching another gap that is above the band gap\n", + " }\n", + " }\n", + "\n", + " if(if_gapped * band_energy_step < 0.3) //below VBM-CBM gap: HOMO\n", + " {\n", + " if(band_energy > HOMO)\n", + " {\n", + " //print(\"HOMO got!\")\n", + " HOMO = band_energy;\n", + " }\n", + " } \n", + " if_gapped = 0;\n", + " }\n", + " }\n", + " //alert('HOMO, LUMO for metal/charged system: '+ HOMO +\",\"+LUMO)\n", + "\n", + " }\n", + "\n", + "\n", + "\n", + "\n", + " //Find the position of HOMO, LUMO\n", + " var coor_k_point_HOMO = 0, coor_k_point_LUMO = 0;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001)\n", + " coor_k_point_HOMO = k_coor_1D[i_k_points];\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001)\n", + " coor_k_point_LUMO = k_coor_1D[i_k_points]; \n", + " }\n", + " }\n", + "\n", + " //alert(coor_k_point_HOMO +\",\" + coor_k_point_LUMO);\n", + "\n", + "\n", + " //Store the band data to band_obj\n", + "\n", + " var band_obj = {};\n", + " band_obj[\"band_x_axis\"] = k_coor_1D;\n", + " band_obj[\"band_y_axis\"] = band_energies_all\n", + " band_obj[\"labels\"] = label_obj;\n", + " band_obj[\"HOMO_energy\"] = HOMO;\n", + " band_obj[\"HOMO_coor\"] = coor_k_point_HOMO;\n", + " band_obj[\"LUMO_energy\"] = LUMO;\n", + " band_obj[\"LUMO_coor\"] = coor_k_point_LUMO;\n", + " band_obj[\"average_N_k_points_per_inverse_distance\"] = average_N_k_points_per_inverse_distance;\n", + "\n", + "\n", + " return band_obj\n", + "\n", + " }\n", + "\n", + "\n", + " function get_dos_obj(dos_path)\n", + " {\n", + "\n", + " var dos_data = JSON.parse(getJSON(dos_path));\n", + "\n", + " var N_dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'].length;\n", + "\n", + " //in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]\n", + "\n", + " //dos_energies = new Array(N_dos_values).fill(0.0);\n", + " //dos_energies_tmp = new Array(N_dos_values).fill(0.0) #tmp array for unit convertion\n", + " //dos_values = new Array(N_dos_values).fill(0.0)\n", + "\n", + " var dos_energies = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'];\n", + " var dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_integrated_values'];//[0]\n", + "\n", + " //To do: check if every section_dos has 'dos_fermi_energy'\n", + " var dos_fermi_energy = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_fermi_energy'];\n", + " dos_fermi_energy = dos_fermi_energy / (1.60217656535 * Math.pow(10,-19));\n", + " \n", + " for(var i = 0; i < N_dos_values; i++)\n", + " {\n", + " dos_energies[i] = dos_energies[i] / (1.60217656535 * Math.pow(10,-19)) - dos_fermi_energy;\n", + " }\n", + " \n", + " dos_obj = {}\n", + " dos_obj[\"dos_x_axis\"] = dos_energies;\n", + " dos_obj[\"dos_y_axis\"] = dos_values;\n", + " dos_obj[\"dos_fermi_energy\"] = dos_fermi_energy;\n", + " return dos_obj\n", + " }\n", + " function get_info_obj(band_path)\n", + " {\n", + "\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + " var info_obj = {};\n", + " //---------Read the information of the calculation--------\n", + " info_obj[\"program_name\"] = band_data[\"section_run\"][\"program_name\"];\n", + " info_obj[\"program_basis_set_type\"] = band_data[\"section_run\"][\"program_basis_set_type\"];\n", + " info_obj[\"atom_labels\"] = band_data[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " info_obj[\"XC_functional_name\"] = band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \" + \"+ band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"];\n", + "\n", + " //----------Get the space group information----------\n", + " /*\n", + " [space_group_symbol, lattice_constant] = get_space_group(band_data);\n", + " info_obj[\"space_group_symbol\"] = np.array(space_group_symbol).tolist();\n", + " info_obj[\"lattice_constant\"] = np.array(lattice_constant).tolist();\n", + " */\n", + "\n", + " return info_obj\n", + " }\n", + " function process_band_dos_data()\n", + " {\n", + " info_all = [];\n", + " band_obj_all = [];\n", + " dos_obj_all = [];\n", + "\n", + " for(var i = 0; i < N_materials; i++)\n", + " {\n", + " var band_path = band_paths[i];\n", + " var dos_path = dos_paths[i];\n", + "\n", + "\n", + " var dos_obj = get_dos_obj(dos_path);\n", + " var dos_fermi_energy = dos_obj[\"dos_fermi_energy\"];\n", + " band_obj = get_band_obj(band_path, dos_fermi_energy);\n", + " var info_obj = get_info_obj(band_path);\n", + "\n", + " band_obj_all.push(band_obj);\n", + " dos_obj_all.push(dos_obj);\n", + " info_obj_all.push(info_obj);\n", + " }\n", + " }\n", + " process_band_dos_data();\n", + " //alert(\"process_band_dos_data: info_obj_all: \"+JSON.stringify(info_obj_all));\n", + "</script>" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "scrolled": false, + "tags": [ + "show_results_and_plot" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + " function show_materials_submitted_info()\n", + " {\n", + " //alert(\"N_materials=\" + N_materials)\n", + " //\"table_materials_submitted_info\"\n", + " //alert(\"show_materials_submitted_info: info_obj_all: \"+JSON.stringify(info_obj_all))\n", + " var table_content = new Array(); \n", + " str = '<tr>';\n", + " str += '<th width=\"5%\"></th>'\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Atom labels</b></font></p></th>';\n", + " //str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Space group</b></font></p></th>';\n", + " //str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Lattice constants (in Ang)</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Program name</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Basis set type</b></font></p></th>';\n", + " str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Functional</b></font></p></th>';\n", + " //str += '<th width=\"20%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Number of <i>k</i> points per inverse distance</b></font></p></th>';\n", + " str += '</tr>'; //first row: head\n", + " table_content.push(str);\n", + "\n", + " for(var i = 0; i < N_materials; i++) //add info of each material\n", + " {\n", + " //alert(\"show_materials_submitted_info: material \"+ i); \n", + " table_content.push('<tr>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<input type = \\\"checkbox\\\" name = \"checkbox_material\" id = \\\"checkbox_material' + i.toString() + '\\\" unchecked onclick=\\\"checkbox_material(this.id)\\\">';\n", + " str += \"<b>  #\" + (i+1).toString() + \"</b>\";\n", + " table_content.push(str);\n", + " table_content.push('</td>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"atom_labels\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got atom_labels\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"space_group_symbol\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got space_group_symbol\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"lattice_constant\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got lattice_constant\");\n", + " */\n", + " \n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_name\"].toUpperCase() + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_name\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_basis_set_type\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_basis_set_type\");\n", + "\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"XC_functional_name\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got XC_functional_name\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got average_N_k_points_per_inverse_distance\");\n", + " */\n", + " table_content.push('</tr>');\n", + "\n", + " }\n", + " \n", + " document.getElementById(\"table_materials_submitted_info\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + " function clean_materials_selection()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " }\n", + " }\n", + "\n", + " function select_all()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"checked\";\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " function process()\n", + " {\n", + " //alert(\"Process:\"+band_paths)\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_js_plot'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_materials_submitted_info'));\n", + " show_materials_submitted_info();\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " str = N_materials.toString();\n", + " document.getElementById(\"n_materials\").innerHTML = \"Number of materials submitted: \" + str + \"<font size = 1px color = #C0C0C0 >   Please press \\'Visualize\\' to visualize the band structure. </font>\";\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " }\n", + " \n", + "\n", + " var image_band = '';\n", + " var image_dos = '';\n", + " var image_band_links = new Array(N_materials); //store the URL of each band figure -> used to compare 2 figures\n", + " var image_band_links_selected = [];\n", + " var image_band_selected_Number = []; //record which i_material has been selected\n", + "\n", + "\n", + "\n", + " function prepare(N_materials_show)\n", + " {\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " var table_content = new Array(); \n", + " //document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " //-----Generate the html tables for each material--------\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " table_content.push('<tr>');\n", + " div_string = '<div style = \\\"height: 20px\\\"></div>';\n", + " table_content.push(div_string);\n", + " table_content.push('<th>');\n", + "\n", + " //add main container div\n", + " div_string = '<div id = \\\"div_band_dos' + i.toString() + '\\\" class = \\\"div_band_dos\\\" >';\n", + " table_content.push(div_string);\n", + "\n", + " //show No. of the material\n", + " i_material = i + 1;\n", + " div_string = '<div style = \\\"height:30px\\; font-size: 15pt;\">' + '#' + i_material.toString() + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //show band_path/dos info\n", + " div_string = '<div style = \\\"height:30px\\\">' + 'Band:   ' + band_paths[i] + ',    DOS:   ' + dos_paths[i] + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_band\n", + " div_string = '<div id = \\\"div_band' + i.toString() + '\\\" class = \\\"div_band\\\" ></div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_dos\n", + " div_string = '<div id = \\\"div_dos' + i.toString() + '\\\" class = \\\"div_dos\\\" ></div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add div_tools\n", + " div_string = '<div id = \\\"div_tools' + i.toString() + '\\\" class = \\\"div_tools\\\" >'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: infomation\n", + " div_string = '<div id = \\\"div_info' + i.toString() + '\\\">atom_labels<br>program_name</div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: custom scale\n", + " div_string = '<br><p style=\\\"color: #000;font-weight: 100; font-size: 10pt; align:left\\\"> Set the lower and upper limit of energy scale (in eV): <br><br><font color=\\\"black\\\" size = 3px> Lower limit:    </font><textarea id=\\\"lowerlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">-10</textarea> <font color=\\\"black\\\" size = 3px>   eV</font>    <font color=\\\"black\\\" size = 3px> Upper limit:    </font><textarea id=\\\"upperlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">10</textarea> <font color=\\\"black\\\" size = 3px>   eV   </font></p>';\n", + " table_content.push(div_string);\n", + " div_string = '<br><button class = \\\"button_tools\\\" id = \\\"button_customscale' + i.toString() + '\\\" onclick = \\\"customscale(this.id)\\\"> Rescale </button>'; \n", + " table_content.push(div_string);\n", + "\n", + "\n", + " //add button:autoscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_autoscale' + i.toString() + '\\\" onclick = \\\"autoscale(this.id)\\\" title = \\\"(-10 eV, 10 eV)\\\"> Autoscale </button>'; \n", + " table_content.push(div_string);\n", + " //add button:fullscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_fullscale' + i.toString() + '\\\" onclick = \\\"fullscale(this.id)\\\" title = \\\"(-100 eV, 100 eV)\\\"> Full scale </button><br><br>'; \n", + " table_content.push(div_string);\n", + "\n", + " //table_content.push(\"Select and zoom:\");\n", + "\n", + " /*//overview for select and zoom\n", + " div_string = '<div id = \\\"div_overview' + i.toString() + '\\\" class = \\\"div_overview\\\" ></div>'; // <div id=\"overview\" style=\"width:300px;height:200px; margin-left:10px; margin-top: 50px; padding-top: 0px\"></div>\n", + " table_content.push(div_string);\n", + " div_string = '<p id = \\\"overviewLegend' + i.toString() + '\\\" ></p>'; // <p id=\"overviewLegend\" style=\"margin-left:10px\"></p>\n", + " table_content.push(div_string);*/\n", + "\n", + " //download figures as png\n", + " div_string = '<a id = \\\"img_band' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download band </a>';\n", + " table_content.push(div_string); \n", + " div_string = '<a id = \\\"img_dos' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download DOS </a>';\n", + " table_content.push(div_string);\n", + "\n", + " //add show VBM & CBM\n", + " div_string = '<br><br><p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_VBM' + i.toString() + '\\\" unchecked onclick=\\\"show_VBM(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Show VBM </font> (<font color=\\\"blue\\\">\\•</font>) <font color=\\\"black\\\" size = 3px> and CBM </font>(<font color=\\\"red\\\">\\•</font>) </p>';\n", + " table_content.push(div_string);\n", + "\n", + "\n", + " table_content.push('</div>');//div_tools\n", + "\n", + " //checkbox for comparison\n", + " div_string = '<div id = \\\"div_checkbox_compare' + i.toString() + '\\\" class = \\\"div_checkbox_compare\\\" >';\n", + " table_content.push(div_string);\n", + " //div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" checked = \\\"unchecked\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " table_content.push(div_string);\n", + " table_content.push('</div>');//div_checkbox_compare\n", + "\n", + "\n", + " table_content.push('</div>');//div_band_dos\n", + " table_content.push('</th>');\n", + " table_content.push('</tr>'); \n", + " }\n", + "\n", + " document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + "\n", + " function visualize_band_dos()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_jquery'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_axislabels'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_dashes'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_navigate'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_selection'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_flot_legendoncanvas'));\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " document.getElementById(\"div_compare_buttons\").style.visibility=\"\";\n", + "\n", + "\n", + "\n", + " if(N_materials > N_max_show)\n", + " {\n", + " document.getElementById(\"div_showall\").style.visibility=\"visible\";\n", + " document.getElementById(\"checkbox_showall\").checked = \"\";\n", + " } \n", + "\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + "\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + "\n", + " }\n", + "\n", + " function show_all(id)//\"plot_placeholder\"\n", + " {\n", + " var if_showall=0;\n", + " if_showall = check_show_VBM(id);\n", + " if(if_showall == 1)\n", + " {\n", + " N_materials_show = N_materials;\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + " else\n", + " {\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + "\n", + " }\n", + "\n", + " \n", + " //------------------Tool used to get the content from textarea---------------------\n", + " function get_text(textarea_id)\n", + " {\n", + " var text = document.getElementById(textarea_id).value;\n", + " return text;\n", + " }\n", + "\n", + "\n", + "\n", + " //-------------------Compare 2 band figures----------------------------------------\n", + "\n", + "\n", + " function check_compare(id)//checkbox_compare' + i.toString() + '\\\" unchecked onclick=\\\"check_compare(this.id)\n", + " {\n", + " var x = document.getElementById(id);\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " N_chosen ++;\n", + " }\n", + " }\n", + " if(N_chosen == 2) // In max. only 2 figures could be selected and compared.\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(!choices_compare[i].checked)\n", + " {\n", + " choices_compare[i].disabled = 'disabled';\n", + " }\n", + " }\n", + " }\n", + " else\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " }\n", + "\n", + " function compare()\n", + " {\n", + " $(\"#div_compare\").fadeIn(600);//show div for comparison\n", + " //check_compare(-100);\n", + "\n", + " var compare_list = [];\n", + " compare_list = make_compare_list();\n", + " //[i_material_1, i_material_2] = make_compare_list();\n", + " i_material_1 = compare_list[0];\n", + " i_material_2 = compare_list[1];\n", + " //document.getElementById(\"demo\").innerHTML = \"In add info compare:\" + i_material_1.toString() + i_material_2.toString();\n", + " compare_figures(i_material_1, i_material_2); \n", + " }\n", + " function make_compare_list()\n", + " {\n", + " //get the links to the images\n", + " images_selected_links = []; //store the links to the figures for comparison\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " var str = ''; //tmp str for debug\n", + " var figure_selected = new Array(2);\n", + " for(var i=0; i<choices_compare.length; i++) //check which figures are selected\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " id_chosen = choices_compare[i].id;\n", + " i_chosen = Math.round(id_chosen.substring(16));\n", + " var tmp_str = image_band_links[i_chosen];\n", + " images_selected_links.push(tmp_str);\n", + " figure_selected[N_chosen] = i_chosen;\n", + " N_chosen ++;\n", + " //str += beakerx.image_band_links[i];\n", + " }\n", + " }\n", + " var i_material_1 = 0;\n", + " var i_material_2 = 0;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list';\n", + " image_band_links_selected = images_selected_links;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list: next';\n", + " if(N_chosen == 2)\n", + " {\n", + " i_material_1 = figure_selected[0];\n", + " i_material_2 = figure_selected[1];\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Compare_list: ' +i_material_1.toString() + ' ' + i_material_2.toString();\n", + "\n", + " return [i_material_1, i_material_2];\n", + " }\n", + "\n", + " function check_compare_scale(i_material_1, i_material_2)\n", + " {\n", + " lowerlimit_id_1 = \"lowerlimit\" + i_material_1.toString();\n", + " lowerlimit_id_2 = \"lowerlimit\" + i_material_2.toString();\n", + " upperlimit_id_1 = \"upperlimit\" + i_material_1.toString();\n", + " upperlimit_id_2 = \"upperlimit\" + i_material_2.toString();\n", + "\n", + " lowerlimit_1 = parseFloat(document.getElementById(lowerlimit_id_1).innerHTML);\n", + " lowerlimit_2 = parseFloat(document.getElementById(lowerlimit_id_2).innerHTML);\n", + " upperlimit_1 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " upperlimit_2 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " if((lowerlimit_1 != lowerlimit_2) || (upperlimit_1 != upperlimit_2))\n", + " return -1;\n", + " else\n", + " return 1;\n", + " }\n", + "\n", + " function compare_figures(i_material_1, i_material_2)\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_query_beforeafter'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_compare_slide'));\n", + " add_info_compare(i_material_1, i_material_2);\n", + " document.getElementById(\"div_compare_container\").scrollIntoView({ behavior: 'smooth' }); \n", + " document.getElementById(\"div_compare_container\").scrollTop += 50;\n", + "\n", + " }\n", + "\n", + "\n", + " function clean_compare_list()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " //-----------Add information about the calculation to \"div_tools\"---------------\n", + " function add_info(i)\n", + " {\n", + " \n", + " //document.getElementById(\"demoa\").innerHTML = i.toString() + div_info_id;\n", + " //for(var i = 0; i < beakerx.N_materials; i++)\n", + " //{\n", + " div_info_id = \"div_info\" + i.toString();\n", + "\n", + " var str = '';\n", + " str += \"<br> <p style=\\\"text-align:left\\\"><font size = 3pt><b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"] + '</font></p>';\n", + " //str += \"<font size = 3pt><b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"] + '</font>';\n", + " //str += \"<font size = 3pt><b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"] + '</font>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase() + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3) + '</font></p>';\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " //document.getElementById('program_name_1').innerHTML = \"<b>Code:</b>    \" + origData[\"program_name\"];\n", + " //document.getElementById('program_basis_set_type_1').innerHTML = \"<b>Basis set type:</b>    \" + origData[\"program_basis_set_type\"];\n", + " //document.getElementById('XC_functional_name_1').innerHTML = \"<b>Functional:</b>    \" + origData[\"XC_functional_name\"]; \n", + " //}\n", + " \n", + " }\n", + " function add_info_compare(i,j)\n", + " {\n", + "\n", + " div_info_id = \"div_compare_info\";\n", + " var str = '';\n", + "\n", + " if_same_scale = check_compare_scale(i_material_1, i_material_2);\n", + " if(if_same_scale == -1)\n", + " {\n", + " str = '<b><font size = \"15pt\" color=\"#940000\">Error: Different lower/upper limits.</font></b><br>';\n", + " document.getElementById(\"div_compare_container\").innerHTML = str;\n", + " document.getElementById(div_info_id).innerHTML = '';\n", + " return;\n", + " }\n", + "\n", + " str += \"<br><b><font-size:15pt>Information of the first calculation (left):</font></b> <br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"];\n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"<br><br><br><b><font-size:15pt>Information of the second calculation (right):</font></b><br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[j][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[j][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[j][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[j][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[j][\"program_basis_set_type\"]; \n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[j][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " }\n", + "\n", + "\n", + "\n", + " //-----------------------Show/hide VBM, CBM-------------------------\n", + " function check_show_VBM(checkbox_VBM_id)\n", + " {\n", + " var x = document.getElementById(checkbox_VBM_id);\n", + " var if_checked = 0;\n", + " if(x.checked)//== \"checked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"checked!\";\n", + " if_checked = 1;\n", + " }\n", + " else if (x.unchecked)// == \"unchecked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"unchecked!\";\n", + " if_checked = -1;\n", + " }\n", + " else\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"nothing detected!\";\n", + " }\n", + " return if_checked;\n", + " }\n", + "\n", + " function check_if_in_compare_list(i) // check if the current material i is to be compared\n", + " {\n", + "\n", + " var checkbox_compare_id = \"checkbox_compare\" + i.toString();\n", + " var if_compare = check_show_VBM(checkbox_compare_id);\n", + " //document.getElementById(\"demo\").innerHTML = 'if_compare of ' + i.toString() + ' : ' + if_compare.toString();\n", + " var i_compare_material_1, i_compare_material_2;\n", + " [i_compare_material_1, i_compare_material_2] = make_compare_list();\n", + " var i_in_compare_list = -1;\n", + " if(i_compare_material_1 == i)\n", + " {\n", + " i_in_compare_list = 1;\n", + " }\n", + " else if (i_compare_material_2 == i)\n", + " {\n", + " i_in_compare_list = 2;\n", + " }\n", + " else\n", + " {\n", + " i_in_compare_list = 0;\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Checking ' + i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + " return [if_compare, i_in_compare_list];\n", + " }\n", + "\n", + " function show_VBM(id)\n", + " {\n", + " //prepare(\"new\");\n", + " //var if_show_VBM = -1;\n", + " var len_id = id.length;\n", + " var i_material = id.substring(12);\n", + " var i = Math.round(i_material);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + " //document.getElementById(\"demo\").innerHTML = i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + "\n", + " //---------------------Functions to rescale-------------------------------------------\n", + " function autoscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"10.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-10.0\";\n", + "\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function fullscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"100.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-100.0\";\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, -100, 100, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function customscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(18);\n", + " var i = Math.round(i_material);\n", + " //\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " upperlim = document.getElementById(upperlim_id).value;\n", + " upperlim_float = Math.round(upperlim);\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " lowerlim = document.getElementById(lowerlim_id).value;\n", + " lowerlim_float = Math.round(lowerlim);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, lowerlim_float, upperlim_float, if_show_VBM, if_compare, i_in_compare_list); \n", + " }\n", + "\n", + "\n", + " function plot_band_dos(lowerLim, upperLim, N_materials_show)\n", + " {\n", + " placeholder_band = \"#div_band1\";\n", + " placeholder_dos = \"#div_dos1\";\n", + " // lowerLim = -10.01\n", + " //upperLim = 10.01\n", + "\n", + "\n", + "\n", + " //alert(\"plot_band_dos\");\n", + " //prepare();\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " \n", + " var checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + " add_info(i);\n", + " }\n", + "\n", + " //------Plot----------------\n", + " /*\n", + " for(var i_material = 0; i_material < N_materials_show; i_material++)\n", + " {\n", + "\n", + " //alert(\"Material \"+i);\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " */\n", + " //alert(\"next:for\")\n", + " for (let i_material = 0, p = Promise.resolve(); i_material < N_materials_show; i_material++) {\n", + " p = p.then(_ => new Promise(resolve =>\n", + " setTimeout(function () {\n", + " //alert(i_material)\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected == 1)\n", + " {\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " resolve();\n", + " }, 0)\n", + " ));\n", + " }\n", + "\n", + "\n", + " return 1;\n", + " }\n", + "\n", + " var i = 0\n", + " var lowerLim = -10\n", + " var upperLim = 10\n", + " var if_show_VBM = 0\n", + " var if_compare = 0\n", + " var i_in_compare_list = -1\n", + "\n", + "\n", + " \n", + " function plot_band_dos_i(i_material, lowerLim_material, upperLim_material, if_show_VBM_material, if_compare_material, i_in_compare_list_material)\n", + " {\n", + " //alert(\"plot_band_dos_i\")\n", + "\n", + " i = i_material;\n", + " lowerLim = lowerLim_material;\n", + " upperLim = upperLim_material;\n", + " if_show_VBM = if_show_VBM_material;\n", + " if_compare = if_compare_material;\n", + " i_in_compare_list = i_in_compare_list_material;\n", + " //alert(\"plot_band_dos_i: i_material: \"+i)\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_band'));\n", + " //alert('i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list')\n", + " //plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_dos'));\n", + " } \n", + "</script>\n", + "\n", + " \n", + " \n", + "<br><br>\n", + "<button class=\"button\" onclick=\"process()\">Process data</button>\n", + "<br><br>\n", + "<div id = \"n_materials\" style = \"font-size: 18px; font-weight: 100; height: 60px; width: 100%;\"> Number of materials submitted: 0</div>\n", + "<div id = \"show_materials_submitted\" style = \"font-size: 20px; font-color: black;\"> </div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "<p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select materials to visualize the band structure and DOS:</p>\n", + "<div style = \"width :100%; height: 10px;\"></div> \n", + "<button class = \"button\" onclick = \"clean_materials_selection()\"> Clean selections </button> \n", + "<button class = \"button\" onclick = \"select_all()\"> Select all </button> \n", + "<button class = \"button\" onclick = \"visualize_band_dos()\"> Visualize </button> \n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "<div id = \"show_materials_submitted_info\" style = \"width: 100%; font-size: 20px; font-color: black;\"> \n", + " <table id = \"table_materials_submitted_info\" style=\"width:100%\"> </table>\n", + "</div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "\n", + "\n", + "\n", + "<div id=\"div_compare_buttons\" style=\"visibility:hidden\">\n", + " <br><br><br>\n", + " <p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select two materials in the checkbox on the right for comparison:</p>\n", + " <p style=\"color: #000;font-weight: 1000; font-size: 8pt;\"></p>\n", + " <button class = \"button\" onclick = \"clean_compare_list()\"> Clean selections </button> \n", + " <button class = \"button\" onclick = \"compare();compare()\" title = \"Select 2 materials in the checkbox below and compare: please make sure that the upper/lower limits are the same (using Rescale/Autoscale buttons).\" > Compare</button>\n", + "</div>\n", + "\n", + "\n", + "\n", + "<div id = \"div_showall\" style = \"width: 100%; visibility:hidden\">\n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + " <input type = \"checkbox\" id = \"checkbox_showall\" unchecked onclick=\"show_all(this.id)\"/> <font color=\"black\" size = 3px> Show all results </font><font size = 2px color = \"#666\"> (By default only the first 10 results are shown.) </font> \n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + "</div>\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "<div id = \"div_compare\" style = \"position: fixed; top: 20%; left: 10%; width: 1200px; height: 600px; z-index: 999999; border: 1px solid #555; background-color: #fff; display: none\" onclick = \"$(this).fadeOut(500)\"> \n", + " \n", + " <div style = \"float: right; width: 80px; height: 25px; margin-top: 10px; margin-right: 10px; z-index: 1000000; border: 1px solid #555; text-align: center; vertical-align: middle; background-color: #f9f9f9; font-size:12pt; font-color: #000; cursor:pointer;\" > CLOSE </div> <!--button to close the div-->\n", + " <div id = \"div_compare_info\" style = \" width: 350px; height: 500px; float: right; margin-top: 50px; margin-right: 10px; z-index: 10000000;\"></div>\n", + " <div id = \"div_compare_container\" style = \"margin-top: 50px; margin-left: 100px; width: 600px; height: 300px;\">\n", + " <div class=\"g-before-after\" id = \"div_compare_containerx\"></div>\n", + " </div>\n", + "</div>\n", + "\n", + "\n", + "<div id = \"demo\"></div>\n", + "\n", + "<div id = \"plot_placeholder\">\n", + " <div><br></div>\n", + " <table id = \"table_visualize\"> </table>\n", + "</div>\n", + "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + " function show_materials_submitted_info()\n", + " {\n", + " //alert(\"N_materials=\" + N_materials)\n", + " //\"table_materials_submitted_info\"\n", + " //alert(\"show_materials_submitted_info: info_obj_all: \"+JSON.stringify(info_obj_all))\n", + " var table_content = new Array(); \n", + " str = '<tr>';\n", + " str += '<th width=\"5%\"></th>'\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Atom labels</b></font></p></th>';\n", + " //str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Space group</b></font></p></th>';\n", + " //str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Lattice constants (in Ang)</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Program name</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Basis set type</b></font></p></th>';\n", + " str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Functional</b></font></p></th>';\n", + " //str += '<th width=\"20%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Number of <i>k</i> points per inverse distance</b></font></p></th>';\n", + " str += '</tr>'; //first row: head\n", + " table_content.push(str);\n", + "\n", + " for(var i = 0; i < N_materials; i++) //add info of each material\n", + " {\n", + " //alert(\"show_materials_submitted_info: material \"+ i); \n", + " table_content.push('<tr>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<input type = \\\"checkbox\\\" name = \"checkbox_material\" id = \\\"checkbox_material' + i.toString() + '\\\" unchecked onclick=\\\"checkbox_material(this.id)\\\">';\n", + " str += \"<b>  #\" + (i+1).toString() + \"</b>\";\n", + " table_content.push(str);\n", + " table_content.push('</td>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"atom_labels\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got atom_labels\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"space_group_symbol\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got space_group_symbol\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"lattice_constant\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got lattice_constant\");\n", + " */\n", + " \n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_name\"].toUpperCase() + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_name\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_basis_set_type\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_basis_set_type\");\n", + "\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"XC_functional_name\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got XC_functional_name\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got average_N_k_points_per_inverse_distance\");\n", + " */\n", + " table_content.push('</tr>');\n", + "\n", + " }\n", + " \n", + " document.getElementById(\"table_materials_submitted_info\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + " function clean_materials_selection()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " }\n", + " }\n", + "\n", + " function select_all()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"checked\";\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " function process()\n", + " {\n", + " //alert(\"Process:\"+band_paths)\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_js_plot'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_materials_submitted_info'));\n", + " show_materials_submitted_info();\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " str = N_materials.toString();\n", + " document.getElementById(\"n_materials\").innerHTML = \"Number of materials submitted: \" + str + \"<font size = 1px color = #C0C0C0 >   Please press \\'Visualize\\' to visualize the band structure. </font>\";\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " }\n", + " \n", + "\n", + " var image_band = '';\n", + " var image_dos = '';\n", + " var image_band_links = new Array(N_materials); //store the URL of each band figure -> used to compare 2 figures\n", + " var image_band_links_selected = [];\n", + " var image_band_selected_Number = []; //record which i_material has been selected\n", + "\n", + "\n", + "\n", + " function prepare(N_materials_show)\n", + " {\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " var table_content = new Array(); \n", + " //document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " //-----Generate the html tables for each material--------\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " table_content.push('<tr>');\n", + " div_string = '<div style = \\\"height: 20px\\\"></div>';\n", + " table_content.push(div_string);\n", + " table_content.push('<th>');\n", + "\n", + " //add main container div\n", + " div_string = '<div id = \\\"div_band_dos' + i.toString() + '\\\" class = \\\"div_band_dos\\\" >';\n", + " table_content.push(div_string);\n", + "\n", + " //show No. of the material\n", + " i_material = i + 1;\n", + " div_string = '<div style = \\\"height:30px\\; font-size: 15pt;\">' + '#' + i_material.toString() + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //show band_path/dos info\n", + " div_string = '<div style = \\\"height:30px\\\">' + 'Band:   ' + band_paths[i] + ',    DOS:   ' + dos_paths[i] + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_band\n", + " div_string = '<div id = \\\"div_band' + i.toString() + '\\\" class = \\\"div_band\\\" ></div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_dos\n", + " div_string = '<div id = \\\"div_dos' + i.toString() + '\\\" class = \\\"div_dos\\\" ></div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add div_tools\n", + " div_string = '<div id = \\\"div_tools' + i.toString() + '\\\" class = \\\"div_tools\\\" >'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: infomation\n", + " div_string = '<div id = \\\"div_info' + i.toString() + '\\\">atom_labels<br>program_name</div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: custom scale\n", + " div_string = '<br><p style=\\\"color: #000;font-weight: 100; font-size: 10pt; align:left\\\"> Set the lower and upper limit of energy scale (in eV): <br><br><font color=\\\"black\\\" size = 3px> Lower limit:    </font><textarea id=\\\"lowerlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">-10</textarea> <font color=\\\"black\\\" size = 3px>   eV</font>    <font color=\\\"black\\\" size = 3px> Upper limit:    </font><textarea id=\\\"upperlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">10</textarea> <font color=\\\"black\\\" size = 3px>   eV   </font></p>';\n", + " table_content.push(div_string);\n", + " div_string = '<br><button class = \\\"button_tools\\\" id = \\\"button_customscale' + i.toString() + '\\\" onclick = \\\"customscale(this.id)\\\"> Rescale </button>'; \n", + " table_content.push(div_string);\n", + "\n", + "\n", + " //add button:autoscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_autoscale' + i.toString() + '\\\" onclick = \\\"autoscale(this.id)\\\" title = \\\"(-10 eV, 10 eV)\\\"> Autoscale </button>'; \n", + " table_content.push(div_string);\n", + " //add button:fullscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_fullscale' + i.toString() + '\\\" onclick = \\\"fullscale(this.id)\\\" title = \\\"(-100 eV, 100 eV)\\\"> Full scale </button><br><br>'; \n", + " table_content.push(div_string);\n", + "\n", + " //table_content.push(\"Select and zoom:\");\n", + "\n", + " /*//overview for select and zoom\n", + " div_string = '<div id = \\\"div_overview' + i.toString() + '\\\" class = \\\"div_overview\\\" ></div>'; // <div id=\"overview\" style=\"width:300px;height:200px; margin-left:10px; margin-top: 50px; padding-top: 0px\"></div>\n", + " table_content.push(div_string);\n", + " div_string = '<p id = \\\"overviewLegend' + i.toString() + '\\\" ></p>'; // <p id=\"overviewLegend\" style=\"margin-left:10px\"></p>\n", + " table_content.push(div_string);*/\n", + "\n", + " //download figures as png\n", + " div_string = '<a id = \\\"img_band' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download band </a>';\n", + " table_content.push(div_string); \n", + " div_string = '<a id = \\\"img_dos' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download DOS </a>';\n", + " table_content.push(div_string);\n", + "\n", + " //add show VBM & CBM\n", + " div_string = '<br><br><p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_VBM' + i.toString() + '\\\" unchecked onclick=\\\"show_VBM(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Show VBM </font> (<font color=\\\"blue\\\">\\•</font>) <font color=\\\"black\\\" size = 3px> and CBM </font>(<font color=\\\"red\\\">\\•</font>) </p>';\n", + " table_content.push(div_string);\n", + "\n", + "\n", + " table_content.push('</div>');//div_tools\n", + "\n", + " //checkbox for comparison\n", + " div_string = '<div id = \\\"div_checkbox_compare' + i.toString() + '\\\" class = \\\"div_checkbox_compare\\\" >';\n", + " table_content.push(div_string);\n", + " //div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" checked = \\\"unchecked\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " table_content.push(div_string);\n", + " table_content.push('</div>');//div_checkbox_compare\n", + "\n", + "\n", + " table_content.push('</div>');//div_band_dos\n", + " table_content.push('</th>');\n", + " table_content.push('</tr>'); \n", + " }\n", + "\n", + " document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + "\n", + " function visualize_band_dos()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_jquery'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_axislabels'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_dashes'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_navigate'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_selection'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_flot_legendoncanvas'));\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " document.getElementById(\"div_compare_buttons\").style.visibility=\"\";\n", + "\n", + "\n", + "\n", + " if(N_materials > N_max_show)\n", + " {\n", + " document.getElementById(\"div_showall\").style.visibility=\"visible\";\n", + " document.getElementById(\"checkbox_showall\").checked = \"\";\n", + " } \n", + "\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + "\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + "\n", + " }\n", + "\n", + " function show_all(id)//\"plot_placeholder\"\n", + " {\n", + " var if_showall=0;\n", + " if_showall = check_show_VBM(id);\n", + " if(if_showall == 1)\n", + " {\n", + " N_materials_show = N_materials;\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + " else\n", + " {\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + "\n", + " }\n", + "\n", + " \n", + " //------------------Tool used to get the content from textarea---------------------\n", + " function get_text(textarea_id)\n", + " {\n", + " var text = document.getElementById(textarea_id).value;\n", + " return text;\n", + " }\n", + "\n", + "\n", + "\n", + " //-------------------Compare 2 band figures----------------------------------------\n", + "\n", + "\n", + " function check_compare(id)//checkbox_compare' + i.toString() + '\\\" unchecked onclick=\\\"check_compare(this.id)\n", + " {\n", + " var x = document.getElementById(id);\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " N_chosen ++;\n", + " }\n", + " }\n", + " if(N_chosen == 2) // In max. only 2 figures could be selected and compared.\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(!choices_compare[i].checked)\n", + " {\n", + " choices_compare[i].disabled = 'disabled';\n", + " }\n", + " }\n", + " }\n", + " else\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " }\n", + "\n", + " function compare()\n", + " {\n", + " $(\"#div_compare\").fadeIn(600);//show div for comparison\n", + " //check_compare(-100);\n", + "\n", + " var compare_list = [];\n", + " compare_list = make_compare_list();\n", + " //[i_material_1, i_material_2] = make_compare_list();\n", + " i_material_1 = compare_list[0];\n", + " i_material_2 = compare_list[1];\n", + " //document.getElementById(\"demo\").innerHTML = \"In add info compare:\" + i_material_1.toString() + i_material_2.toString();\n", + " compare_figures(i_material_1, i_material_2); \n", + " }\n", + " function make_compare_list()\n", + " {\n", + " //get the links to the images\n", + " images_selected_links = []; //store the links to the figures for comparison\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " var str = ''; //tmp str for debug\n", + " var figure_selected = new Array(2);\n", + " for(var i=0; i<choices_compare.length; i++) //check which figures are selected\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " id_chosen = choices_compare[i].id;\n", + " i_chosen = Math.round(id_chosen.substring(16));\n", + " var tmp_str = image_band_links[i_chosen];\n", + " images_selected_links.push(tmp_str);\n", + " figure_selected[N_chosen] = i_chosen;\n", + " N_chosen ++;\n", + " //str += beakerx.image_band_links[i];\n", + " }\n", + " }\n", + " var i_material_1 = 0;\n", + " var i_material_2 = 0;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list';\n", + " image_band_links_selected = images_selected_links;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list: next';\n", + " if(N_chosen == 2)\n", + " {\n", + " i_material_1 = figure_selected[0];\n", + " i_material_2 = figure_selected[1];\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Compare_list: ' +i_material_1.toString() + ' ' + i_material_2.toString();\n", + "\n", + " return [i_material_1, i_material_2];\n", + " }\n", + "\n", + " function check_compare_scale(i_material_1, i_material_2)\n", + " {\n", + " lowerlimit_id_1 = \"lowerlimit\" + i_material_1.toString();\n", + " lowerlimit_id_2 = \"lowerlimit\" + i_material_2.toString();\n", + " upperlimit_id_1 = \"upperlimit\" + i_material_1.toString();\n", + " upperlimit_id_2 = \"upperlimit\" + i_material_2.toString();\n", + "\n", + " lowerlimit_1 = parseFloat(document.getElementById(lowerlimit_id_1).innerHTML);\n", + " lowerlimit_2 = parseFloat(document.getElementById(lowerlimit_id_2).innerHTML);\n", + " upperlimit_1 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " upperlimit_2 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " if((lowerlimit_1 != lowerlimit_2) || (upperlimit_1 != upperlimit_2))\n", + " return -1;\n", + " else\n", + " return 1;\n", + " }\n", + "\n", + " function compare_figures(i_material_1, i_material_2)\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_query_beforeafter'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_compare_slide'));\n", + " add_info_compare(i_material_1, i_material_2);\n", + " document.getElementById(\"div_compare_container\").scrollIntoView({ behavior: 'smooth' }); \n", + " document.getElementById(\"div_compare_container\").scrollTop += 50;\n", + "\n", + " }\n", + "\n", + "\n", + " function clean_compare_list()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " //-----------Add information about the calculation to \"div_tools\"---------------\n", + " function add_info(i)\n", + " {\n", + " \n", + " //document.getElementById(\"demoa\").innerHTML = i.toString() + div_info_id;\n", + " //for(var i = 0; i < beakerx.N_materials; i++)\n", + " //{\n", + " div_info_id = \"div_info\" + i.toString();\n", + "\n", + " var str = '';\n", + " str += \"<br> <p style=\\\"text-align:left\\\"><font size = 3pt><b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"] + '</font></p>';\n", + " //str += \"<font size = 3pt><b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"] + '</font>';\n", + " //str += \"<font size = 3pt><b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"] + '</font>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase() + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3) + '</font></p>';\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " //document.getElementById('program_name_1').innerHTML = \"<b>Code:</b>    \" + origData[\"program_name\"];\n", + " //document.getElementById('program_basis_set_type_1').innerHTML = \"<b>Basis set type:</b>    \" + origData[\"program_basis_set_type\"];\n", + " //document.getElementById('XC_functional_name_1').innerHTML = \"<b>Functional:</b>    \" + origData[\"XC_functional_name\"]; \n", + " //}\n", + " \n", + " }\n", + " function add_info_compare(i,j)\n", + " {\n", + "\n", + " div_info_id = \"div_compare_info\";\n", + " var str = '';\n", + "\n", + " if_same_scale = check_compare_scale(i_material_1, i_material_2);\n", + " if(if_same_scale == -1)\n", + " {\n", + " str = '<b><font size = \"15pt\" color=\"#940000\">Error: Different lower/upper limits.</font></b><br>';\n", + " document.getElementById(\"div_compare_container\").innerHTML = str;\n", + " document.getElementById(div_info_id).innerHTML = '';\n", + " return;\n", + " }\n", + "\n", + " str += \"<br><b><font-size:15pt>Information of the first calculation (left):</font></b> <br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"];\n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"<br><br><br><b><font-size:15pt>Information of the second calculation (right):</font></b><br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[j][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[j][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[j][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[j][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[j][\"program_basis_set_type\"]; \n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[j][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " }\n", + "\n", + "\n", + "\n", + " //-----------------------Show/hide VBM, CBM-------------------------\n", + " function check_show_VBM(checkbox_VBM_id)\n", + " {\n", + " var x = document.getElementById(checkbox_VBM_id);\n", + " var if_checked = 0;\n", + " if(x.checked)//== \"checked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"checked!\";\n", + " if_checked = 1;\n", + " }\n", + " else if (x.unchecked)// == \"unchecked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"unchecked!\";\n", + " if_checked = -1;\n", + " }\n", + " else\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"nothing detected!\";\n", + " }\n", + " return if_checked;\n", + " }\n", + "\n", + " function check_if_in_compare_list(i) // check if the current material i is to be compared\n", + " {\n", + "\n", + " var checkbox_compare_id = \"checkbox_compare\" + i.toString();\n", + " var if_compare = check_show_VBM(checkbox_compare_id);\n", + " //document.getElementById(\"demo\").innerHTML = 'if_compare of ' + i.toString() + ' : ' + if_compare.toString();\n", + " var i_compare_material_1, i_compare_material_2;\n", + " [i_compare_material_1, i_compare_material_2] = make_compare_list();\n", + " var i_in_compare_list = -1;\n", + " if(i_compare_material_1 == i)\n", + " {\n", + " i_in_compare_list = 1;\n", + " }\n", + " else if (i_compare_material_2 == i)\n", + " {\n", + " i_in_compare_list = 2;\n", + " }\n", + " else\n", + " {\n", + " i_in_compare_list = 0;\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Checking ' + i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + " return [if_compare, i_in_compare_list];\n", + " }\n", + "\n", + " function show_VBM(id)\n", + " {\n", + " //prepare(\"new\");\n", + " //var if_show_VBM = -1;\n", + " var len_id = id.length;\n", + " var i_material = id.substring(12);\n", + " var i = Math.round(i_material);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + " //document.getElementById(\"demo\").innerHTML = i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + "\n", + " //---------------------Functions to rescale-------------------------------------------\n", + " function autoscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"10.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-10.0\";\n", + "\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function fullscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"100.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-100.0\";\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, -100, 100, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function customscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(18);\n", + " var i = Math.round(i_material);\n", + " //\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " upperlim = document.getElementById(upperlim_id).value;\n", + " upperlim_float = Math.round(upperlim);\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " lowerlim = document.getElementById(lowerlim_id).value;\n", + " lowerlim_float = Math.round(lowerlim);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, lowerlim_float, upperlim_float, if_show_VBM, if_compare, i_in_compare_list); \n", + " }\n", + "\n", + "\n", + " function plot_band_dos(lowerLim, upperLim, N_materials_show)\n", + " {\n", + " placeholder_band = \"#div_band1\";\n", + " placeholder_dos = \"#div_dos1\";\n", + " // lowerLim = -10.01\n", + " //upperLim = 10.01\n", + "\n", + "\n", + "\n", + " //alert(\"plot_band_dos\");\n", + " //prepare();\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " \n", + " var checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + " add_info(i);\n", + " }\n", + "\n", + " //------Plot----------------\n", + " /*\n", + " for(var i_material = 0; i_material < N_materials_show; i_material++)\n", + " {\n", + "\n", + " //alert(\"Material \"+i);\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " */\n", + " //alert(\"next:for\")\n", + " for (let i_material = 0, p = Promise.resolve(); i_material < N_materials_show; i_material++) {\n", + " p = p.then(_ => new Promise(resolve =>\n", + " setTimeout(function () {\n", + " //alert(i_material)\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected == 1)\n", + " {\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " resolve();\n", + " }, 0)\n", + " ));\n", + " }\n", + "\n", + "\n", + " return 1;\n", + " }\n", + "\n", + " var i = 0\n", + " var lowerLim = -10\n", + " var upperLim = 10\n", + " var if_show_VBM = 0\n", + " var if_compare = 0\n", + " var i_in_compare_list = -1\n", + "\n", + "\n", + " \n", + " function plot_band_dos_i(i_material, lowerLim_material, upperLim_material, if_show_VBM_material, if_compare_material, i_in_compare_list_material)\n", + " {\n", + " //alert(\"plot_band_dos_i\")\n", + "\n", + " i = i_material;\n", + " lowerLim = lowerLim_material;\n", + " upperLim = upperLim_material;\n", + " if_show_VBM = if_show_VBM_material;\n", + " if_compare = if_compare_material;\n", + " i_in_compare_list = i_in_compare_list_material;\n", + " //alert(\"plot_band_dos_i: i_material: \"+i)\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_band'));\n", + " //alert('i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list')\n", + " //plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_dos'));\n", + " } \n", + "</script>\n", + "\n", + " \n", + " \n", + "<br><br>\n", + "<button class=\"button\" onclick=\"process()\">Process data</button>\n", + "<br><br>\n", + "<div id = \"n_materials\" style = \"font-size: 18px; font-weight: 100; height: 60px; width: 100%;\"> Number of materials submitted: 0</div>\n", + "<div id = \"show_materials_submitted\" style = \"font-size: 20px; font-color: black;\"> </div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "<p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select materials to visualize the band structure and DOS:</p>\n", + "<div style = \"width :100%; height: 10px;\"></div> \n", + "<button class = \"button\" onclick = \"clean_materials_selection()\"> Clean selections </button> \n", + "<button class = \"button\" onclick = \"select_all()\"> Select all </button> \n", + "<button class = \"button\" onclick = \"visualize_band_dos()\"> Visualize </button> \n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "<div id = \"show_materials_submitted_info\" style = \"width: 100%; font-size: 20px; font-color: black;\"> \n", + " <table id = \"table_materials_submitted_info\" style=\"width:100%\"> </table>\n", + "</div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "\n", + "\n", + "\n", + "<div id=\"div_compare_buttons\" style=\"visibility:hidden\">\n", + " <br><br><br>\n", + " <p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select two materials in the checkbox on the right for comparison:</p>\n", + " <p style=\"color: #000;font-weight: 1000; font-size: 8pt;\"></p>\n", + " <button class = \"button\" onclick = \"clean_compare_list()\"> Clean selections </button> \n", + " <button class = \"button\" onclick = \"compare();compare()\" title = \"Select 2 materials in the checkbox below and compare: please make sure that the upper/lower limits are the same (using Rescale/Autoscale buttons).\" > Compare</button>\n", + "</div>\n", + "\n", + "\n", + "\n", + "<div id = \"div_showall\" style = \"width: 100%; visibility:hidden\">\n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + " <input type = \"checkbox\" id = \"checkbox_showall\" unchecked onclick=\"show_all(this.id)\"/> <font color=\"black\" size = 3px> Show all results </font><font size = 2px color = \"#666\"> (By default only the first 10 results are shown.) </font> \n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + "</div>\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "<div id = \"div_compare\" style = \"position: fixed; top: 20%; left: 10%; width: 1200px; height: 600px; z-index: 999999; border: 1px solid #555; background-color: #fff; display: none\" onclick = \"$(this).fadeOut(500)\"> \n", + " \n", + " <div style = \"float: right; width: 80px; height: 25px; margin-top: 10px; margin-right: 10px; z-index: 1000000; border: 1px solid #555; text-align: center; vertical-align: middle; background-color: #f9f9f9; font-size:12pt; font-color: #000; cursor:pointer;\" > CLOSE </div> <!--button to close the div-->\n", + " <div id = \"div_compare_info\" style = \" width: 350px; height: 500px; float: right; margin-top: 50px; margin-right: 10px; z-index: 10000000;\"></div>\n", + " <div id = \"div_compare_container\" style = \"margin-top: 50px; margin-left: 100px; width: 600px; height: 300px;\">\n", + " <div class=\"g-before-after\" id = \"div_compare_containerx\"></div>\n", + " </div>\n", + "</div>\n", + "\n", + "\n", + "<div id = \"demo\"></div>\n", + "\n", + "<div id = \"plot_placeholder\">\n", + " <div><br></div>\n", + " <table id = \"table_visualize\"> </table>\n", + "</div>\n", + "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "tags": [ + "plot_band" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + " //alert(\"tag: plot_band\")\n", + "\n", + "plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + "function plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)\n", + "{\n", + " //i=0;\n", + " //alert(\"plot_band \"+ i)\n", + " var placeholder_band = \"#div_band\" + i.toString();\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var img_band_id = \"img_band\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + " var placeholder_band_compare = \"\";\n", + "\n", + "\n", + " if(i_in_compare_list == 1)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\";\n", + " }\n", + " else if(i_in_compare_list == 2)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_2\";\n", + " }\n", + " else\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\"; // just for safe\n", + " }\n", + "\n", + " Object.size = function(obj) {\n", + " var size = 0, key;\n", + " for (key in obj) \n", + " {\n", + " if (obj.hasOwnProperty(key)) size++;\n", + " }\n", + " return size;\n", + " };\n", + "\n", + " //Get the number of bands\n", + " //alert(\"Getting band\")\n", + " //alert(band_obj_all)\n", + " //alert(\"band_obj_all got!\")\n", + " var N_bands = Object.size(band_obj_all[i][\"band_y_axis\"]);\n", + " var N_k_coors = Object.size(band_obj_all[i][\"band_x_axis\"]);\n", + " //alert(band_obj_all[i][\"band_y_axis\"])\n", + " var band_plotdata = [];\n", + " \n", + " for(var i_band =0; i_band < N_bands; i_band++)\n", + " {\n", + " var tmp_data = [];\n", + " for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)\n", + " {\n", + " tmp_data.push([band_obj_all[i][\"band_x_axis\"][j_k_coor],band_obj_all[i][\"band_y_axis\"][i_band][j_k_coor]]);\n", + " }\n", + " var plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };\n", + " band_plotdata.push(plotData);\n", + " }\n", + "\n", + "\n", + " var tmp_data0 = [[0, 0], [1, 0]];\n", + " var plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};\n", + " band_plotdata.push(plotData0);\n", + "\n", + " var band_plotdata_overview = band_plotdata.slice(0);\n", + "\n", + " var HOMOdata= [[band_obj_all[i][\"HOMO_coor\"],band_obj_all[i][\"HOMO_energy\"]]];\n", + " var HOMOlabel = [\"VBM\"];\n", + " var plotHOMO={ shadowSize:0, color: 'blue', data: HOMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'blue'},lines:{show: false}, showLabels: true, labels: HOMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " var LUMOdata= [[band_obj_all[i][\"LUMO_coor\"],band_obj_all[i][\"LUMO_energy\"]]];\n", + " var LUMOlabel = [\"CBM\"];\n", + " var plotLUMO={ shadowSize:0, color: 'red', data: LUMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'red'},lines:{show: false}, showLabels: true, labels: LUMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " //if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + " if (if_show_VBM == 1)\n", + " {\n", + " band_plotdata.push(plotHOMO);\n", + " band_plotdata.push(plotLUMO);\n", + " }\n", + "\n", + " \n", + " //alert(img_band_id + band_plotdata)\n", + " \n", + " //!!!FIXME: if ($(\"#showVBM:checked\").length > 0 && gap > 0.1) \n", + " //plotHOMOLUMO={ shadowSize:0, color: 'red', data: d5, points:{show:true, radius: 0.8 , fill: true}, showLabels: true, labels: d5label, labelPlacement: labelPos, canvasRender: true, cColor: 'red', cFont:\"1em Arial\" }\n", + "\n", + " var canvas_band;\n", + " var options_band = {\n", + " canvas: true,\n", + " //legend:{ type: \"canvas\" },\n", + " series: { lines: { show: true, lineWidth: 2 }, \n", + " points: { show: false } }, \n", + " xaxis: { \n", + " ticks: band_obj_all[i][\"labels\"], \n", + " color:\"#000\", \n", + " font: {size: 20}, \n", + " zoomRange: false,\n", + " panRange: false \n", + " }, \n", + " yaxis: { \n", + " axisLabel: \"Energy (eV)\", \n", + " axisLabelUseCanvas: true,\n", + " //axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20, family:\"Arial\"},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " zoom: { \n", + " interactive: true\n", + " },\n", + "\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " //selection: { mode: \"xy\", color: \"#86a6b4\" }, \n", + "\n", + " grid: { \n", + " labelMargin: 15,\n", + " hoverable: true, \n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] }, \n", + " borderWidth: {\n", + " top: 2, \n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null } \n", + " }\n", + " }\n", + " //var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);\n", + " //var plot_band = $.plot(\"#div_bandx\", band_plotdata, options_band);\n", + " var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas\n", + " var image_band = plot_band.toDataURL();\n", + " image_band = image_band.replace(\"image/png\",\"image/octet-stream\");\n", + " //beakerx.image_band = image_band;\n", + " document.getElementById(img_band_id).href= image_band;\n", + " image_band_links[i] = image_band;\n", + " //alert(\"band done\")\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + " //alert(\"tag: plot_band\")\n", + "\n", + "plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + "function plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)\n", + "{\n", + " //i=0;\n", + " //alert(\"plot_band \"+ i)\n", + " var placeholder_band = \"#div_band\" + i.toString();\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var img_band_id = \"img_band\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + " var placeholder_band_compare = \"\";\n", + "\n", + "\n", + " if(i_in_compare_list == 1)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\";\n", + " }\n", + " else if(i_in_compare_list == 2)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_2\";\n", + " }\n", + " else\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\"; // just for safe\n", + " }\n", + "\n", + " Object.size = function(obj) {\n", + " var size = 0, key;\n", + " for (key in obj) \n", + " {\n", + " if (obj.hasOwnProperty(key)) size++;\n", + " }\n", + " return size;\n", + " };\n", + "\n", + " //Get the number of bands\n", + " //alert(\"Getting band\")\n", + " //alert(band_obj_all)\n", + " //alert(\"band_obj_all got!\")\n", + " var N_bands = Object.size(band_obj_all[i][\"band_y_axis\"]);\n", + " var N_k_coors = Object.size(band_obj_all[i][\"band_x_axis\"]);\n", + " //alert(band_obj_all[i][\"band_y_axis\"])\n", + " var band_plotdata = [];\n", + " \n", + " for(var i_band =0; i_band < N_bands; i_band++)\n", + " {\n", + " var tmp_data = [];\n", + " for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)\n", + " {\n", + " tmp_data.push([band_obj_all[i][\"band_x_axis\"][j_k_coor],band_obj_all[i][\"band_y_axis\"][i_band][j_k_coor]]);\n", + " }\n", + " var plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };\n", + " band_plotdata.push(plotData);\n", + " }\n", + "\n", + "\n", + " var tmp_data0 = [[0, 0], [1, 0]];\n", + " var plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};\n", + " band_plotdata.push(plotData0);\n", + "\n", + " var band_plotdata_overview = band_plotdata.slice(0);\n", + "\n", + " var HOMOdata= [[band_obj_all[i][\"HOMO_coor\"],band_obj_all[i][\"HOMO_energy\"]]];\n", + " var HOMOlabel = [\"VBM\"];\n", + " var plotHOMO={ shadowSize:0, color: 'blue', data: HOMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'blue'},lines:{show: false}, showLabels: true, labels: HOMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " var LUMOdata= [[band_obj_all[i][\"LUMO_coor\"],band_obj_all[i][\"LUMO_energy\"]]];\n", + " var LUMOlabel = [\"CBM\"];\n", + " var plotLUMO={ shadowSize:0, color: 'red', data: LUMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'red'},lines:{show: false}, showLabels: true, labels: LUMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " //if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + " if (if_show_VBM == 1)\n", + " {\n", + " band_plotdata.push(plotHOMO);\n", + " band_plotdata.push(plotLUMO);\n", + " }\n", + "\n", + " \n", + " //alert(img_band_id + band_plotdata)\n", + " \n", + " //!!!FIXME: if ($(\"#showVBM:checked\").length > 0 && gap > 0.1) \n", + " //plotHOMOLUMO={ shadowSize:0, color: 'red', data: d5, points:{show:true, radius: 0.8 , fill: true}, showLabels: true, labels: d5label, labelPlacement: labelPos, canvasRender: true, cColor: 'red', cFont:\"1em Arial\" }\n", + "\n", + " var canvas_band;\n", + " var options_band = {\n", + " canvas: true,\n", + " //legend:{ type: \"canvas\" },\n", + " series: { lines: { show: true, lineWidth: 2 }, \n", + " points: { show: false } }, \n", + " xaxis: { \n", + " ticks: band_obj_all[i][\"labels\"], \n", + " color:\"#000\", \n", + " font: {size: 20}, \n", + " zoomRange: false,\n", + " panRange: false \n", + " }, \n", + " yaxis: { \n", + " axisLabel: \"Energy (eV)\", \n", + " axisLabelUseCanvas: true,\n", + " //axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20, family:\"Arial\"},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " zoom: { \n", + " interactive: true\n", + " },\n", + "\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " //selection: { mode: \"xy\", color: \"#86a6b4\" }, \n", + "\n", + " grid: { \n", + " labelMargin: 15,\n", + " hoverable: true, \n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] }, \n", + " borderWidth: {\n", + " top: 2, \n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null } \n", + " }\n", + " }\n", + " //var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);\n", + " //var plot_band = $.plot(\"#div_bandx\", band_plotdata, options_band);\n", + " var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas\n", + " var image_band = plot_band.toDataURL();\n", + " image_band = image_band.replace(\"image/png\",\"image/octet-stream\");\n", + " //beakerx.image_band = image_band;\n", + " document.getElementById(img_band_id).href= image_band;\n", + " image_band_links[i] = image_band;\n", + " //alert(\"band done\")\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "tags": [ + "plot_dos" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + " //alert(\"tag: plot_dos \" + i)\n", + " //i=0;\n", + "\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + "//----Plot DOS----------------------\n", + " var dos_plotdata = [];\n", + " //alert(\"dos:\"+dos_obj_all[i])\n", + " var xdos = dos_obj_all[i][\"dos_x_axis\"];\n", + " var ydos = dos_obj_all[i][\"dos_y_axis\"][0];\n", + " var dosLabelPos = Math.max.apply(Math, ydos)/2;\n", + " var d2 = [];\n", + " for (var ii = 0; ii < xdos.length; ii+=1) {\n", + " d2.push([ydos[ii],xdos[ii]]);\n", + " }\n", + " var plotData2={ shadowSize: 0, color: 'black' , data: d2};\n", + " dos_plotdata.push(plotData2);\n", + " //alert(\"dos_plotdata\"+JSON.stringify(dos_plotdata[0]));\n", + " \n", + " function find_xaxis_max_min(data, lowerbound, upperbound)\n", + " {\n", + " //data[xaxis,y] find the max and min value of x axis\n", + " //alert(\"dos[0]:\" + data[0][\"data\"]);\n", + " //alert(\"Bounds: \" + lowerbound + \" , \" + upperbound)\n", + " var n_data = data.length;\n", + " //alert(\"N dos: \" + n_data);\n", + " var data_min = 1000000;\n", + " var data_max = -1000000;\n", + " var data_current = 0;\n", + " for (var i = 0; i < n_data; i++)\n", + " {\n", + " if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))\n", + " {\n", + " data_current = data[i][0];\n", + " //alert(\"data[i]: \" + data[i] + \"data[i][0]: \" + data_current);\n", + " if(data_current >= data_max)\n", + " {\n", + " data_max = data_current;\n", + " }\n", + " if(data_current <= data_min)\n", + " {\n", + " data_min = data_current;\n", + " }\n", + " }\n", + " }\n", + " var data_max_min = [data_max, data_min];\n", + " //alert(\"data_max_min: \" + data_max_min);\n", + " return data_max_min;\n", + " }\n", + " var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0][\"data\"], lowerLim, upperLim);\n", + " var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;\n", + " //alert(\"dos_x_max_min:\"+dos_x_max_min+\", dosLabelPos:\"+dosLabelPos);\n", + " var options_dos ={\n", + " canvas: true,\n", + " series: {\n", + " lines: { show: true, lineWidth:2 },\n", + " points: { show: false }\n", + " },\n", + "\n", + " yaxis: { \n", + " axisLabel: \"\", \n", + " axisLabelUseCanvas: true,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " xaxis: {\n", + " axisLabel: \" \",\n", + " axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial',\n", + " axisLabelPadding: 3,\n", + " color:\"rgb(0, 0, 0)\",\n", + " font: {size: 20, family:\"Arial\"},\n", + " //ticks: 10,\n", + " tickLength:0,\n", + " min: dos_x_max_min[1],//0,\n", + " max: dos_x_max_min[0],//1,\n", + " tickDecimals: 0,\n", + " ticks: [[ dosLabelPos ,'DOS']],\n", + " //tickFormatter: MyFormatter\n", + " panRange: false\n", + " },\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " grid: {\n", + " labelMargin: 15,\n", + " hoverable: true,\n", + " //borderWidth : 1000,\n", + " //show : false,\n", + " // //backgroundColor: { colors: [ \"#fff\", \"#eee\" ] },\n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] },\n", + " borderWidth: {\n", + " top: 2,\n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null\n", + " }\n", + " }\n", + " }\n", + " var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();\n", + " var image_dos = plot_dos.toDataURL();\n", + " image_dos = image_dos.replace(\"image/png\",\"image/octet-stream\");\n", + " image_dos = image_dos;\n", + " document.getElementById(img_dos_id).href= image_dos;\n", + " //alert(\"dos done.\")\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + " //alert(\"tag: plot_dos \" + i)\n", + " //i=0;\n", + "\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + "//----Plot DOS----------------------\n", + " var dos_plotdata = [];\n", + " //alert(\"dos:\"+dos_obj_all[i])\n", + " var xdos = dos_obj_all[i][\"dos_x_axis\"];\n", + " var ydos = dos_obj_all[i][\"dos_y_axis\"][0];\n", + " var dosLabelPos = Math.max.apply(Math, ydos)/2;\n", + " var d2 = [];\n", + " for (var ii = 0; ii < xdos.length; ii+=1) {\n", + " d2.push([ydos[ii],xdos[ii]]);\n", + " }\n", + " var plotData2={ shadowSize: 0, color: 'black' , data: d2};\n", + " dos_plotdata.push(plotData2);\n", + " //alert(\"dos_plotdata\"+JSON.stringify(dos_plotdata[0]));\n", + " \n", + " function find_xaxis_max_min(data, lowerbound, upperbound)\n", + " {\n", + " //data[xaxis,y] find the max and min value of x axis\n", + " //alert(\"dos[0]:\" + data[0][\"data\"]);\n", + " //alert(\"Bounds: \" + lowerbound + \" , \" + upperbound)\n", + " var n_data = data.length;\n", + " //alert(\"N dos: \" + n_data);\n", + " var data_min = 1000000;\n", + " var data_max = -1000000;\n", + " var data_current = 0;\n", + " for (var i = 0; i < n_data; i++)\n", + " {\n", + " if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))\n", + " {\n", + " data_current = data[i][0];\n", + " //alert(\"data[i]: \" + data[i] + \"data[i][0]: \" + data_current);\n", + " if(data_current >= data_max)\n", + " {\n", + " data_max = data_current;\n", + " }\n", + " if(data_current <= data_min)\n", + " {\n", + " data_min = data_current;\n", + " }\n", + " }\n", + " }\n", + " var data_max_min = [data_max, data_min];\n", + " //alert(\"data_max_min: \" + data_max_min);\n", + " return data_max_min;\n", + " }\n", + " var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0][\"data\"], lowerLim, upperLim);\n", + " var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;\n", + " //alert(\"dos_x_max_min:\"+dos_x_max_min+\", dosLabelPos:\"+dosLabelPos);\n", + " var options_dos ={\n", + " canvas: true,\n", + " series: {\n", + " lines: { show: true, lineWidth:2 },\n", + " points: { show: false }\n", + " },\n", + "\n", + " yaxis: { \n", + " axisLabel: \"\", \n", + " axisLabelUseCanvas: true,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " xaxis: {\n", + " axisLabel: \" \",\n", + " axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial',\n", + " axisLabelPadding: 3,\n", + " color:\"rgb(0, 0, 0)\",\n", + " font: {size: 20, family:\"Arial\"},\n", + " //ticks: 10,\n", + " tickLength:0,\n", + " min: dos_x_max_min[1],//0,\n", + " max: dos_x_max_min[0],//1,\n", + " tickDecimals: 0,\n", + " ticks: [[ dosLabelPos ,'DOS']],\n", + " //tickFormatter: MyFormatter\n", + " panRange: false\n", + " },\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " grid: {\n", + " labelMargin: 15,\n", + " hoverable: true,\n", + " //borderWidth : 1000,\n", + " //show : false,\n", + " // //backgroundColor: { colors: [ \"#fff\", \"#eee\" ] },\n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] },\n", + " borderWidth: {\n", + " top: 2,\n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null\n", + " }\n", + " }\n", + " }\n", + " var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();\n", + " var image_dos = plot_dos.toDataURL();\n", + " image_dos = image_dos.replace(\"image/png\",\"image/octet-stream\");\n", + " image_dos = image_dos;\n", + " document.getElementById(img_dos_id).href= image_dos;\n", + " //alert(\"dos done.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "tags": [ + "init_jquery" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"http://code.jquery.com/jquery-1.8.3.min.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"http://code.jquery.com/jquery-1.8.3.min.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "tags": [ + "init_flot" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.js\"></script>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "tags": [ + "init_flot_axislabels" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.axislabels.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.axislabels.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "tags": [ + "init_flot_navigate" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.navigate.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.navigate.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "tags": [ + "init_flot_selection" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.selection.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.selection.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": { + "tags": [ + "js_query_beforeafter" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "//jquery.beforeafter.min.js\n", + "!function(e){e.fn.beforeafter=function(i){var t=e.extend({touch:!0,message:\"Slide\",hide_message:!0,reset:!0,reset_delay:3e3,drag_horizontal:!0,split_horizontal:!0\n", + "},i);return this.each(function(){var i=e(this),a=i.find(\"img\"),n=a.data(\"aftersrc\"),s=i.width(),d=0;a.after('<div class=\"g-img-after\"><img style=\"width: '+s+'px;\" src=\"'+n+'\"></div>'),\n", + "a.addClass(\"g-img-before\").width(s),i.append('<div class=\"g-img-divider\"><span>'+t.message+\"</span></div>\"),d=i.height(),t.split_horizontal||i.addClass(\"g-vertical\"),\n", + "i.on(\"mouseenter touchstart\",function(e){var t=i.data(\"reset-timer\");t&&(window.clearTimeout(t),i.data(\"reset-timer\",!1))}).on(\"mousemove touchmove\",function(a){\n", + "var n=0,o=0,r=i.find(\".g-img-divider span\");if(t.drag_horizontal)n=a.pageX-i.offset().left,o=n/s*100;else{var f=i.offset().top-e(window).scrollTop();n=a.clientY/f,\n", + "o=(a.clientY-f)/d*100}if(t.touch&&\"undefined\"!=typeof a.originalEvent.touches){var g=a.originalEvent.touches[0];o=t.drag_horizontal?(g.pageX-i.offset().left)/s*100:(g.pageY-i.offset().top)/d*100;\n", + "}t.split_horizontal?(i.find(\".g-img-after\").css(\"left\",o+\"%\"),i.find(\".g-img-divider\").css(\"left\",o+\"%\")):(i.find(\".g-img-after\").css(\"top\",o+\"%\"),i.find(\".g-img-divider\").css(\"top\",o+\"%\")),\n", + "t.hide_message&&r.is(\":visible\")&&r.fadeOut()}).on(\"mouseleave touchend touchcancel\",function(e){var a=i.data(\"reset-timer\"),n=i.find(\".g-img-divider span\");\n", + "t.reset&&(a||(a=window.setTimeout(function(){t.split_horizontal?(i.find(\".g-img-after\").animate({left:\"50%\"},500),i.find(\".g-img-divider\").animate({left:\"50%\"\n", + "},500,function(){n.fadeIn()})):(i.find(\".g-img-after\").animate({top:\"50%\"},500),i.find(\".g-img-divider\").animate({top:\"50%\"},500,function(){n.fadeIn()})),\n", + "i.data(\"reset-timer\",!1)},t.reset_delay),i.data(\"reset-timer\",a)))})}),this}}(jQuery);\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + "//jquery.beforeafter.min.js\n", + "!function(e){e.fn.beforeafter=function(i){var t=e.extend({touch:!0,message:\"Slide\",hide_message:!0,reset:!0,reset_delay:3e3,drag_horizontal:!0,split_horizontal:!0\n", + "},i);return this.each(function(){var i=e(this),a=i.find(\"img\"),n=a.data(\"aftersrc\"),s=i.width(),d=0;a.after('<div class=\"g-img-after\"><img style=\"width: '+s+'px;\" src=\"'+n+'\"></div>'),\n", + "a.addClass(\"g-img-before\").width(s),i.append('<div class=\"g-img-divider\"><span>'+t.message+\"</span></div>\"),d=i.height(),t.split_horizontal||i.addClass(\"g-vertical\"),\n", + "i.on(\"mouseenter touchstart\",function(e){var t=i.data(\"reset-timer\");t&&(window.clearTimeout(t),i.data(\"reset-timer\",!1))}).on(\"mousemove touchmove\",function(a){\n", + "var n=0,o=0,r=i.find(\".g-img-divider span\");if(t.drag_horizontal)n=a.pageX-i.offset().left,o=n/s*100;else{var f=i.offset().top-e(window).scrollTop();n=a.clientY/f,\n", + "o=(a.clientY-f)/d*100}if(t.touch&&\"undefined\"!=typeof a.originalEvent.touches){var g=a.originalEvent.touches[0];o=t.drag_horizontal?(g.pageX-i.offset().left)/s*100:(g.pageY-i.offset().top)/d*100;\n", + "}t.split_horizontal?(i.find(\".g-img-after\").css(\"left\",o+\"%\"),i.find(\".g-img-divider\").css(\"left\",o+\"%\")):(i.find(\".g-img-after\").css(\"top\",o+\"%\"),i.find(\".g-img-divider\").css(\"top\",o+\"%\")),\n", + "t.hide_message&&r.is(\":visible\")&&r.fadeOut()}).on(\"mouseleave touchend touchcancel\",function(e){var a=i.data(\"reset-timer\"),n=i.find(\".g-img-divider span\");\n", + "t.reset&&(a||(a=window.setTimeout(function(){t.split_horizontal?(i.find(\".g-img-after\").animate({left:\"50%\"},500),i.find(\".g-img-divider\").animate({left:\"50%\"\n", + "},500,function(){n.fadeIn()})):(i.find(\".g-img-after\").animate({top:\"50%\"},500),i.find(\".g-img-divider\").animate({top:\"50%\"},500,function(){n.fadeIn()})),\n", + "i.data(\"reset-timer\",!1)},t.reset_delay),i.data(\"reset-timer\",a)))})}),this}}(jQuery);" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": { + "tags": [ + "js_compare_slide" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "var div_str = '';\n", + "//div_str = '<style> .g-before-after{position:relative;overflow:hidden}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%} </style>'\n", + "//div_str += '<script>$(\\'#div_compare_containerx\\').beforeafter(); </script>';\n", + "//div_str +='<script type=\\\"text/javascript\\\" src=\\\"https://github.com/jquery/jquery/blob/master/src/jquery.js\\\"></script> '\n", + "//div_str += '<div class=\\\"g-before-after\\\" id=\\\"div_compare_containerx\\\">';\n", + "div_str +='<img src = \\\"'\n", + "\n", + "var src1 = image_band_links_selected[0];\n", + "var src2 = image_band_links_selected[1];\n", + "var tmp_src1 = src1;\n", + "var tmp_src2 = src2;\n", + "//src1 = \"https://images4.alphacoders.com/640/640956.jpg\";\n", + "//src2 = \"http://imgmr.com/wp-content/uploads/2016/06/SAO-anime.jpg\";\n", + "div_str +=src1;\n", + "div_str += '\\\" data-aftersrc=\\\"'\n", + "div_str +=src2;\n", + "//div_str += '\\\"></div>';\n", + "div_str += '\\\"/>';\n", + "//#div_compare_containerx\n", + "document.getElementById(\"div_compare_containerx\").innerHTML = div_str;\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "//beakerx.image_band_links[i]\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + "var div_str = '';\n", + "//div_str = '<style> .g-before-after{position:relative;overflow:hidden}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%} </style>'\n", + "//div_str += '<script>$(\\'#div_compare_containerx\\').beforeafter(); </script>';\n", + "//div_str +='<script type=\\\"text/javascript\\\" src=\\\"https://github.com/jquery/jquery/blob/master/src/jquery.js\\\"></script> '\n", + "//div_str += '<div class=\\\"g-before-after\\\" id=\\\"div_compare_containerx\\\">';\n", + "div_str +='<img src = \\\"'\n", + "\n", + "var src1 = image_band_links_selected[0];\n", + "var src2 = image_band_links_selected[1];\n", + "var tmp_src1 = src1;\n", + "var tmp_src2 = src2;\n", + "//src1 = \"https://images4.alphacoders.com/640/640956.jpg\";\n", + "//src2 = \"http://imgmr.com/wp-content/uploads/2016/06/SAO-anime.jpg\";\n", + "div_str +=src1;\n", + "div_str += '\\\" data-aftersrc=\\\"'\n", + "div_str +=src2;\n", + "//div_str += '\\\"></div>';\n", + "div_str += '\\\"/>';\n", + "//#div_compare_containerx\n", + "document.getElementById(\"div_compare_containerx\").innerHTML = div_str;\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "//beakerx.image_band_links[i]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "tags": [ + "process_band_dos_data_python" + ] + }, + "outputs": [], + "source": [ + "#tag:python_2\n", + "import urllib.request, json\n", + "import numpy as np\n", + "import math\n", + "\n", + "#======Define global objs============\n", + "info_all = []\n", + "band_obj_all = []\n", + "dos_obj_all = []\n", + "\n", + "def load_jsonfile(path):\n", + " #with open(path, encoding='utf-8') as band_file: \n", + " # return json.load(band_file)\n", + "\n", + " \n", + " with urllib.request.urlopen(path) as url:\n", + " data = json.loads(url.read().decode())\n", + " return data\n", + "\n", + "#-----Get the labels for x axis---------------\n", + "def get_label_flag(coor_array):\n", + " #np.sort(coor_array)\n", + " x = coor_array[0]\n", + " y = coor_array[1]\n", + " z = coor_array[2]\n", + " coor =np.sort([x,y,z])\n", + " xx = coor[0]\n", + " yy = coor[1]\n", + " zz = coor[2]\n", + " coor = [xx, yy, zz]\n", + " #pprint(coor)\n", + " if (coor == [0, 0.5, 0.5]):\n", + " return \"X\"\n", + " if (coor == [0, 0.0, 0.5]):\n", + " return \"M\"\n", + " elif (coor == [0.5, 0.5, 0.5]):\n", + " return \"L\"\n", + " elif (coor == [0.375, 0.375, 0.75]):\n", + " return \"K\"\n", + " elif (coor == [0.25, 0.5, 0.75]):\n", + " return \"W\"\n", + " elif (coor == [0, 0, 0]):\n", + " return \"\\u0393\"\n", + " elif (coor == [0.25, 0.625, 0.625]):\n", + " return \"U\"\n", + " else:\n", + " return \"?\"\n", + "\n", + "#============Process the band structure data============\n", + "def get_band_obj(band_path, dos_fermi_energy):\n", + "\n", + " #band_data: read from json file \n", + " #Load the data files for band\n", + " band_data = load_jsonfile(band_path)\n", + " \n", + " #---------Read section_k_band_segment------------\n", + " section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']\n", + " \n", + " #--------Get the number of k band segments-------------\n", + " N_k_band_segments = len(section_k_band_segment)\n", + " \n", + " #----------Get the total number of k points in all segments---------\n", + " N_k_points_all = 0\n", + " for i in range(N_k_band_segments):\n", + " band_k_points = section_k_band_segment[i]['band_k_points']\n", + " N_k_points_all = N_k_points_all + len(band_k_points)\n", + " \n", + " #--------Get the x axis for the band structure figure: the coordinates of k points in 1D\n", + " # store in k_coor_1D[N_k_points_total]-----------------\n", + "\n", + " band_distance_segments = np.zeros(N_k_band_segments)\n", + " for i in range(N_k_band_segments):\n", + " [[x1, y1, z1],[x2, y2, z2]]= section_k_band_segment[i]['band_segm_start_end'] #\"band_segm_start_end\": [[0.5, 0.0, 0.5],[0.5, 0.25, 0.75]],\n", + " band_distance_segments[i] = math.pow((x1-x2), 2) + math.pow((y1-y2), 2) + math.pow((z1-z2), 2)\n", + "\n", + " \n", + " band_distance_total = math.fsum(band_distance_segments)\n", + " #print(band_distance_segments)\n", + " average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total\n", + " \n", + " #Prepare the parameters to rescale the k coordinates into [0,1]\n", + " step_k_point = 1.0 / N_k_points_all\n", + " step_k_point = (1.0 + step_k_point) / N_k_points_all\n", + " \n", + " # \n", + " k_coor_1D = np.zeros((N_k_points_all))\n", + " for i_k_points in range(N_k_points_all):\n", + " k_coor_1D[i_k_points] = round( step_k_point * i_k_points, 3)\n", + " #for i in range(N_k_band_segments):\n", + " # ki[i] = \n", + " \n", + "\n", + " #--------Get the eigenvalues of each band trajectory--------------\n", + " N_k_points_per_segment = len(section_k_band_segment[0]['band_energies'][0]) #suppose the numebr of k points in all the segments are the same\n", + " N_bands = len(section_k_band_segment[0]['band_energies'][0][0])\n", + " band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues\n", + " N_k_points_all = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " band_energies = section_k_band_segment[i_segments]['band_energies']\n", + " N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized\n", + " N_k_points_per_segment = len(band_energies[0])\n", + " for i_k_points in range(N_k_points_per_segment):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))\n", + " N_k_points_all = N_k_points_all + 1\n", + " \n", + " \n", + " N_labels = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " for j in range(2):\n", + " labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];\n", + " N_labels = N_labels + 1\n", + "\n", + " label_flag = [\"\" for i in range(N_labels)] #stores the flags of the labels (X, W, G, etc)\n", + "\n", + " i_label = 0\n", + " label_flag_last_final = \"\"\n", + " label_flag_current_initial = \"\"\n", + " for i_segments in range(N_k_band_segments):\n", + " labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0];\n", + " labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1];\n", + " np.sort(labels_coor_0)\n", + " np.sort(labels_coor_1)\n", + " label_flag_0 = get_label_flag(labels_coor_0)\n", + " label_flag_1 = get_label_flag(labels_coor_1)\n", + " label_flag_current_initial = label_flag_0\n", + " if(label_flag_last_final == \"\"):\n", + " label_flag_last_final = label_flag_0\n", + "\n", + " if(label_flag_last_final == label_flag_current_initial):\n", + " label_flag[i_label] = label_flag_current_initial\n", + " else:\n", + " label_flag[i_label] = \"\".join([label_flag_last_final, '|', label_flag_current_initial])\n", + " label_flag_last_final = label_flag_1\n", + " \n", + "\n", + " i_label = i_label + 1\n", + " if(i_segments == N_k_band_segments - 1):\n", + " label_flag[i_label] = label_flag_1\n", + " i_label = i_label + 1\n", + "\n", + " N_labels = i_label\n", + " \n", + " #------------Get the coordinates for the labels------------\n", + " #label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels\n", + " label_coor_relative = np.zeros((N_labels))\n", + " for i_label in range(N_labels):\n", + " #Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates\n", + " #x = labels_coor_0[0]\n", + " #y = labels_coor_0[1]\n", + " #z = labels_coor_0[2]\n", + " #label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)\n", + " label_coor_relative[i_label] = step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all);\n", + "\n", + " #----Store the label-----------\n", + " label_obj =[['' for i in range(2)] for j in range(N_labels)]\n", + " for i_label in range(N_labels):\n", + " label_obj[i_label][0] = label_coor_relative[i_label]\n", + " label_obj[i_label][1] = label_flag[i_label]\n", + " \n", + " #print(label_obj)\n", + " \n", + " \n", + " #Rescal the energies with respect to dos_fermi_energy\n", + " for i_k_points in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][i_k_points] = band_energies_all[i_bands][i_k_points] - dos_fermi_energy\n", + "\n", + " #-------Get VBM, CBM----------------\n", + "\n", + " HOMO = -1000\n", + " LUMO = 1000\n", + " coor_k_point_HOMO = np.zeros((3)) #the coordinate of k point that stores HOMO\n", + " coor_k_point_LUMO = np.zeros((3)) #the coordinate of k point that stores LUMO\n", + " #band_gap_direct = 0.0\n", + " band_gap_indirect = 0.0\n", + " \n", + " \n", + " #band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " #band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " band_energy_max = 10\n", + " band_energy_min = -10\n", + " #N_band_energy_index = 10000\n", + " #band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " #N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " #i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level\n", + "\n", + " for i_k_points_all in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " #i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)\n", + " #N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1\n", + " band_energy = band_energies_all[i_bands][i_k_points_all]\n", + " if(band_energy > 0):\n", + " if(band_energy < LUMO):\n", + " LUMO = band_energy\n", + " else:\n", + " if(band_energy > HOMO):\n", + " HOMO = band_energy\n", + " #for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO\n", + " # if(N_allowed_states[i_band_index] > 0):\n", + " # LUMO = band_energy_min + band_energy_step * i_band_index\n", + " print('HOMO, LUMO: ',HOMO, LUMO)\n", + " band_gap_indirect = abs(LUMO - HOMO)\n", + " \n", + " if(band_gap_indirect < 0.5): #VBM and CBM has to be found in another way for metals/charged system:\n", + " HOMO = -1000\n", + " LUMO = 1000\n", + " band_energy_max = 10\n", + " band_energy_min = 0\n", + " N_band_energy_index = 10000\n", + " band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " \n", + " #get the DOS and store in N_allowed_states[]\n", + " for i_k_points_all in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " band_energy = band_energies_all[i_bands][i_k_points_all]\n", + " if(band_energy_min < band_energy < band_energy_max):\n", + " i_band_index = math.floor((band_energy - band_energy_min) / band_energy_step)\n", + " N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1\n", + " if_gapped = 0\n", + " for i_band_index in range(N_band_energy_index): #go through the energy levels from the bottom\n", + " band_energy = band_energy_min + band_energy_step * i_band_index\n", + " if(N_allowed_states[i_band_index] == 0):\n", + " if_gapped = if_gapped + 1\n", + " if(band_energy > band_energy_max - 0.5) and (if_gapped == 0):\n", + " print(\"No gap found in this system. It seems to be a metal.\")\n", + " HOMO = 1000\n", + " LUMO = 1000\n", + " break\n", + " #print(\"At \", band_energy,\": # allowed states = \", N_allowed_states[i_band_index],\" if_gapped = \", if_gapped)\n", + " \n", + " if(N_allowed_states[i_band_index] > 0):\n", + " if(if_gapped * band_energy_step> 0.3 ): #above VBM-CBM gap: LUMO\n", + " if(band_energy < LUMO):\n", + " #print(\"LUMO got!\")\n", + " LUMO = band_energy\n", + " break #break before touching another gap that is above the band gap\n", + " if(if_gapped * band_energy_step < 0.3): #below VBM-CBM gap: HOMO\n", + " if(band_energy > HOMO):\n", + " #print(\"HOMO got!\")\n", + " HOMO = band_energy\n", + " \n", + " if_gapped = 0\n", + " \n", + " print('HOMO, LUMO for metal/charged system: ',HOMO, LUMO)\n", + " \n", + " '''\n", + "\n", + "# print('HOMO: ',tmp_HOMO_max)\n", + " HOMO_global = tmp_HOMO_max\n", + " LUMO_global = tmp_LUMO_min\n", + " band_gap_indirect = LUMO_global - HOMO_global\n", + " E_top_valence = HOMO_global\n", + " if(band_gap_indirect < 0):\n", + " band_gap_indirect = 0\n", + "\n", + " #Rescal HOMO and LUMO with respect to HOMO\n", + " HOMO_global = round((HOMO_global - E_top_valence), 3)\n", + " LUMO_global = round((LUMO_global - E_top_valence), 3)\n", + " '''\n", + " \n", + " \n", + " \n", + " #Find the position of HOMO, LUMO\n", + "\n", + " for i_k_points in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " if(abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001):\n", + " coor_k_point_HOMO = k_coor_1D[i_k_points]\n", + " if(abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001):\n", + " coor_k_point_LUMO = k_coor_1D[i_k_points] \n", + "\n", + "\n", + " \n", + " \n", + " #Store the band data to band_obj\n", + "\n", + " band_obj = {}\n", + " band_obj[\"band_x_axis\"] = np.array(k_coor_1D).tolist()\n", + " band_obj[\"band_y_axis\"] = np.array(band_energies_all).tolist()\n", + " band_obj[\"labels\"] = np.array(label_obj).tolist()\n", + " band_obj[\"HOMO_energy\"] = np.array(HOMO).tolist()\n", + " band_obj[\"HOMO_coor\"] = np.array(coor_k_point_HOMO).tolist()\n", + " band_obj[\"LUMO_energy\"] = np.array(LUMO).tolist()\n", + " band_obj[\"LUMO_coor\"] = np.array(coor_k_point_LUMO).tolist()\n", + " band_obj[\"average_N_k_points_per_inverse_distance\"] = np.array(average_N_k_points_per_inverse_distance).tolist()\n", + " \n", + "\n", + " \n", + " return band_obj\n", + "\n", + "\n", + "#===============Get the space group information===========\n", + "def get_space_group(band_data):\n", + " import pymatgen as mg\n", + " from pymatgen.symmetry.analyzer import SpacegroupAnalyzer\n", + "\n", + " simulation_cell = np.array(band_data[\"section_run\"][\"section_system\"][0].get('simulation_cell',\"empty\")) * 10000000000\n", + " atom_positions = np.array(band_data[\"section_run\"][\"section_system\"][0].get('atom_positions',\"empty\")) * 10000000000\n", + " atom_labels = np.array(band_data[\"section_run\"][\"section_system\"][0].get('atom_labels',\"empty\"))\n", + " structure = mg.Structure(simulation_cell,atom_labels, atom_positions, coords_are_cartesian = True)\n", + " \n", + " finder = SpacegroupAnalyzer(structure, symprec=1e-3, angle_tolerance=5)\n", + " space_group_symbol = finder.get_space_group_symbol()\n", + " lattice_constant = []\n", + " for item in structure.lattice.abc:\n", + " lattice_constant.append(item)\n", + " for i in range(len(lattice_constant)):\n", + " item = str(round(lattice_constant[i], 3))\n", + " lattice_constant[i] = item\n", + " \n", + " return [space_group_symbol, lattice_constant]\n", + "\n", + "#================Get the DOS data==============================\n", + "def get_dos_obj(dos_path):\n", + " #dos_data: read from json file \n", + " #Load the data files for dos\n", + " dos_data = load_jsonfile(dos_path)\n", + "\n", + " print(dos_path)\n", + " #N_dos_values = len(dos_data['sections']['section_run-0']['sections']['section_single_configuration_calculation-0']['section_dos'][0]['dos_energies'])\n", + " N_dos_values = len(dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'])\n", + " #in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]\n", + "\n", + " dos_energies = np.zeros((N_dos_values))\n", + " dos_energies_tmp = np.zeros((N_dos_values)) #tmp array for unit convertion\n", + " dos_values = np.zeros((N_dos_values))\n", + "\n", + " dos_energies_tmp = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies']\n", + " dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_values'][0]\n", + " \n", + "\n", + " dos_fermi_energy= dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0].get('dos_fermi_energy',\"empty\")\n", + " if(dos_fermi_energy == \"empty\"): #dos_fermi_energy is not available in EXCITING\n", + " dos_fermi_energy_exciting = dos_data['section_run']['section_single_configuration_calculation'].get('x_exciting_dos_fermi',\"empty\")\n", + " if(dos_fermi_energy_exciting == \"empty\"):\n", + " dos_fermi_energy = 0\n", + " else:\n", + " dos_fermi_energy = dos_fermi_energy_exciting / (1.60217656535 * pow(10,-19))\n", + " else:\n", + " dos_fermi_energy = dos_fermi_energy / (1.60217656535 * pow(10,-19))\n", + " print(\"dos_fermi_energy:\", dos_fermi_energy)\n", + " \n", + " for i_dos_values in range(N_dos_values):\n", + " dos_energies[i_dos_values] = 0.0\n", + " dos_energies[i_dos_values] = dos_energies_tmp[i_dos_values] / (1.60217656535 * pow(10,-19))\n", + " dos_energies[i_dos_values] = round((dos_energies[i_dos_values] - dos_fermi_energy), 3) #reference with the fermi level\n", + "\n", + " dos_obj = {}\n", + " dos_obj[\"dos_x_axis\"] = np.array(dos_energies).tolist()\n", + " dos_obj[\"dos_y_axis\"] = np.array(dos_values).tolist()\n", + " dos_obj[\"dos_fermi_energy\"] = np.array(dos_fermi_energy).tolist()\n", + "\n", + " return dos_obj\n", + "\n", + "\n", + "def get_info_obj(band_path):\n", + "\n", + " #band_data: read from json file \n", + " #Load the data files for band\n", + " band_data = load_jsonfile(band_path)\n", + " info_obj = {}\n", + " #---------Read the information of the calculation--------\n", + " info_obj[\"program_name\"] = band_data[\"section_run\"][\"program_name\"];\n", + " info_obj[\"program_basis_set_type\"] = band_data[\"section_run\"][\"program_basis_set_type\"];\n", + " info_obj[\"atom_labels\"] = band_data[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " info_obj[\"XC_functional_name\"] = band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \" + \"+ band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"];\n", + " \n", + " #----------Get the space group information----------\n", + " \n", + " [space_group_symbol, lattice_constant] = get_space_group(band_data)\n", + " info_obj[\"space_group_symbol\"] = np.array(space_group_symbol).tolist()\n", + " info_obj[\"lattice_constant\"] = np.array(lattice_constant).tolist()\n", + " print(\"space group:\", info_obj[\"space_group_symbol\"])\n", + " print(\"lattice_constant:\", lattice_constant)\n", + " \n", + " return info_obj\n", + "\n", + "\n", + "#============main===========================================\n", + "\n", + "#import matplotlib.pyplot as plt\n", + "band_obj_all = []\n", + "dos_obj_all = []\n", + "info_obj_all = []\n", + "print(\"Number of materials: \", N_materials)\n", + "\n", + "for i in range (N_materials):\n", + " print(\"Material: \", i)\n", + " band_path = band_paths[i]\n", + " dos_path = dos_paths[i]\n", + " \n", + " \n", + " dos_obj = get_dos_obj(dos_path)\n", + " dos_fermi_energy = dos_obj[\"dos_fermi_energy\"]\n", + " band_obj = get_band_obj(band_path, dos_fermi_energy)\n", + " info_obj = get_info_obj(band_path)\n", + " \n", + " band_obj_all.append(band_obj)\n", + " dos_obj_all.append(dos_obj)\n", + " info_obj_all.append(info_obj)\n", + " \n", + " \n", + " print(\"average_N_k_points_per_inverse_distance: \", band_obj[\"average_N_k_points_per_inverse_distance\"])\n", + "\n", + "print(\"Finish processing data.\")\n", + "\n", + "#run_cell_by_tag('save_data_to_js')\n", + "\n", + "print(\"Initialization of visulization finished.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 331, + "metadata": { + "tags": [ + "js_plot" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + " \n", + "var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + " \n", + "var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%javascript\n", + "// BACKUP!\n", + "/*\n", + "//Main plot function for given material:\n", + " function plot_band_dos_i_backup(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)\n", + " {\n", + " //alert(\"plot_band_dos_i\")\n", + " //i=0;\n", + " lowerLim = -10\n", + " upperLim = 10\n", + " if_show_VBM = 0\n", + " if_compare = 0\n", + " i_in_compare_list = -1\n", + " //i=0;\n", + " var placeholder_band = \"#div_band\" + i.toString();\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var img_band_id = \"img_band\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + " var placeholder_band_compare = \"\";\n", + "\n", + " if(i_in_compare_list == 1)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\";\n", + " }\n", + " else if(i_in_compare_list == 2)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_2\";\n", + " }\n", + " else\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\"; // just for safe\n", + " }\n", + "\n", + " Object.size = function(obj) {\n", + " var size = 0, key;\n", + " for (key in obj) \n", + " {\n", + " if (obj.hasOwnProperty(key)) size++;\n", + " }\n", + " return size;\n", + " };\n", + "\n", + " //Get the number of bands\n", + " //alert(\"Getting band\")\n", + " //alert(band_obj_all)\n", + " //alert(\"band_obj_all got!\")\n", + " var N_bands = Object.size(band_obj_all[i][\"band_y_axis\"]);\n", + " var N_k_coors = Object.size(band_obj_all[i][\"band_x_axis\"]);\n", + " alert(band_obj_all[i][\"band_y_axis\"])\n", + " band_plotdata = [];\n", + "\n", + " for(var i_band =0; i_band < N_bands; i_band++)\n", + " {\n", + " var tmp_data = [];\n", + " for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)\n", + " {\n", + " tmp_data.push([band_obj_all[i][\"band_x_axis\"][j_k_coor],band_obj_all[i][\"band_y_axis\"][i_band][j_k_coor]]);\n", + " }\n", + " plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };\n", + " band_plotdata.push(plotData);\n", + " }\n", + "\n", + "\n", + " var tmp_data0 = [[0, 0], [1, 0]];\n", + " plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};\n", + " band_plotdata.push(plotData0);\n", + "\n", + " band_plotdata_overview = band_plotdata.slice(0);\n", + "\n", + " var HOMOdata= [[band_obj_all[i][\"HOMO_coor\"],band_obj_all[i][\"HOMO_energy\"]]];\n", + " HOMOlabel = [\"VBM\"];\n", + " plotHOMO={ shadowSize:0, color: 'blue', data: HOMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'blue'},lines:{show: false}, showLabels: true, labels: HOMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " var LUMOdata= [[band_obj_all[i][\"LUMO_coor\"],band_obj_all[i][\"LUMO_energy\"]]];\n", + " LUMOlabel = [\"CBM\"];\n", + " plotLUMO={ shadowSize:0, color: 'red', data: LUMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'red'},lines:{show: false}, showLabels: true, labels: LUMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " //if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + " if (if_show_VBM == 1)\n", + " {\n", + " band_plotdata.push(plotHOMO);\n", + " band_plotdata.push(plotLUMO);\n", + " }\n", + "\n", + " \n", + " alert(img_band_id + band_plotdata)\n", + " \n", + " //!!!FIXME: if ($(\"#showVBM:checked\").length > 0 && gap > 0.1) \n", + " //plotHOMOLUMO={ shadowSize:0, color: 'red', data: d5, points:{show:true, radius: 0.8 , fill: true}, showLabels: true, labels: d5label, labelPlacement: labelPos, canvasRender: true, cColor: 'red', cFont:\"1em Arial\" }\n", + "\n", + " var canvas_band;\n", + " var options_band = {\n", + " canvas: true,\n", + " //legend:{ type: \"canvas\" },\n", + " series: { lines: { show: true, lineWidth: 2 }, \n", + " points: { show: false } }, \n", + " xaxis: { \n", + " ticks: band_obj_all[i][\"labels\"], \n", + " color:\"#000\", \n", + " font: {size: 20}, \n", + " zoomRange: false,\n", + " panRange: false \n", + " }, \n", + " yaxis: { \n", + " axisLabel: \"Energy (eV)\", \n", + " axisLabelUseCanvas: true,\n", + " //axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20, family:\"Arial\"},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " zoom: { \n", + " interactive: true\n", + " },\n", + "\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " //selection: { mode: \"xy\", color: \"#86a6b4\" }, \n", + "\n", + " grid: { \n", + " labelMargin: 15,\n", + " hoverable: true, \n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] }, \n", + " borderWidth: {\n", + " top: 2, \n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null } \n", + " }\n", + " }\n", + " //var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);\n", + " //var plot_band = $.plot(\"#div_bandx\", band_plotdata, options_band);\n", + " var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas\n", + " image_band = plot_band.toDataURL();\n", + " image_band = image_band.replace(\"image/png\",\"image/octet-stream\");\n", + " //beakerx.image_band = image_band;\n", + " document.getElementById(img_band_id).href= image_band;\n", + " image_band_links[i] = image_band;\n", + " alert(\"band plot done.\")\n", + "\n", + "\n", + " //----Plot DOS----------------------\n", + " var dos_plotdata = [];\n", + " alert(\"dos:\"+dos_obj_all[i])\n", + " var xdos = dos_obj_all[i][\"dos_x_axis\"];\n", + " var ydos = dos_obj_all[i][\"dos_y_axis\"];\n", + " var dosLabelPos = Math.max.apply(Math, ydos)/2;\n", + " var d2 = [];\n", + " for (var ii = 0; ii < xdos.length; ii+=1) {\n", + " d2.push([ydos[ii],xdos[ii]]);\n", + " }\n", + " var plotData2={ shadowSize: 0, color: 'black' , data: d2}\n", + " dos_plotdata.push(plotData2)\n", + "\n", + " function find_xaxis_max_min(data, lowerbound, upperbound)\n", + " {\n", + " //data[xaxis,y] find the max and min value of x axis\n", + " //alert(\"dos[0]:\" + data[0][\"data\"]);\n", + " //alert(\"Bounds: \" + lowerbound + \" , \" + upperbound)\n", + " var n_data = data.length;\n", + " //alert(\"N dos: \" + n_data);\n", + " var data_min = 1000000;\n", + " var data_max = -1000000;\n", + " var data_current = 0;\n", + " for (var i = 0; i < n_data; i++)\n", + " {\n", + " if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))\n", + " {\n", + " data_current = data[i][0];\n", + " //alert(\"data[i]: \" + data[i] + \"data[i][0]: \" + data_current);\n", + " if(data_current >= data_max)\n", + " {\n", + " data_max = data_current;\n", + " }\n", + " if(data_current <= data_min)\n", + " {\n", + " data_min = data_current;\n", + " }\n", + " }\n", + " }\n", + " var data_max_min = [data_max, data_min];\n", + " //alert(\"data_max_min: \" + data_max_min);\n", + " return data_max_min;\n", + " }\n", + " var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0][\"data\"], lowerLim, upperLim);\n", + " var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;\n", + "\n", + " var options_dos ={\n", + " canvas: true,\n", + " series: {\n", + " lines: { show: true, lineWidth:2 },\n", + " points: { show: false }\n", + " },\n", + "\n", + " yaxis: { \n", + " axisLabel: \"\", \n", + " axisLabelUseCanvas: true,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " xaxis: {\n", + " axisLabel: \" \",\n", + " axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial',\n", + " axisLabelPadding: 3,\n", + " color:\"rgb(0, 0, 0)\",\n", + " font: {size: 20, family:\"Arial\"},\n", + " //ticks: 10,\n", + " tickLength:0,\n", + " min: dos_x_max_min[1],//0,\n", + " max: dos_x_max_min[0],//1,\n", + " tickDecimals: 0,\n", + " ticks: [[ dosLabelPos ,'DOS']],\n", + " //tickFormatter: MyFormatter\n", + " panRange: false\n", + " },\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " grid: {\n", + " labelMargin: 15,\n", + " hoverable: true,\n", + " //borderWidth : 1000,\n", + " //show : false,\n", + " // //backgroundColor: { colors: [ \"#fff\", \"#eee\" ] },\n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] },\n", + " borderWidth: {\n", + " top: 2,\n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null\n", + " }\n", + " }\n", + " }\n", + " var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();\n", + " var image_dos = plot_dos.toDataURL();\n", + " image_dos = image_dos.replace(\"image/png\",\"image/octet-stream\");\n", + " image_dos = image_dos;\n", + " document.getElementById(img_dos_id).href= image_dos;\n", + " \n", + " }\n", + "*/" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/band_structure_visualization-Copy1.ipynb b/band_structure_visualization-Copy1.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c78ff91f874a77ef49c5feed6f698083e86cfc78 --- /dev/null +++ b/band_structure_visualization-Copy1.ipynb @@ -0,0 +1,4968 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "init_cell": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<style>.container { width:100% !important; }</style>" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.core.display import display, HTML\n", + "display(HTML(\"<style>.container { width:100% !important; }</style>\"))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "init_cell": true + }, + "outputs": [], + "source": [ + "from IPython.core.display import Javascript\n", + "from IPython.display import display\n", + "\n", + "def run_cell_by_tag(tags):\n", + " display(Javascript(\"window.runCells('\"+tags+\"')\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "init_cell": true, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " code_show=true; \n", + " function code_toggle() {\n", + " if (code_show)\n", + " {\n", + " $('div.input').hide();\n", + " } \n", + " else \n", + " {\n", + " $('div.input').show();\n", + " }\n", + " code_show = !code_show\n", + " } \n", + " $( document ).ready(code_toggle);\n", + "</script>\n", + "The raw code for this notebook is by default hidden for easier reading.\n", + "To toggle on/off the raw code, click <a href=\"javascript:code_toggle()\">here</a>.\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " code_show=true; \n", + " function code_toggle() {\n", + " if (code_show)\n", + " {\n", + " $('div.input').hide();\n", + " } \n", + " else \n", + " {\n", + " $('div.input').show();\n", + " }\n", + " code_show = !code_show\n", + " } \n", + " $( document ).ready(code_toggle);\n", + "</script>\n", + "The raw code for this notebook is by default hidden for easier reading.\n", + "To toggle on/off the raw code, click <a href=\"javascript:code_toggle()\">here</a>." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "init_cell": true, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "<div align=\"left\" style=\"background-color: rgba(149,170,79, 1.0); width: 100%; height: 390px; overflow: hidden;\">\n", + " <div >\n", + " <table>\n", + " <tr></tr>\n", + " <tr>\n", + " <td><img src=\"Nomad_tutorial_head.png\"></td>\n", + " </tr>\n", + " </table>\n", + " </div>\n", + "\n", + " <br><br>\n", + " <div style=\"position:relative; left:3%\"><font size=6em color=\"#20335d\" ><b> - Visualization of the band structure of materials </b></font></div>\n", + " <p style=\"position:relative;left:10%; \">\n", + " <br>\n", + " Created by:\n", + "\n", + " Xiangyue Liu<sup>1</sup>(<a href=\"mailto:xyliu@fhi-berlin.mpg.de\">email</a>),\n", + " \n", + " Fawzi Mohamed<sup>1</sup>,\n", + " \n", + " and Luca M. Ghiringhelli<sup>1</sup>(<a href=\"mailto:ghiringhelli@fhi-berlin.mpg.de\">email</a>), <br>\n", + "\n", + " <br><br>\n", + " <sup>1</sup> Fritz Haber Institute of the Max Planck Society, Faradayweg 4-6, D-14195 Berlin, Germany <br>\n", + " <br>\n", + "\n", + "\n", + " </p>\n", + " <br>\n", + " <div style=\"position:relative;bottom:3%\">\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#999999\" size=\"10em\">v2.0.0</font></div>\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#666666\" size=\"2.7em\">[Last updated: August 5, 2019]</font></div>\n", + " </div>\n", + "\n", + "</div>\n", + "\n", + "\n", + "<div style='text-align: right;'>\n", + " <a href=\"https://analytics-toolkit.nomad-coe.eu/home/\" class=\"btn btn-primary\" style=\"font-size:larger;\">Back to Analytics Home</a> \n", + " <a href=\"https://www.nomad-coe.eu/\" class=\"btn btn-primary\" style=\"font-size:larger; \">Back to nomad-coe</a> \n", + "</div>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "\n", + "\n", + "<div align=\"left\" style=\"background-color: rgba(149,170,79, 1.0); width: 100%; height: 390px; overflow: hidden;\">\n", + " <div >\n", + " <table>\n", + " <tr></tr>\n", + " <tr>\n", + " <td><img src=\"Nomad_tutorial_head.png\"></td>\n", + " </tr>\n", + " </table>\n", + " </div>\n", + "\n", + " <br><br>\n", + " <div style=\"position:relative; left:3%\"><font size=6em color=\"#20335d\" ><b> - Visualization of the band structure of materials </b></font></div>\n", + " <p style=\"position:relative;left:10%; \">\n", + " <br>\n", + " Created by:\n", + "\n", + " Xiangyue Liu<sup>1</sup>(<a href=\"mailto:xyliu@fhi-berlin.mpg.de\">email</a>),\n", + " \n", + " Fawzi Mohamed<sup>1</sup>,\n", + " \n", + " and Luca M. Ghiringhelli<sup>1</sup>(<a href=\"mailto:ghiringhelli@fhi-berlin.mpg.de\">email</a>), <br>\n", + "\n", + " <br><br>\n", + " <sup>1</sup> Fritz Haber Institute of the Max Planck Society, Faradayweg 4-6, D-14195 Berlin, Germany <br>\n", + " <br>\n", + "\n", + "\n", + " </p>\n", + " <br>\n", + " <div style=\"position:relative;bottom:3%\">\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#999999\" size=\"10em\">v2.0.0</font></div>\n", + " <div style=\"position:absolute;right:5%;bottom: 0%;\"><font color=\"#666666\" size=\"2.7em\">[Last updated: August 5, 2019]</font></div>\n", + " </div>\n", + "\n", + "</div>\n", + "\n", + "\n", + "<div style='text-align: right;'>\n", + " <a href=\"https://analytics-toolkit.nomad-coe.eu/home/\" class=\"btn btn-primary\" style=\"font-size:larger;\">Back to Analytics Home</a> \n", + " <a href=\"https://www.nomad-coe.eu/\" class=\"btn btn-primary\" style=\"font-size:larger; \">Back to nomad-coe</a> \n", + "</div>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "init_cell": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " window.findCellIndicesByTag = function findCellIndicesByTag(tagName) {\n", + " return (Jupyter.notebook.get_cells()\n", + " .filter(\n", + " ({metadata: {tags}}) => tags && tags.includes(tagName)\n", + " )\n", + " .map((cell) => Jupyter.notebook.find_cell_index(cell))\n", + " );\n", + " };\n", + "\n", + "\n", + " window.runCells = function runPlotCells(tags) {\n", + " var c = window.findCellIndicesByTag(tags);\n", + " Jupyter.notebook.execute_cells(c);\n", + " };\n", + "</script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " window.findCellIndicesByTag = function findCellIndicesByTag(tagName) {\n", + " return (Jupyter.notebook.get_cells()\n", + " .filter(\n", + " ({metadata: {tags}}) => tags && tags.includes(tagName)\n", + " )\n", + " .map((cell) => Jupyter.notebook.find_cell_index(cell))\n", + " );\n", + " };\n", + "\n", + "\n", + " window.runCells = function runPlotCells(tags) {\n", + " var c = window.findCellIndicesByTag(tags);\n", + " Jupyter.notebook.execute_cells(c);\n", + " };\n", + "</script>" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "init_cell": true, + "tags": [ + "search_materials" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<br><br>\n", + "\n", + "<p style=\"color: #20335d;font-weight: 450; font-size: 14pt;font-family: Arial;\"> This tutorial visulizes the band structures and density of states (DOS) of the NOMAD materials.</p>\n", + "<br><br>\n", + "\n", + "<style>\n", + ".button {\n", + " background-color: #e7e7e7;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 15px 32px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-family: Arial;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + "}\n", + "\n", + " .text-normal-black{\n", + " color: #000;font-weight: 200; font-size: 10pt;\n", + " font-family: Arial;\n", + " }\n", + " .div_band_dos{\n", + " box-sizing: border-box;\n", + " width: 100%;\n", + " height: 600px;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band_dos_compare{\n", + " box-sizing: border-box;\n", + " width: 1600px;\n", + " height: 600px;\n", + " color: #00AEFF;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 37%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_dos{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 13%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_tools{\n", + " color: #20335d;font-weight: 150; font-size: 13pt;\n", + " width: 35%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " margin-left:20pt;\n", + " float:left;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_checkbox_compare{\n", + " color: #888;font-weight: 150; font-size: 12pt;\n", + " width: 10%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " border: solid #fff 1px;\n", + " float:right;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_overview{\n", + " width: 300px;\n", + " height: 200px;\n", + " background-color: #fff;\n", + " margin-left:10px; \n", + " margin-top: 20px;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .button_tools {\n", + " background-color: #F0F0F0;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 10px 15px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + " font-family: Arial;\n", + "\n", + " }\n", + "\n", + " \n", + " .g-before-after{position:relative;overflow:hidden;width:500px}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%}\n", + "</style>\n", + "\n", + "<script>\n", + " //Search for certain keyword: https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\n", + " //FjiYy5-ETRCrs5ktzJA55w/bOY0cPkBvvNAY7pZdbginlKXJ2kF\n", + " //\"upload_id\"/\"calc_id\"\n", + " \n", + " //Global variables\n", + " var paths_section_k_band_segment = []; \n", + " var paths_section_dos = [];\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " \n", + " var band_paths = [];\n", + " var dos_paths = [];\n", + " var N_materials = 0; //Number of materials that have both band and DOS in the same calculation \n", + " \n", + " \n", + " function getJSON(url) {\n", + " var resp ;\n", + " var xmlHttp ;\n", + "\n", + " resp = '' ;\n", + " xmlHttp = new XMLHttpRequest();\n", + "\n", + " if(xmlHttp != null)\n", + " {\n", + " xmlHttp.open( \"GET\", url, false );\n", + " xmlHttp.send( null );\n", + " resp = xmlHttp.responseText;\n", + " }\n", + "\n", + " return resp;\n", + " }\n", + " function match_band_dos()\n", + " {\n", + " //TMP for local tests\n", + " /*\n", + " paths_section_k_band_segment = [\"data/kOJR-AlPSgiNG9AdZoxd4g_9mxjIU0edrPosfsTc4uyDG9H_UXr.json\",\"data/kOJR-AlPSgiNG9AdZoxd4g_lfkGCmWozYENeiGhu5W7dJUqLTkj.json\"];\n", + " paths_section_dos = [\"data/kOJR-AlPSgiNG9AdZoxd4g_8tEGnaz0yY91eSyysKZkIUH9qx8J.json\", \"data/kOJR-AlPSgiNG9AdZoxd4g_lxUT3viRZcC_1IsH_KvO5tChAtV1.json\"];\n", + " */\n", + "\n", + " //band_paths = [];\n", + " //dos_paths = [];\n", + " //N_materials = 0; \n", + " \n", + " var data_k_band = [];\n", + " for(var i_path_k_band = 0; i_path_k_band < paths_section_k_band_segment.length; i_path_k_band ++)\n", + " {\n", + " var i_data_k_band_json = JSON.parse(getJSON(paths_section_k_band_segment[i_path_k_band]));\n", + " var i_data_k_band = {};\n", + " i_data_k_band[\"program_name\"] = i_data_k_band_json[\"section_run\"][\"program_name\"];\n", + " i_data_k_band[\"k_mesh_points\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_k_band[\"simulation_cell\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_k_band[\"atom_positions\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_k_band[\"atom_labels\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_k_band[\"XC_functional_name\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_k_band[\"path\"] = paths_section_k_band_segment[i_path_k_band];\n", + " data_k_band.push(i_data_k_band);\n", + " }\n", + "\n", + " var data_dos = [];\n", + " for(var i_path_dos = 0; i_path_dos < paths_section_dos.length; i_path_dos ++)\n", + " {\n", + " var i_data_dos_json = JSON.parse(getJSON(paths_section_dos[i_path_dos]));\n", + " var i_data_dos = {};\n", + " i_data_dos[\"program_name\"] = i_data_dos_json[\"section_run\"][\"program_name\"];\n", + " i_data_dos[\"k_mesh_points\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_dos[\"simulation_cell\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_dos[\"atom_positions\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_dos[\"atom_labels\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_dos[\"XC_functional_name\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_dos[\"path\"] = paths_section_dos[i_path_dos];\n", + " data_dos.push(i_data_dos); \n", + " }\n", + "\n", + " //Matching: band[i] ~ dos[i] (the same systems are arranged with the same index)\n", + " band_paths = [];\n", + " dos_paths = [];\n", + " N_materials = 0;\n", + " for(var i_k_band = 0; i_k_band < data_k_band.length; i_k_band ++)\n", + " {\n", + " for(var i_dos = 0; i_dos < data_dos.length; i_dos ++)\n", + " {\n", + " if(data_k_band[i_k_band][\"program_name\"] != data_dos[i_dos][\"program_name\"])\n", + " continue; \n", + " //if(data_k_band[i_k_band][\"k_mesh_points\"].join() != data_dos[i_dos][\"k_mesh_points\"].join())\n", + " // continue;\n", + " if(data_k_band[i_k_band][\"simulation_cell\"].join() != data_dos[i_dos][\"simulation_cell\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_positions\"].join() != data_dos[i_dos][\"atom_positions\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_labels\"].join() != data_dos[i_dos][\"atom_labels\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"XC_functional_name\"] != data_dos[i_dos][\"XC_functional_name\"])\n", + " continue;\n", + " band_paths.push(data_k_band[i_k_band][\"path\"]);\n", + " dos_paths.push(data_dos[i_dos][\"path\"]);\n", + " N_materials ++;\n", + " }\n", + " }\n", + " //Pass the arrays to python\n", + "\n", + " var command = \"N_materials = \" + N_materials + \";\"\n", + " var kernel = IPython.notebook.kernel;\n", + " command += \"band_paths = \" + \"[\\'\" + band_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " command += \"dos_paths = \" + \"[\\'\" + dos_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " kernel.execute(command);\n", + " \n", + " \n", + " }\n", + "\n", + " function get_paths_from_search_results(result_json, div_id_search_results,div_head)\n", + " {\n", + " paths = [];\n", + " search_results_content = [div_head, '<table>', '<tr><th>Chemical formula</th><th>Spacegroup</th><th>Code</th><th>XC functional</th><th>Upload ID</th><th>Calculation ID</th><th>URL</th></tr>'];\n", + " for(var i_key in result_json)\n", + " {\n", + " if(i_key == \"results\")\n", + " {\n", + " for(var system in result_json[i_key])\n", + " {\n", + " //Get the path to the data files (json): https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/upload_id/calc_id \n", + " path = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/\" + result_json[i_key][system][\"upload_id\"] + \"/\" + result_json[i_key][system][\"calc_id\"]\n", + " paths.push(path);\n", + " \n", + " //Show the results in div\n", + " // \"formula\" \"spacegroup_symbol\" \"code_name\" \"xc_functional\"\n", + " content = '<tr>';\n", + " content += '<td>' + result_json[i_key][system][\"formula\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"spacegroup_symbol\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"code_name\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"xc_functional\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"upload_id\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"calc_id\"] + '</td>'; \n", + " content += '<td>' + path + '</td>';\n", + " content += '</tr>';\n", + " search_results_content.push(content);\n", + " }\n", + " }\n", + " }\n", + " search_results_content.push('</table>');\n", + " document.getElementById(div_id_search_results).innerHTML = search_results_content.join('');\n", + " return paths\n", + " }\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " function submit_search()\n", + " {\n", + " \n", + " var result;\n", + " var formula = document.getElementById(\"keyword_chemical_formula\").value;\n", + " var query_command_k_band = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_k_band_segment\";\n", + " var query_command_dos = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_dos\";\n", + " //result = getJSON(\"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\");\n", + " var result_k_band = getJSON(query_command_k_band);\n", + " var result_dos = getJSON(query_command_dos);\n", + " var result_json_k_band = JSON.parse(result_k_band);//parse the searching results to json from URL\n", + " var result_json_dos = JSON.parse(result_dos);\n", + " paths_section_k_band_segment = []; \n", + " paths_section_dos = [];\n", + " paths_section_k_band_segment = get_paths_from_search_results(result_json_k_band, \"search_results_section_k_band_segment\", \"<br><br><font size=4em>Calculations containing band structures:</font><br>\");\n", + " paths_section_dos = get_paths_from_search_results(result_json_dos, \"search_results_section_dos\", \"<br><font size=4em>Calculations containing DOS:</font><br>\");\n", + " \n", + " var promise = Promise.resolve();\n", + " promise\n", + " .then(match_band_dos())\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')))\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')));\n", + " \n", + " //match_band_dos();\n", + " \n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')); //Read the json files, and prepare data for plot\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')); //Prepare for plot\n", + " }\n", + " function reset_search()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('search_materials'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot'));\n", + " }\n", + " \n", + " \n", + "</script>\n", + "<font size=4em>Please input the chemical formula:</font>\n", + "<input type=\"text\" id=\"keyword_chemical_formula\" value=\"AlInO3\"> \n", + "<button class=\"button\" onclick=\"submit_search()\">Search</button>\n", + "<button class=\"button\" onclick=\"reset_search()\">Reset</button>\n", + "<br><br><br>\n", + "<div id=\"search_results_section_k_band_segment\"></div>\n", + "<div id=\"search_results_section_dos\"></div>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%html\n", + "<br><br>\n", + "\n", + "<p style=\"color: #20335d;font-weight: 450; font-size: 14pt;font-family: Arial;\"> This tutorial visulizes the band structures and density of states (DOS) of the NOMAD materials.</p>\n", + "<br><br>\n", + "\n", + "<style>\n", + ".button {\n", + " background-color: #e7e7e7;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 15px 32px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-family: Arial;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + "}\n", + "\n", + " .text-normal-black{\n", + " color: #000;font-weight: 200; font-size: 10pt;\n", + " font-family: Arial;\n", + " }\n", + " .div_band_dos{\n", + " box-sizing: border-box;\n", + " width: 100%;\n", + " height: 600px;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band_dos_compare{\n", + " box-sizing: border-box;\n", + " width: 1600px;\n", + " height: 600px;\n", + " color: #00AEFF;\n", + " font-weight: 100;\n", + " font-family: Arial;\n", + " padding-left: 20px;\n", + " padding-top: 10px;\n", + " padding-right: 1em;\n", + " margin: 0;\n", + " border: 0;\n", + " }\n", + " .div_band{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 37%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_dos{\n", + " font-family: Arial;\n", + " font-size: 0.875em;\n", + " width: 13%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " float:left;\n", + " }\n", + " .div_tools{\n", + " color: #20335d;font-weight: 150; font-size: 13pt;\n", + " width: 35%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " margin-left:20pt;\n", + " float:left;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_checkbox_compare{\n", + " color: #888;font-weight: 150; font-size: 12pt;\n", + " width: 10%;\n", + " height: 80%;\n", + " background-color: #fff;\n", + " border: solid #fff 1px;\n", + " float:right;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .div_overview{\n", + " width: 300px;\n", + " height: 200px;\n", + " background-color: #fff;\n", + " margin-left:10px; \n", + " margin-top: 20px;\n", + " font-family: Arial;\n", + "\n", + " }\n", + " .button_tools {\n", + " background-color: #F0F0F0;\n", + " border: 0.5px solid #A4A4A4;\n", + " color: black;\n", + " padding: 10px 15px;\n", + " text-align: center;\n", + " text-decoration: none;\n", + " display: inline-block;\n", + " font-size: 16px;\n", + " margin: 4px 2px;\n", + " cursor: pointer;\n", + " font-family: Arial;\n", + "\n", + " }\n", + "\n", + " \n", + " .g-before-after{position:relative;overflow:hidden;width:500px}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%}\n", + "</style>\n", + "\n", + "<script>\n", + " //Search for certain keyword: https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\n", + " //FjiYy5-ETRCrs5ktzJA55w/bOY0cPkBvvNAY7pZdbginlKXJ2kF\n", + " //\"upload_id\"/\"calc_id\"\n", + " \n", + " //Global variables\n", + " var paths_section_k_band_segment = []; \n", + " var paths_section_dos = [];\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " \n", + " var band_paths = [];\n", + " var dos_paths = [];\n", + " var N_materials = 0; //Number of materials that have both band and DOS in the same calculation \n", + " \n", + " \n", + " function getJSON(url) {\n", + " var resp ;\n", + " var xmlHttp ;\n", + "\n", + " resp = '' ;\n", + " xmlHttp = new XMLHttpRequest();\n", + "\n", + " if(xmlHttp != null)\n", + " {\n", + " xmlHttp.open( \"GET\", url, false );\n", + " xmlHttp.send( null );\n", + " resp = xmlHttp.responseText;\n", + " }\n", + "\n", + " return resp;\n", + " }\n", + " function match_band_dos()\n", + " {\n", + " //TMP for local tests\n", + " /*\n", + " paths_section_k_band_segment = [\"data/kOJR-AlPSgiNG9AdZoxd4g_9mxjIU0edrPosfsTc4uyDG9H_UXr.json\",\"data/kOJR-AlPSgiNG9AdZoxd4g_lfkGCmWozYENeiGhu5W7dJUqLTkj.json\"];\n", + " paths_section_dos = [\"data/kOJR-AlPSgiNG9AdZoxd4g_8tEGnaz0yY91eSyysKZkIUH9qx8J.json\", \"data/kOJR-AlPSgiNG9AdZoxd4g_lxUT3viRZcC_1IsH_KvO5tChAtV1.json\"];\n", + " */\n", + "\n", + " //band_paths = [];\n", + " //dos_paths = [];\n", + " //N_materials = 0; \n", + " \n", + " var data_k_band = [];\n", + " for(var i_path_k_band = 0; i_path_k_band < paths_section_k_band_segment.length; i_path_k_band ++)\n", + " {\n", + " var i_data_k_band_json = JSON.parse(getJSON(paths_section_k_band_segment[i_path_k_band]));\n", + " var i_data_k_band = {};\n", + " i_data_k_band[\"program_name\"] = i_data_k_band_json[\"section_run\"][\"program_name\"];\n", + " i_data_k_band[\"k_mesh_points\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_k_band[\"simulation_cell\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_k_band[\"atom_positions\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_k_band[\"atom_labels\"] = i_data_k_band_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_k_band[\"XC_functional_name\"] = i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_k_band_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_k_band[\"path\"] = paths_section_k_band_segment[i_path_k_band];\n", + " data_k_band.push(i_data_k_band);\n", + " }\n", + "\n", + " var data_dos = [];\n", + " for(var i_path_dos = 0; i_path_dos < paths_section_dos.length; i_path_dos ++)\n", + " {\n", + " var i_data_dos_json = JSON.parse(getJSON(paths_section_dos[i_path_dos]));\n", + " var i_data_dos = {};\n", + " i_data_dos[\"program_name\"] = i_data_dos_json[\"section_run\"][\"program_name\"];\n", + " i_data_dos[\"k_mesh_points\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"k_mesh_points\"];\n", + " i_data_dos[\"simulation_cell\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"simulation_cell\"];\n", + " i_data_dos[\"atom_positions\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_positions\"];\n", + " i_data_dos[\"atom_labels\"] = i_data_dos_json[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " i_data_dos[\"XC_functional_name\"] = i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \"-\" + i_data_dos_json[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"]\n", + " i_data_dos[\"path\"] = paths_section_dos[i_path_dos];\n", + " data_dos.push(i_data_dos); \n", + " }\n", + "\n", + " //Matching: band[i] ~ dos[i] (the same systems are arranged with the same index)\n", + " band_paths = [];\n", + " dos_paths = [];\n", + " N_materials = 0;\n", + " for(var i_k_band = 0; i_k_band < data_k_band.length; i_k_band ++)\n", + " {\n", + " for(var i_dos = 0; i_dos < data_dos.length; i_dos ++)\n", + " {\n", + " if(data_k_band[i_k_band][\"program_name\"] != data_dos[i_dos][\"program_name\"])\n", + " continue; \n", + " //if(data_k_band[i_k_band][\"k_mesh_points\"].join() != data_dos[i_dos][\"k_mesh_points\"].join())\n", + " // continue;\n", + " if(data_k_band[i_k_band][\"simulation_cell\"].join() != data_dos[i_dos][\"simulation_cell\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_positions\"].join() != data_dos[i_dos][\"atom_positions\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"atom_labels\"].join() != data_dos[i_dos][\"atom_labels\"].join())\n", + " continue;\n", + " if(data_k_band[i_k_band][\"XC_functional_name\"] != data_dos[i_dos][\"XC_functional_name\"])\n", + " continue;\n", + " band_paths.push(data_k_band[i_k_band][\"path\"]);\n", + " dos_paths.push(data_dos[i_dos][\"path\"]);\n", + " N_materials ++;\n", + " }\n", + " }\n", + " //Pass the arrays to python\n", + "\n", + " var command = \"N_materials = \" + N_materials + \";\"\n", + " var kernel = IPython.notebook.kernel;\n", + " command += \"band_paths = \" + \"[\\'\" + band_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " command += \"dos_paths = \" + \"[\\'\" + dos_paths.join(\"\\',\\'\") + \"\\'];\";\n", + " kernel.execute(command);\n", + " \n", + " \n", + " }\n", + "\n", + " function get_paths_from_search_results(result_json, div_id_search_results,div_head)\n", + " {\n", + " paths = [];\n", + " search_results_content = [div_head, '<table>', '<tr><th>Chemical formula</th><th>Spacegroup</th><th>Code</th><th>XC functional</th><th>Upload ID</th><th>Calculation ID</th><th>URL</th></tr>'];\n", + " for(var i_key in result_json)\n", + " {\n", + " if(i_key == \"results\")\n", + " {\n", + " for(var system in result_json[i_key])\n", + " {\n", + " //Get the path to the data files (json): https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/upload_id/calc_id \n", + " path = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/\" + result_json[i_key][system][\"upload_id\"] + \"/\" + result_json[i_key][system][\"calc_id\"]\n", + " paths.push(path);\n", + " \n", + " //Show the results in div\n", + " // \"formula\" \"spacegroup_symbol\" \"code_name\" \"xc_functional\"\n", + " content = '<tr>';\n", + " content += '<td>' + result_json[i_key][system][\"formula\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"spacegroup_symbol\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"code_name\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"xc_functional\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"upload_id\"] + '</td>';\n", + " content += '<td>' + result_json[i_key][system][\"calc_id\"] + '</td>'; \n", + " content += '<td>' + path + '</td>';\n", + " content += '</tr>';\n", + " search_results_content.push(content);\n", + " }\n", + " }\n", + " }\n", + " search_results_content.push('</table>');\n", + " document.getElementById(div_id_search_results).innerHTML = search_results_content.join('');\n", + " return paths\n", + " }\n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " function submit_search()\n", + " {\n", + " \n", + " var result;\n", + " var formula = document.getElementById(\"keyword_chemical_formula\").value;\n", + " var query_command_k_band = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_k_band_segment\";\n", + " var query_command_dos = \"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=\" + formula + \"&quantities=section_dos\";\n", + " //result = getJSON(\"https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment\");\n", + " var result_k_band = getJSON(query_command_k_band);\n", + " var result_dos = getJSON(query_command_dos);\n", + " var result_json_k_band = JSON.parse(result_k_band);//parse the searching results to json from URL\n", + " var result_json_dos = JSON.parse(result_dos);\n", + " paths_section_k_band_segment = []; \n", + " paths_section_dos = [];\n", + " paths_section_k_band_segment = get_paths_from_search_results(result_json_k_band, \"search_results_section_k_band_segment\", \"<br><br><font size=4em>Calculations containing band structures:</font><br>\");\n", + " paths_section_dos = get_paths_from_search_results(result_json_dos, \"search_results_section_dos\", \"<br><font size=4em>Calculations containing DOS:</font><br>\");\n", + " \n", + " var promise = Promise.resolve();\n", + " promise\n", + " .then(match_band_dos())\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')))\n", + " .then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')));\n", + " \n", + " //match_band_dos();\n", + " \n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')); //Read the json files, and prepare data for plot\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')); //Prepare for plot\n", + " }\n", + " function reset_search()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('search_materials'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot'));\n", + " }\n", + " \n", + " \n", + "</script>\n", + "<font size=4em>Please input the chemical formula:</font>\n", + "<input type=\"text\" id=\"keyword_chemical_formula\" value=\"AlInO3\"> \n", + "<button class=\"button\" onclick=\"submit_search()\">Search</button>\n", + "<button class=\"button\" onclick=\"reset_search()\">Reset</button>\n", + "<br><br><br>\n", + "<div id=\"search_results_section_k_band_segment\"></div>\n", + "<div id=\"search_results_section_dos\"></div>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": { + "tags": [ + "process_band_dos_data" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " //alert(\"process_band_dos_data: \" +band_paths)\n", + " //alert(\"process_band_dos_data: \" +info_obj_all)\n", + " function get_label_flag(coor_array)\n", + " {\n", + " var coor = coor_array.sort().join();\n", + " if(coor == '0,0.5,0.5')\n", + " return \"X\";\n", + " if(coor == '0,0,0.5')\n", + " return \"M\";\n", + " else if(coor == '0.5,0.5,0.5')\n", + " return \"L\";\n", + " else if(coor == '0.375,0.375,0.75')\n", + " return \"K\";\n", + " else if(coor == '0.25,0.5,0.75')\n", + " return \"W\";\n", + " else if(coor == '0,0,0')\n", + " return \"\\u0393\";\n", + " else if(coor == '0.25,0.625,0.625')\n", + " return \"U\";\n", + " else\n", + " {\n", + " //alert(\"k label not found: \" + coor);\n", + " return \"?\";\n", + " }\n", + " }\n", + "\n", + "\n", + " //============Process the band structure data============\n", + " function get_band_obj(band_path, dos_fermi_energy)\n", + " {\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + "\n", + " //---------Read section_k_band_segment------------\n", + " var section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']\n", + "\n", + " //--------Get the number of k band segments-------------\n", + " var N_k_band_segments = section_k_band_segment.length;\n", + "\n", + "\n", + " //----------Get the total number of k points in all segments---------\n", + " var N_k_points_all = 0;\n", + " for(var i = 0; i < N_k_band_segments; i++)\n", + " N_k_points_all = N_k_points_all + section_k_band_segment[i]['band_k_points'].length;\n", + "\n", + "\n", + " //--------Get the x axis for the band structure figure: the coordinates of k points in 1D\n", + " // store in k_coor_1D[N_k_points_total]-----------------\n", + "\n", + " var band_distance_segments = [];\n", + " for(i = 0; i < N_k_band_segments; i++)\n", + " {\n", + " var x1, x2, y1, y2, z1, z2;\n", + " [[x1, y1, z1],[x2, y2, z2]]= section_k_band_segment[i]['band_segm_start_end']; //\"band_segm_start_end\": [[0.5, 0.0, 0.5],[0.5, 0.25, 0.75]],\n", + " band_distance_segments.push(Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) + Math.pow((z1-z2), 2));\n", + " }\n", + "\n", + "\n", + " var band_distance_total = band_distance_segments.reduce((x,y) => x+y); //sum of band_distance_segments\n", + "\n", + " var average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total;\n", + "\n", + " //Prepare the parameters to rescale the k coordinates into [0,1]\n", + " var step_k_point = 1.0 / N_k_points_all;\n", + " var step_k_point = (1.0 + step_k_point) / N_k_points_all;\n", + "\n", + " var k_coor_1D = [];\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points ++)\n", + " {\n", + " k_coor_1D.push(step_k_point * i_k_points)\n", + " }\n", + "\n", + "\n", + " //--------Get the eigenvalues of each band trajectory--------------\n", + " /*\n", + " N_k_points_per_segment = len(section_k_band_segment[0]['band_energies'][0]) #suppose the numebr of k points in all the segments are the same\n", + " N_bands = len(section_k_band_segment[0]['band_energies'][0][0])\n", + " band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues\n", + " N_k_points_all = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " band_energies = section_k_band_segment[i_segments]['band_energies']\n", + " N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized\n", + " N_k_points_per_segment = len(band_energies[0])\n", + " for i_k_points in range(N_k_points_per_segment):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))\n", + " N_k_points_all = N_k_points_all + 1\n", + " */\n", + " //var N_k_points_per_segment = section_k_band_segment[0]['band_energies'][0].length; //suppose the numebr of k points in all the segments are the same\n", + " var N_bands = section_k_band_segment[0]['band_energies'][0][0].length;\n", + " var band_energies_all = new Array(N_bands);\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " band_energies_all[i_bands] = new Array(N_k_points_all);// new Array(N_bands, N_k_points_all); //store the eigenvalues\n", + "\n", + " var i_k_points_all = 0;\n", + "\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var band_energies = section_k_band_segment[i_segments]['band_energies'];\n", + " var N_spin_channel = band_energies.length; //Number of the spin channel --FIXME: no spin polarized\n", + " var N_k_points_per_segment = band_energies[0].length;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_per_segment; i_k_points ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " band_energies_all[i_bands][i_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * Math.pow(10, -19)) - dos_fermi_energy;\n", + " }\n", + " i_k_points_all = i_k_points_all + 1 ;\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " var N_labels = 0\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " for(var j = 0; j < 2; j++)\n", + " //labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];\n", + " N_labels = N_labels + 1\n", + " }\n", + " var label_flag = [];//[\"\" for i in range(N_labels)] //stores the flags of the labels (X, W, G, etc)\n", + "\n", + "\n", + " var i_label = 0;\n", + " var label_flag_last_final = \"\";\n", + " var label_flag_current_initial = \"\";\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0].sort();\n", + " var labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1].sort();\n", + "\n", + " var label_flag_0 = get_label_flag(labels_coor_0);\n", + " var label_flag_1 = get_label_flag(labels_coor_1);\n", + "\n", + " var label_flag_current_initial = label_flag_0;\n", + " if(label_flag_last_final == \"\")\n", + " label_flag_last_final = label_flag_0;\n", + "\n", + " if(label_flag_last_final == label_flag_current_initial)\n", + " label_flag[i_label] = label_flag_current_initial;\n", + " else\n", + " label_flag[i_label] = label_flag_last_final + '|' + label_flag_current_initial;\n", + " label_flag_last_final = label_flag_1\n", + "\n", + "\n", + " i_label = i_label + 1;\n", + " if(i_segments == N_k_band_segments - 1)\n", + " {\n", + " label_flag[i_label] = label_flag_1;\n", + " i_label = i_label + 1;\n", + " }\n", + " }\n", + " N_labels = i_label;\n", + "\n", + " //------------Get the coordinates for the labels------------\n", + " //label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels\n", + " var label_coor_relative = [];//np.zeros((N_labels))\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " //Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates\n", + " //x = labels_coor_0[0]\n", + " //y = labels_coor_0[1]\n", + " //z = labels_coor_0[2]\n", + " //label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)\n", + " label_coor_relative.push(step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all));\n", + " }\n", + " //----Store the label-----------\n", + " var label_obj = [];//[['' for i in range(2)] for j in range(N_labels)]\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " label_obj.push([label_coor_relative[i_label], label_flag[i_label]]);\n", + " }\n", + "\n", + "\n", + " //-------Get VBM, CBM----------------\n", + "\n", + " var HOMO = -1000;\n", + " var LUMO = 1000;\n", + " var coor_k_point_HOMO = []; //the coordinate of k point that stores HOMO\n", + " var coor_k_point_LUMO = [];//np.zeros((3)) #the coordinate of k point that stores LUMO\n", + " //band_gap_direct = 0.0\n", + " var band_gap_indirect = 0.0;\n", + "\n", + "\n", + " //band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " //band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " var band_energy_max = 10;\n", + " var band_energy_min = -10;\n", + " //N_band_energy_index = 10000\n", + " //band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " //N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " //i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level\n", + "\n", + "\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " for(var i_k_points_all = 0; i_k_points_all< N_k_points_all; i_k_points_all ++)\n", + " {\n", + " //i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)\n", + " //N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if(band_energy > 0)\n", + " {\n", + " if(band_energy < LUMO)\n", + " LUMO = band_energy;\n", + " }\n", + " else\n", + " {\n", + " if(band_energy > HOMO)\n", + " HOMO = band_energy;\n", + " }\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + " //#for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO\n", + " // if(N_allowed_states[i_band_index] > 0):\n", + " // LUMO = band_energy_min + band_energy_step * i_band_index\n", + " //print('HOMO, LUMO: ',HOMO, LUMO)\n", + " band_gap_indirect = Math.abs(LUMO - HOMO);\n", + "\n", + " if(band_gap_indirect < 0.5) //VBM and CBM has to be found in another way for metals/charged system:\n", + " {\n", + " HOMO = -1000.0;\n", + " LUMO = 1000.0;\n", + " band_energy_max = 10.0;\n", + " band_energy_min = 0.0;\n", + " var N_band_energy_index = 10000;\n", + " var band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index;\n", + " var N_allowed_states = [];\n", + " for(var i_state = 0; i_state < N_band_energy_index+1; i_state++)\n", + " N_allowed_states.push(0);\n", + "\n", + "\n", + " //get the DOS and store in N_allowed_states[]\n", + " for(var i_k_points_all = 0; i_k_points_all < N_k_points_all; i_k_points_all ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if((band_energy_min < band_energy)&&(band_energy < band_energy_max))\n", + " {\n", + " var i_band_index = Math.floor((band_energy - band_energy_min) / band_energy_step);\n", + " N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1;\n", + " }\n", + " }\n", + " }\n", + "\n", + "\n", + " var if_gapped = 0;\n", + " for(var i_band_index = 0; i_band_index < N_band_energy_index; i_band_index ++)//go through the energy levels from the bottom\n", + " {\n", + " var band_energy = band_energy_min + band_energy_step * i_band_index\n", + " if(N_allowed_states[i_band_index] == 0)\n", + " if_gapped = if_gapped + 1;\n", + " if((band_energy > band_energy_max - 0.5) && (if_gapped == 0))\n", + " {\n", + " //alert(\"No gap found in this system. It seems to be a metal.\");\n", + " HOMO = 1000;\n", + " LUMO = 1000;\n", + " break;\n", + " }\n", + " //print(\"At \", band_energy,\": # allowed states = \", N_allowed_states[i_band_index],\" if_gapped = \", if_gapped)\n", + "\n", + " if(N_allowed_states[i_band_index] > 0)\n", + " {\n", + " if(if_gapped * band_energy_step > 0.3 )//above VBM-CBM gap: LUMO\n", + " {\n", + " if(band_energy < LUMO)\n", + " {\n", + " //print(\"LUMO got!\")\n", + " LUMO = band_energy;\n", + " break; //break before touching another gap that is above the band gap\n", + " }\n", + " }\n", + "\n", + " if(if_gapped * band_energy_step < 0.3) //below VBM-CBM gap: HOMO\n", + " {\n", + " if(band_energy > HOMO)\n", + " {\n", + " //print(\"HOMO got!\")\n", + " HOMO = band_energy;\n", + " }\n", + " } \n", + " if_gapped = 0;\n", + " }\n", + " }\n", + " //alert('HOMO, LUMO for metal/charged system: '+ HOMO +\",\"+LUMO)\n", + "\n", + " }\n", + "\n", + "\n", + "\n", + "\n", + " //Find the position of HOMO, LUMO\n", + " var coor_k_point_HOMO = 0, coor_k_point_LUMO = 0;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001)\n", + " coor_k_point_HOMO = k_coor_1D[i_k_points];\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001)\n", + " coor_k_point_LUMO = k_coor_1D[i_k_points]; \n", + " }\n", + " }\n", + "\n", + " //alert(coor_k_point_HOMO +\",\" + coor_k_point_LUMO);\n", + "\n", + "\n", + " //Store the band data to band_obj\n", + "\n", + " var band_obj = {};\n", + " band_obj[\"band_x_axis\"] = k_coor_1D;\n", + " band_obj[\"band_y_axis\"] = band_energies_all\n", + " band_obj[\"labels\"] = label_obj;\n", + " band_obj[\"HOMO_energy\"] = HOMO;\n", + " band_obj[\"HOMO_coor\"] = coor_k_point_HOMO;\n", + " band_obj[\"LUMO_energy\"] = LUMO;\n", + " band_obj[\"LUMO_coor\"] = coor_k_point_LUMO;\n", + " band_obj[\"average_N_k_points_per_inverse_distance\"] = average_N_k_points_per_inverse_distance;\n", + "\n", + "\n", + " return band_obj\n", + "\n", + " }\n", + "\n", + "\n", + " function get_dos_obj(dos_path)\n", + " {\n", + "\n", + " var dos_data = JSON.parse(getJSON(dos_path));\n", + "\n", + " var N_dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'].length;\n", + "\n", + " //in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]\n", + "\n", + " //dos_energies = new Array(N_dos_values).fill(0.0);\n", + " //dos_energies_tmp = new Array(N_dos_values).fill(0.0) #tmp array for unit convertion\n", + " //dos_values = new Array(N_dos_values).fill(0.0)\n", + "\n", + " var dos_energies = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'];\n", + " var dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_integrated_values'];//[0]\n", + "\n", + " //To do: check if every section_dos has 'dos_fermi_energy'\n", + " var dos_fermi_energy = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_fermi_energy'];\n", + " dos_fermi_energy = dos_fermi_energy / (1.60217656535 * Math.pow(10,-19));\n", + " \n", + " for(var i = 0; i < N_dos_values; i++)\n", + " {\n", + " dos_energies[i] = dos_energies[i] / (1.60217656535 * Math.pow(10,-19)) - dos_fermi_energy;\n", + " }\n", + " \n", + " dos_obj = {}\n", + " dos_obj[\"dos_x_axis\"] = dos_energies;\n", + " dos_obj[\"dos_y_axis\"] = dos_values;\n", + " dos_obj[\"dos_fermi_energy\"] = dos_fermi_energy;\n", + " return dos_obj\n", + " }\n", + " function get_info_obj(band_path)\n", + " {\n", + "\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + " var info_obj = {};\n", + " //---------Read the information of the calculation--------\n", + " info_obj[\"program_name\"] = band_data[\"section_run\"][\"program_name\"];\n", + " info_obj[\"program_basis_set_type\"] = band_data[\"section_run\"][\"program_basis_set_type\"];\n", + " info_obj[\"atom_labels\"] = band_data[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " info_obj[\"XC_functional_name\"] = band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \" + \"+ band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"];\n", + "\n", + " //----------Get the space group information----------\n", + " /*\n", + " [space_group_symbol, lattice_constant] = get_space_group(band_data);\n", + " info_obj[\"space_group_symbol\"] = np.array(space_group_symbol).tolist();\n", + " info_obj[\"lattice_constant\"] = np.array(lattice_constant).tolist();\n", + " */\n", + "\n", + " return info_obj\n", + " }\n", + " function process_band_dos_data()\n", + " {\n", + " info_all = [];\n", + " band_obj_all = [];\n", + " dos_obj_all = [];\n", + "\n", + " for(var i = 0; i < N_materials; i++)\n", + " {\n", + " var band_path = band_paths[i];\n", + " var dos_path = dos_paths[i];\n", + "\n", + "\n", + " var dos_obj = get_dos_obj(dos_path);\n", + " var dos_fermi_energy = dos_obj[\"dos_fermi_energy\"];\n", + " band_obj = get_band_obj(band_path, dos_fermi_energy);\n", + " var info_obj = get_info_obj(band_path);\n", + "\n", + " band_obj_all.push(band_obj);\n", + " dos_obj_all.push(dos_obj);\n", + " info_obj_all.push(info_obj);\n", + " }\n", + " }\n", + " process_band_dos_data();\n", + " //alert(\"process_band_dos_data: info_obj_all: \"+JSON.stringify(info_obj_all));\n", + "</script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " var band_obj_all = [];\n", + " var dos_obj_all = [];\n", + " var info_obj_all = [];\n", + " //alert(\"process_band_dos_data: \" +band_paths)\n", + " //alert(\"process_band_dos_data: \" +info_obj_all)\n", + " function get_label_flag(coor_array)\n", + " {\n", + " var coor = coor_array.sort().join();\n", + " if(coor == '0,0.5,0.5')\n", + " return \"X\";\n", + " if(coor == '0,0,0.5')\n", + " return \"M\";\n", + " else if(coor == '0.5,0.5,0.5')\n", + " return \"L\";\n", + " else if(coor == '0.375,0.375,0.75')\n", + " return \"K\";\n", + " else if(coor == '0.25,0.5,0.75')\n", + " return \"W\";\n", + " else if(coor == '0,0,0')\n", + " return \"\\u0393\";\n", + " else if(coor == '0.25,0.625,0.625')\n", + " return \"U\";\n", + " else\n", + " {\n", + " //alert(\"k label not found: \" + coor);\n", + " return \"?\";\n", + " }\n", + " }\n", + "\n", + "\n", + " //============Process the band structure data============\n", + " function get_band_obj(band_path, dos_fermi_energy)\n", + " {\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + "\n", + " //---------Read section_k_band_segment------------\n", + " var section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']\n", + "\n", + " //--------Get the number of k band segments-------------\n", + " var N_k_band_segments = section_k_band_segment.length;\n", + "\n", + "\n", + " //----------Get the total number of k points in all segments---------\n", + " var N_k_points_all = 0;\n", + " for(var i = 0; i < N_k_band_segments; i++)\n", + " N_k_points_all = N_k_points_all + section_k_band_segment[i]['band_k_points'].length;\n", + "\n", + "\n", + " //--------Get the x axis for the band structure figure: the coordinates of k points in 1D\n", + " // store in k_coor_1D[N_k_points_total]-----------------\n", + "\n", + " var band_distance_segments = [];\n", + " for(i = 0; i < N_k_band_segments; i++)\n", + " {\n", + " var x1, x2, y1, y2, z1, z2;\n", + " [[x1, y1, z1],[x2, y2, z2]]= section_k_band_segment[i]['band_segm_start_end']; //\"band_segm_start_end\": [[0.5, 0.0, 0.5],[0.5, 0.25, 0.75]],\n", + " band_distance_segments.push(Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) + Math.pow((z1-z2), 2));\n", + " }\n", + "\n", + "\n", + " var band_distance_total = band_distance_segments.reduce((x,y) => x+y); //sum of band_distance_segments\n", + "\n", + " var average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total;\n", + "\n", + " //Prepare the parameters to rescale the k coordinates into [0,1]\n", + " var step_k_point = 1.0 / N_k_points_all;\n", + " var step_k_point = (1.0 + step_k_point) / N_k_points_all;\n", + "\n", + " var k_coor_1D = [];\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points ++)\n", + " {\n", + " k_coor_1D.push(step_k_point * i_k_points)\n", + " }\n", + "\n", + "\n", + " //--------Get the eigenvalues of each band trajectory--------------\n", + " /*\n", + " N_k_points_per_segment = len(section_k_band_segment[0]['band_energies'][0]) #suppose the numebr of k points in all the segments are the same\n", + " N_bands = len(section_k_band_segment[0]['band_energies'][0][0])\n", + " band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues\n", + " N_k_points_all = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " band_energies = section_k_band_segment[i_segments]['band_energies']\n", + " N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized\n", + " N_k_points_per_segment = len(band_energies[0])\n", + " for i_k_points in range(N_k_points_per_segment):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))\n", + " N_k_points_all = N_k_points_all + 1\n", + " */\n", + " //var N_k_points_per_segment = section_k_band_segment[0]['band_energies'][0].length; //suppose the numebr of k points in all the segments are the same\n", + " var N_bands = section_k_band_segment[0]['band_energies'][0][0].length;\n", + " var band_energies_all = new Array(N_bands);\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " band_energies_all[i_bands] = new Array(N_k_points_all);// new Array(N_bands, N_k_points_all); //store the eigenvalues\n", + "\n", + " var i_k_points_all = 0;\n", + "\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var band_energies = section_k_band_segment[i_segments]['band_energies'];\n", + " var N_spin_channel = band_energies.length; //Number of the spin channel --FIXME: no spin polarized\n", + " var N_k_points_per_segment = band_energies[0].length;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_per_segment; i_k_points ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " band_energies_all[i_bands][i_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * Math.pow(10, -19)) - dos_fermi_energy;\n", + " }\n", + " i_k_points_all = i_k_points_all + 1 ;\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " var N_labels = 0\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " for(var j = 0; j < 2; j++)\n", + " //labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];\n", + " N_labels = N_labels + 1\n", + " }\n", + " var label_flag = [];//[\"\" for i in range(N_labels)] //stores the flags of the labels (X, W, G, etc)\n", + "\n", + "\n", + " var i_label = 0;\n", + " var label_flag_last_final = \"\";\n", + " var label_flag_current_initial = \"\";\n", + " for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)\n", + " {\n", + " var labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0].sort();\n", + " var labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1].sort();\n", + "\n", + " var label_flag_0 = get_label_flag(labels_coor_0);\n", + " var label_flag_1 = get_label_flag(labels_coor_1);\n", + "\n", + " var label_flag_current_initial = label_flag_0;\n", + " if(label_flag_last_final == \"\")\n", + " label_flag_last_final = label_flag_0;\n", + "\n", + " if(label_flag_last_final == label_flag_current_initial)\n", + " label_flag[i_label] = label_flag_current_initial;\n", + " else\n", + " label_flag[i_label] = label_flag_last_final + '|' + label_flag_current_initial;\n", + " label_flag_last_final = label_flag_1\n", + "\n", + "\n", + " i_label = i_label + 1;\n", + " if(i_segments == N_k_band_segments - 1)\n", + " {\n", + " label_flag[i_label] = label_flag_1;\n", + " i_label = i_label + 1;\n", + " }\n", + " }\n", + " N_labels = i_label;\n", + "\n", + " //------------Get the coordinates for the labels------------\n", + " //label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels\n", + " var label_coor_relative = [];//np.zeros((N_labels))\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " //Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates\n", + " //x = labels_coor_0[0]\n", + " //y = labels_coor_0[1]\n", + " //z = labels_coor_0[2]\n", + " //label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)\n", + " label_coor_relative.push(step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all));\n", + " }\n", + " //----Store the label-----------\n", + " var label_obj = [];//[['' for i in range(2)] for j in range(N_labels)]\n", + " for(i_label = 0; i_label < N_labels; i_label ++)\n", + " {\n", + " label_obj.push([label_coor_relative[i_label], label_flag[i_label]]);\n", + " }\n", + "\n", + "\n", + " //-------Get VBM, CBM----------------\n", + "\n", + " var HOMO = -1000;\n", + " var LUMO = 1000;\n", + " var coor_k_point_HOMO = []; //the coordinate of k point that stores HOMO\n", + " var coor_k_point_LUMO = [];//np.zeros((3)) #the coordinate of k point that stores LUMO\n", + " //band_gap_direct = 0.0\n", + " var band_gap_indirect = 0.0;\n", + "\n", + "\n", + " //band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " //band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " var band_energy_max = 10;\n", + " var band_energy_min = -10;\n", + " //N_band_energy_index = 10000\n", + " //band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " //N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " //i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level\n", + "\n", + "\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " for(var i_k_points_all = 0; i_k_points_all< N_k_points_all; i_k_points_all ++)\n", + " {\n", + " //i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)\n", + " //N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if(band_energy > 0)\n", + " {\n", + " if(band_energy < LUMO)\n", + " LUMO = band_energy;\n", + " }\n", + " else\n", + " {\n", + " if(band_energy > HOMO)\n", + " HOMO = band_energy;\n", + " }\n", + "\n", + " }\n", + " }\n", + "\n", + "\n", + " //#for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO\n", + " // if(N_allowed_states[i_band_index] > 0):\n", + " // LUMO = band_energy_min + band_energy_step * i_band_index\n", + " //print('HOMO, LUMO: ',HOMO, LUMO)\n", + " band_gap_indirect = Math.abs(LUMO - HOMO);\n", + "\n", + " if(band_gap_indirect < 0.5) //VBM and CBM has to be found in another way for metals/charged system:\n", + " {\n", + " HOMO = -1000.0;\n", + " LUMO = 1000.0;\n", + " band_energy_max = 10.0;\n", + " band_energy_min = 0.0;\n", + " var N_band_energy_index = 10000;\n", + " var band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index;\n", + " var N_allowed_states = [];\n", + " for(var i_state = 0; i_state < N_band_energy_index+1; i_state++)\n", + " N_allowed_states.push(0);\n", + "\n", + "\n", + " //get the DOS and store in N_allowed_states[]\n", + " for(var i_k_points_all = 0; i_k_points_all < N_k_points_all; i_k_points_all ++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " var band_energy = band_energies_all[i_bands][i_k_points_all];\n", + " if((band_energy_min < band_energy)&&(band_energy < band_energy_max))\n", + " {\n", + " var i_band_index = Math.floor((band_energy - band_energy_min) / band_energy_step);\n", + " N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1;\n", + " }\n", + " }\n", + " }\n", + "\n", + "\n", + " var if_gapped = 0;\n", + " for(var i_band_index = 0; i_band_index < N_band_energy_index; i_band_index ++)//go through the energy levels from the bottom\n", + " {\n", + " var band_energy = band_energy_min + band_energy_step * i_band_index\n", + " if(N_allowed_states[i_band_index] == 0)\n", + " if_gapped = if_gapped + 1;\n", + " if((band_energy > band_energy_max - 0.5) && (if_gapped == 0))\n", + " {\n", + " //alert(\"No gap found in this system. It seems to be a metal.\");\n", + " HOMO = 1000;\n", + " LUMO = 1000;\n", + " break;\n", + " }\n", + " //print(\"At \", band_energy,\": # allowed states = \", N_allowed_states[i_band_index],\" if_gapped = \", if_gapped)\n", + "\n", + " if(N_allowed_states[i_band_index] > 0)\n", + " {\n", + " if(if_gapped * band_energy_step > 0.3 )//above VBM-CBM gap: LUMO\n", + " {\n", + " if(band_energy < LUMO)\n", + " {\n", + " //print(\"LUMO got!\")\n", + " LUMO = band_energy;\n", + " break; //break before touching another gap that is above the band gap\n", + " }\n", + " }\n", + "\n", + " if(if_gapped * band_energy_step < 0.3) //below VBM-CBM gap: HOMO\n", + " {\n", + " if(band_energy > HOMO)\n", + " {\n", + " //print(\"HOMO got!\")\n", + " HOMO = band_energy;\n", + " }\n", + " } \n", + " if_gapped = 0;\n", + " }\n", + " }\n", + " //alert('HOMO, LUMO for metal/charged system: '+ HOMO +\",\"+LUMO)\n", + "\n", + " }\n", + "\n", + "\n", + "\n", + "\n", + " //Find the position of HOMO, LUMO\n", + " var coor_k_point_HOMO = 0, coor_k_point_LUMO = 0;\n", + " for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points++)\n", + " {\n", + " for(var i_bands = 0; i_bands < N_bands; i_bands ++)\n", + " {\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001)\n", + " coor_k_point_HOMO = k_coor_1D[i_k_points];\n", + " if(Math.abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001)\n", + " coor_k_point_LUMO = k_coor_1D[i_k_points]; \n", + " }\n", + " }\n", + "\n", + " //alert(coor_k_point_HOMO +\",\" + coor_k_point_LUMO);\n", + "\n", + "\n", + " //Store the band data to band_obj\n", + "\n", + " var band_obj = {};\n", + " band_obj[\"band_x_axis\"] = k_coor_1D;\n", + " band_obj[\"band_y_axis\"] = band_energies_all\n", + " band_obj[\"labels\"] = label_obj;\n", + " band_obj[\"HOMO_energy\"] = HOMO;\n", + " band_obj[\"HOMO_coor\"] = coor_k_point_HOMO;\n", + " band_obj[\"LUMO_energy\"] = LUMO;\n", + " band_obj[\"LUMO_coor\"] = coor_k_point_LUMO;\n", + " band_obj[\"average_N_k_points_per_inverse_distance\"] = average_N_k_points_per_inverse_distance;\n", + "\n", + "\n", + " return band_obj\n", + "\n", + " }\n", + "\n", + "\n", + " function get_dos_obj(dos_path)\n", + " {\n", + "\n", + " var dos_data = JSON.parse(getJSON(dos_path));\n", + "\n", + " var N_dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'].length;\n", + "\n", + " //in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]\n", + "\n", + " //dos_energies = new Array(N_dos_values).fill(0.0);\n", + " //dos_energies_tmp = new Array(N_dos_values).fill(0.0) #tmp array for unit convertion\n", + " //dos_values = new Array(N_dos_values).fill(0.0)\n", + "\n", + " var dos_energies = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'];\n", + " var dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_integrated_values'];//[0]\n", + "\n", + " //To do: check if every section_dos has 'dos_fermi_energy'\n", + " var dos_fermi_energy = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_fermi_energy'];\n", + " dos_fermi_energy = dos_fermi_energy / (1.60217656535 * Math.pow(10,-19));\n", + " \n", + " for(var i = 0; i < N_dos_values; i++)\n", + " {\n", + " dos_energies[i] = dos_energies[i] / (1.60217656535 * Math.pow(10,-19)) - dos_fermi_energy;\n", + " }\n", + " \n", + " dos_obj = {}\n", + " dos_obj[\"dos_x_axis\"] = dos_energies;\n", + " dos_obj[\"dos_y_axis\"] = dos_values;\n", + " dos_obj[\"dos_fermi_energy\"] = dos_fermi_energy;\n", + " return dos_obj\n", + " }\n", + " function get_info_obj(band_path)\n", + " {\n", + "\n", + " var band_data = JSON.parse(getJSON(band_path));\n", + " var info_obj = {};\n", + " //---------Read the information of the calculation--------\n", + " info_obj[\"program_name\"] = band_data[\"section_run\"][\"program_name\"];\n", + " info_obj[\"program_basis_set_type\"] = band_data[\"section_run\"][\"program_basis_set_type\"];\n", + " info_obj[\"atom_labels\"] = band_data[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " info_obj[\"XC_functional_name\"] = band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \" + \"+ band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"];\n", + "\n", + " //----------Get the space group information----------\n", + " /*\n", + " [space_group_symbol, lattice_constant] = get_space_group(band_data);\n", + " info_obj[\"space_group_symbol\"] = np.array(space_group_symbol).tolist();\n", + " info_obj[\"lattice_constant\"] = np.array(lattice_constant).tolist();\n", + " */\n", + "\n", + " return info_obj\n", + " }\n", + " function process_band_dos_data()\n", + " {\n", + " info_all = [];\n", + " band_obj_all = [];\n", + " dos_obj_all = [];\n", + "\n", + " for(var i = 0; i < N_materials; i++)\n", + " {\n", + " var band_path = band_paths[i];\n", + " var dos_path = dos_paths[i];\n", + "\n", + "\n", + " var dos_obj = get_dos_obj(dos_path);\n", + " var dos_fermi_energy = dos_obj[\"dos_fermi_energy\"];\n", + " band_obj = get_band_obj(band_path, dos_fermi_energy);\n", + " var info_obj = get_info_obj(band_path);\n", + "\n", + " band_obj_all.push(band_obj);\n", + " dos_obj_all.push(dos_obj);\n", + " info_obj_all.push(info_obj);\n", + " }\n", + " }\n", + " process_band_dos_data();\n", + " //alert(\"process_band_dos_data: info_obj_all: \"+JSON.stringify(info_obj_all));\n", + "</script>" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "scrolled": false, + "tags": [ + "show_results_and_plot" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script>\n", + " var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + " function show_materials_submitted_info()\n", + " {\n", + " //alert(\"N_materials=\" + N_materials)\n", + " //\"table_materials_submitted_info\"\n", + " //alert(\"show_materials_submitted_info: info_obj_all: \"+JSON.stringify(info_obj_all))\n", + " var table_content = new Array(); \n", + " str = '<tr>';\n", + " str += '<th width=\"5%\"></th>'\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Atom labels</b></font></p></th>';\n", + " //str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Space group</b></font></p></th>';\n", + " //str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Lattice constants (in Ang)</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Program name</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Basis set type</b></font></p></th>';\n", + " str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Functional</b></font></p></th>';\n", + " //str += '<th width=\"20%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Number of <i>k</i> points per inverse distance</b></font></p></th>';\n", + " str += '</tr>'; //first row: head\n", + " table_content.push(str);\n", + "\n", + " for(var i = 0; i < N_materials; i++) //add info of each material\n", + " {\n", + " //alert(\"show_materials_submitted_info: material \"+ i); \n", + " table_content.push('<tr>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<input type = \\\"checkbox\\\" name = \"checkbox_material\" id = \\\"checkbox_material' + i.toString() + '\\\" unchecked onclick=\\\"checkbox_material(this.id)\\\">';\n", + " str += \"<b>  #\" + (i+1).toString() + \"</b>\";\n", + " table_content.push(str);\n", + " table_content.push('</td>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"atom_labels\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got atom_labels\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"space_group_symbol\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got space_group_symbol\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"lattice_constant\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got lattice_constant\");\n", + " */\n", + " \n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_name\"].toUpperCase() + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_name\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_basis_set_type\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_basis_set_type\");\n", + "\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"XC_functional_name\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got XC_functional_name\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got average_N_k_points_per_inverse_distance\");\n", + " */\n", + " table_content.push('</tr>');\n", + "\n", + " }\n", + " \n", + " document.getElementById(\"table_materials_submitted_info\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + " function clean_materials_selection()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " }\n", + " }\n", + "\n", + " function select_all()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"checked\";\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " function process()\n", + " {\n", + " //alert(\"Process:\"+band_paths)\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_js_plot'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_materials_submitted_info'));\n", + " show_materials_submitted_info();\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " str = N_materials.toString();\n", + " document.getElementById(\"n_materials\").innerHTML = \"Number of materials submitted: \" + str + \"<font size = 1px color = #C0C0C0 >   Please press \\'Visualize\\' to visualize the band structure. </font>\";\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " }\n", + " \n", + "\n", + " var image_band = '';\n", + " var image_dos = '';\n", + " var image_band_links = new Array(N_materials); //store the URL of each band figure -> used to compare 2 figures\n", + " var image_band_links_selected = [];\n", + " var image_band_selected_Number = []; //record which i_material has been selected\n", + "\n", + "\n", + "\n", + " function prepare(N_materials_show)\n", + " {\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " var table_content = new Array(); \n", + " //document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " //-----Generate the html tables for each material--------\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " table_content.push('<tr>');\n", + " div_string = '<div style = \\\"height: 20px\\\"></div>';\n", + " table_content.push(div_string);\n", + " table_content.push('<th>');\n", + "\n", + " //add main container div\n", + " div_string = '<div id = \\\"div_band_dos' + i.toString() + '\\\" class = \\\"div_band_dos\\\" >';\n", + " table_content.push(div_string);\n", + "\n", + " //show No. of the material\n", + " i_material = i + 1;\n", + " div_string = '<div style = \\\"height:30px\\; font-size: 15pt;\">' + '#' + i_material.toString() + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //show band_path/dos info\n", + " div_string = '<div style = \\\"height:30px\\\">' + 'Band:   ' + band_paths[i] + ',    DOS:   ' + dos_paths[i] + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_band\n", + " div_string = '<div id = \\\"div_band' + i.toString() + '\\\" class = \\\"div_band\\\" ></div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_dos\n", + " div_string = '<div id = \\\"div_dos' + i.toString() + '\\\" class = \\\"div_dos\\\" ></div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add div_tools\n", + " div_string = '<div id = \\\"div_tools' + i.toString() + '\\\" class = \\\"div_tools\\\" >'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: infomation\n", + " div_string = '<div id = \\\"div_info' + i.toString() + '\\\">atom_labels<br>program_name</div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: custom scale\n", + " div_string = '<br><p style=\\\"color: #000;font-weight: 100; font-size: 10pt; align:left\\\"> Set the lower and upper limit of energy scale (in eV): <br><br><font color=\\\"black\\\" size = 3px> Lower limit:    </font><textarea id=\\\"lowerlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">-10</textarea> <font color=\\\"black\\\" size = 3px>   eV</font>    <font color=\\\"black\\\" size = 3px> Upper limit:    </font><textarea id=\\\"upperlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">10</textarea> <font color=\\\"black\\\" size = 3px>   eV   </font></p>';\n", + " table_content.push(div_string);\n", + " div_string = '<br><button class = \\\"button_tools\\\" id = \\\"button_customscale' + i.toString() + '\\\" onclick = \\\"customscale(this.id)\\\"> Rescale </button>'; \n", + " table_content.push(div_string);\n", + "\n", + "\n", + " //add button:autoscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_autoscale' + i.toString() + '\\\" onclick = \\\"autoscale(this.id)\\\" title = \\\"(-10 eV, 10 eV)\\\"> Autoscale </button>'; \n", + " table_content.push(div_string);\n", + " //add button:fullscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_fullscale' + i.toString() + '\\\" onclick = \\\"fullscale(this.id)\\\" title = \\\"(-100 eV, 100 eV)\\\"> Full scale </button><br><br>'; \n", + " table_content.push(div_string);\n", + "\n", + " //table_content.push(\"Select and zoom:\");\n", + "\n", + " /*//overview for select and zoom\n", + " div_string = '<div id = \\\"div_overview' + i.toString() + '\\\" class = \\\"div_overview\\\" ></div>'; // <div id=\"overview\" style=\"width:300px;height:200px; margin-left:10px; margin-top: 50px; padding-top: 0px\"></div>\n", + " table_content.push(div_string);\n", + " div_string = '<p id = \\\"overviewLegend' + i.toString() + '\\\" ></p>'; // <p id=\"overviewLegend\" style=\"margin-left:10px\"></p>\n", + " table_content.push(div_string);*/\n", + "\n", + " //download figures as png\n", + " div_string = '<a id = \\\"img_band' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download band </a>';\n", + " table_content.push(div_string); \n", + " div_string = '<a id = \\\"img_dos' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download DOS </a>';\n", + " table_content.push(div_string);\n", + "\n", + " //add show VBM & CBM\n", + " div_string = '<br><br><p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_VBM' + i.toString() + '\\\" unchecked onclick=\\\"show_VBM(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Show VBM </font> (<font color=\\\"blue\\\">\\•</font>) <font color=\\\"black\\\" size = 3px> and CBM </font>(<font color=\\\"red\\\">\\•</font>) </p>';\n", + " table_content.push(div_string);\n", + "\n", + "\n", + " table_content.push('</div>');//div_tools\n", + "\n", + " //checkbox for comparison\n", + " div_string = '<div id = \\\"div_checkbox_compare' + i.toString() + '\\\" class = \\\"div_checkbox_compare\\\" >';\n", + " table_content.push(div_string);\n", + " //div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" checked = \\\"unchecked\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " table_content.push(div_string);\n", + " table_content.push('</div>');//div_checkbox_compare\n", + "\n", + "\n", + " table_content.push('</div>');//div_band_dos\n", + " table_content.push('</th>');\n", + " table_content.push('</tr>'); \n", + " }\n", + "\n", + " document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + "\n", + " function visualize_band_dos()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_jquery'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_axislabels'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_dashes'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_navigate'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_selection'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_flot_legendoncanvas'));\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " document.getElementById(\"div_compare_buttons\").style.visibility=\"\";\n", + "\n", + "\n", + "\n", + " if(N_materials > N_max_show)\n", + " {\n", + " document.getElementById(\"div_showall\").style.visibility=\"visible\";\n", + " document.getElementById(\"checkbox_showall\").checked = \"\";\n", + " } \n", + "\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + "\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + "\n", + " }\n", + "\n", + " function show_all(id)//\"plot_placeholder\"\n", + " {\n", + " var if_showall=0;\n", + " if_showall = check_show_VBM(id);\n", + " if(if_showall == 1)\n", + " {\n", + " N_materials_show = N_materials;\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + " else\n", + " {\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + "\n", + " }\n", + "\n", + " \n", + " //------------------Tool used to get the content from textarea---------------------\n", + " function get_text(textarea_id)\n", + " {\n", + " var text = document.getElementById(textarea_id).value;\n", + " return text;\n", + " }\n", + "\n", + "\n", + "\n", + " //-------------------Compare 2 band figures----------------------------------------\n", + "\n", + "\n", + " function check_compare(id)//checkbox_compare' + i.toString() + '\\\" unchecked onclick=\\\"check_compare(this.id)\n", + " {\n", + " var x = document.getElementById(id);\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " N_chosen ++;\n", + " }\n", + " }\n", + " if(N_chosen == 2) // In max. only 2 figures could be selected and compared.\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(!choices_compare[i].checked)\n", + " {\n", + " choices_compare[i].disabled = 'disabled';\n", + " }\n", + " }\n", + " }\n", + " else\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " }\n", + "\n", + " function compare()\n", + " {\n", + " $(\"#div_compare\").fadeIn(600);//show div for comparison\n", + " //check_compare(-100);\n", + "\n", + " var compare_list = [];\n", + " compare_list = make_compare_list();\n", + " //[i_material_1, i_material_2] = make_compare_list();\n", + " i_material_1 = compare_list[0];\n", + " i_material_2 = compare_list[1];\n", + " //document.getElementById(\"demo\").innerHTML = \"In add info compare:\" + i_material_1.toString() + i_material_2.toString();\n", + " compare_figures(i_material_1, i_material_2); \n", + " }\n", + " function make_compare_list()\n", + " {\n", + " //get the links to the images\n", + " images_selected_links = []; //store the links to the figures for comparison\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " var str = ''; //tmp str for debug\n", + " var figure_selected = new Array(2);\n", + " for(var i=0; i<choices_compare.length; i++) //check which figures are selected\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " id_chosen = choices_compare[i].id;\n", + " i_chosen = Math.round(id_chosen.substring(16));\n", + " var tmp_str = image_band_links[i_chosen];\n", + " images_selected_links.push(tmp_str);\n", + " figure_selected[N_chosen] = i_chosen;\n", + " N_chosen ++;\n", + " //str += beakerx.image_band_links[i];\n", + " }\n", + " }\n", + " var i_material_1 = 0;\n", + " var i_material_2 = 0;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list';\n", + " image_band_links_selected = images_selected_links;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list: next';\n", + " if(N_chosen == 2)\n", + " {\n", + " i_material_1 = figure_selected[0];\n", + " i_material_2 = figure_selected[1];\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Compare_list: ' +i_material_1.toString() + ' ' + i_material_2.toString();\n", + "\n", + " return [i_material_1, i_material_2];\n", + " }\n", + "\n", + " function check_compare_scale(i_material_1, i_material_2)\n", + " {\n", + " lowerlimit_id_1 = \"lowerlimit\" + i_material_1.toString();\n", + " lowerlimit_id_2 = \"lowerlimit\" + i_material_2.toString();\n", + " upperlimit_id_1 = \"upperlimit\" + i_material_1.toString();\n", + " upperlimit_id_2 = \"upperlimit\" + i_material_2.toString();\n", + "\n", + " lowerlimit_1 = parseFloat(document.getElementById(lowerlimit_id_1).innerHTML);\n", + " lowerlimit_2 = parseFloat(document.getElementById(lowerlimit_id_2).innerHTML);\n", + " upperlimit_1 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " upperlimit_2 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " if((lowerlimit_1 != lowerlimit_2) || (upperlimit_1 != upperlimit_2))\n", + " return -1;\n", + " else\n", + " return 1;\n", + " }\n", + "\n", + " function compare_figures(i_material_1, i_material_2)\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_query_beforeafter'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_compare_slide'));\n", + " add_info_compare(i_material_1, i_material_2);\n", + " document.getElementById(\"div_compare_container\").scrollIntoView({ behavior: 'smooth' }); \n", + " document.getElementById(\"div_compare_container\").scrollTop += 50;\n", + "\n", + " }\n", + "\n", + "\n", + " function clean_compare_list()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " //-----------Add information about the calculation to \"div_tools\"---------------\n", + " function add_info(i)\n", + " {\n", + " \n", + " //document.getElementById(\"demoa\").innerHTML = i.toString() + div_info_id;\n", + " //for(var i = 0; i < beakerx.N_materials; i++)\n", + " //{\n", + " div_info_id = \"div_info\" + i.toString();\n", + "\n", + " var str = '';\n", + " str += \"<br> <p style=\\\"text-align:left\\\"><font size = 3pt><b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"] + '</font></p>';\n", + " //str += \"<font size = 3pt><b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"] + '</font>';\n", + " //str += \"<font size = 3pt><b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"] + '</font>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase() + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3) + '</font></p>';\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " //document.getElementById('program_name_1').innerHTML = \"<b>Code:</b>    \" + origData[\"program_name\"];\n", + " //document.getElementById('program_basis_set_type_1').innerHTML = \"<b>Basis set type:</b>    \" + origData[\"program_basis_set_type\"];\n", + " //document.getElementById('XC_functional_name_1').innerHTML = \"<b>Functional:</b>    \" + origData[\"XC_functional_name\"]; \n", + " //}\n", + " \n", + " }\n", + " function add_info_compare(i,j)\n", + " {\n", + "\n", + " div_info_id = \"div_compare_info\";\n", + " var str = '';\n", + "\n", + " if_same_scale = check_compare_scale(i_material_1, i_material_2);\n", + " if(if_same_scale == -1)\n", + " {\n", + " str = '<b><font size = \"15pt\" color=\"#940000\">Error: Different lower/upper limits.</font></b><br>';\n", + " document.getElementById(\"div_compare_container\").innerHTML = str;\n", + " document.getElementById(div_info_id).innerHTML = '';\n", + " return;\n", + " }\n", + "\n", + " str += \"<br><b><font-size:15pt>Information of the first calculation (left):</font></b> <br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"];\n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"<br><br><br><b><font-size:15pt>Information of the second calculation (right):</font></b><br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[j][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[j][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[j][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[j][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[j][\"program_basis_set_type\"]; \n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[j][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " }\n", + "\n", + "\n", + "\n", + " //-----------------------Show/hide VBM, CBM-------------------------\n", + " function check_show_VBM(checkbox_VBM_id)\n", + " {\n", + " var x = document.getElementById(checkbox_VBM_id);\n", + " var if_checked = 0;\n", + " if(x.checked)//== \"checked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"checked!\";\n", + " if_checked = 1;\n", + " }\n", + " else if (x.unchecked)// == \"unchecked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"unchecked!\";\n", + " if_checked = -1;\n", + " }\n", + " else\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"nothing detected!\";\n", + " }\n", + " return if_checked;\n", + " }\n", + "\n", + " function check_if_in_compare_list(i) // check if the current material i is to be compared\n", + " {\n", + "\n", + " var checkbox_compare_id = \"checkbox_compare\" + i.toString();\n", + " var if_compare = check_show_VBM(checkbox_compare_id);\n", + " //document.getElementById(\"demo\").innerHTML = 'if_compare of ' + i.toString() + ' : ' + if_compare.toString();\n", + " var i_compare_material_1, i_compare_material_2;\n", + " [i_compare_material_1, i_compare_material_2] = make_compare_list();\n", + " var i_in_compare_list = -1;\n", + " if(i_compare_material_1 == i)\n", + " {\n", + " i_in_compare_list = 1;\n", + " }\n", + " else if (i_compare_material_2 == i)\n", + " {\n", + " i_in_compare_list = 2;\n", + " }\n", + " else\n", + " {\n", + " i_in_compare_list = 0;\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Checking ' + i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + " return [if_compare, i_in_compare_list];\n", + " }\n", + "\n", + " function show_VBM(id)\n", + " {\n", + " //prepare(\"new\");\n", + " //var if_show_VBM = -1;\n", + " var len_id = id.length;\n", + " var i_material = id.substring(12);\n", + " var i = Math.round(i_material);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + " //document.getElementById(\"demo\").innerHTML = i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + "\n", + " //---------------------Functions to rescale-------------------------------------------\n", + " function autoscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"10.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-10.0\";\n", + "\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function fullscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"100.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-100.0\";\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, -100, 100, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function customscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(18);\n", + " var i = Math.round(i_material);\n", + " //\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " upperlim = document.getElementById(upperlim_id).value;\n", + " upperlim_float = Math.round(upperlim);\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " lowerlim = document.getElementById(lowerlim_id).value;\n", + " lowerlim_float = Math.round(lowerlim);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, lowerlim_float, upperlim_float, if_show_VBM, if_compare, i_in_compare_list); \n", + " }\n", + "\n", + "\n", + " function plot_band_dos(lowerLim, upperLim, N_materials_show)\n", + " {\n", + " placeholder_band = \"#div_band1\";\n", + " placeholder_dos = \"#div_dos1\";\n", + " // lowerLim = -10.01\n", + " //upperLim = 10.01\n", + "\n", + "\n", + "\n", + " //alert(\"plot_band_dos\");\n", + " //prepare();\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " \n", + " var checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + " add_info(i);\n", + " }\n", + "\n", + " //------Plot----------------\n", + " /*\n", + " for(var i_material = 0; i_material < N_materials_show; i_material++)\n", + " {\n", + "\n", + " //alert(\"Material \"+i);\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " */\n", + " //alert(\"next:for\")\n", + " for (let i_material = 0, p = Promise.resolve(); i_material < N_materials_show; i_material++) {\n", + " p = p.then(_ => new Promise(resolve =>\n", + " setTimeout(function () {\n", + " //alert(i_material)\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected == 1)\n", + " {\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " resolve();\n", + " }, 0)\n", + " ));\n", + " }\n", + "\n", + "\n", + " return 1;\n", + " }\n", + "\n", + " var i = 0\n", + " var lowerLim = -10\n", + " var upperLim = 10\n", + " var if_show_VBM = 0\n", + " var if_compare = 0\n", + " var i_in_compare_list = -1\n", + "\n", + "\n", + " \n", + " function plot_band_dos_i(i_material, lowerLim_material, upperLim_material, if_show_VBM_material, if_compare_material, i_in_compare_list_material)\n", + " {\n", + " //alert(\"plot_band_dos_i\")\n", + "\n", + " i = i_material;\n", + " lowerLim = lowerLim_material;\n", + " upperLim = upperLim_material;\n", + " if_show_VBM = if_show_VBM_material;\n", + " if_compare = if_compare_material;\n", + " i_in_compare_list = i_in_compare_list_material;\n", + " //alert(\"plot_band_dos_i: i_material: \"+i)\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_band'));\n", + " //alert('i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list')\n", + " //plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_dos'));\n", + " } \n", + "</script>\n", + "\n", + " \n", + " \n", + "<br><br>\n", + "<button class=\"button\" onclick=\"process()\">Process data</button>\n", + "<br><br>\n", + "<div id = \"n_materials\" style = \"font-size: 18px; font-weight: 100; height: 60px; width: 100%;\"> Number of materials submitted: 0</div>\n", + "<div id = \"show_materials_submitted\" style = \"font-size: 20px; font-color: black;\"> </div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "<p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select materials to visualize the band structure and DOS:</p>\n", + "<div style = \"width :100%; height: 10px;\"></div> \n", + "<button class = \"button\" onclick = \"clean_materials_selection()\"> Clean selections </button> \n", + "<button class = \"button\" onclick = \"select_all()\"> Select all </button> \n", + "<button class = \"button\" onclick = \"visualize_band_dos()\"> Visualize </button> \n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "<div id = \"show_materials_submitted_info\" style = \"width: 100%; font-size: 20px; font-color: black;\"> \n", + " <table id = \"table_materials_submitted_info\" style=\"width:100%\"> </table>\n", + "</div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "\n", + "\n", + "\n", + "<div id=\"div_compare_buttons\" style=\"visibility:hidden\">\n", + " <br><br><br>\n", + " <p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select two materials in the checkbox on the right for comparison:</p>\n", + " <p style=\"color: #000;font-weight: 1000; font-size: 8pt;\"></p>\n", + " <button class = \"button\" onclick = \"clean_compare_list()\"> Clean selections </button> \n", + " <button class = \"button\" onclick = \"compare();compare()\" title = \"Select 2 materials in the checkbox below and compare: please make sure that the upper/lower limits are the same (using Rescale/Autoscale buttons).\" > Compare</button>\n", + "</div>\n", + "\n", + "\n", + "\n", + "<div id = \"div_showall\" style = \"width: 100%; visibility:hidden\">\n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + " <input type = \"checkbox\" id = \"checkbox_showall\" unchecked onclick=\"show_all(this.id)\"/> <font color=\"black\" size = 3px> Show all results </font><font size = 2px color = \"#666\"> (By default only the first 10 results are shown.) </font> \n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + "</div>\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "<div id = \"div_compare\" style = \"position: fixed; top: 20%; left: 10%; width: 1200px; height: 600px; z-index: 999999; border: 1px solid #555; background-color: #fff; display: none\" onclick = \"$(this).fadeOut(500)\"> \n", + " \n", + " <div style = \"float: right; width: 80px; height: 25px; margin-top: 10px; margin-right: 10px; z-index: 1000000; border: 1px solid #555; text-align: center; vertical-align: middle; background-color: #f9f9f9; font-size:12pt; font-color: #000; cursor:pointer;\" > CLOSE </div> <!--button to close the div-->\n", + " <div id = \"div_compare_info\" style = \" width: 350px; height: 500px; float: right; margin-top: 50px; margin-right: 10px; z-index: 10000000;\"></div>\n", + " <div id = \"div_compare_container\" style = \"margin-top: 50px; margin-left: 100px; width: 600px; height: 300px;\">\n", + " <div class=\"g-before-after\" id = \"div_compare_containerx\"></div>\n", + " </div>\n", + "</div>\n", + "\n", + "\n", + "<div id = \"demo\"></div>\n", + "\n", + "<div id = \"plot_placeholder\">\n", + " <div><br></div>\n", + " <table id = \"table_visualize\"> </table>\n", + "</div>\n", + "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script>\n", + " var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + " function show_materials_submitted_info()\n", + " {\n", + " //alert(\"N_materials=\" + N_materials)\n", + " //\"table_materials_submitted_info\"\n", + " //alert(\"show_materials_submitted_info: info_obj_all: \"+JSON.stringify(info_obj_all))\n", + " var table_content = new Array(); \n", + " str = '<tr>';\n", + " str += '<th width=\"5%\"></th>'\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Atom labels</b></font></p></th>';\n", + " //str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Space group</b></font></p></th>';\n", + " //str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Lattice constants (in Ang)</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Program name</b></font></p></th>';\n", + " str += '<th width=\"10%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Basis set type</b></font></p></th>';\n", + " str += '<th width=\"15%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Functional</b></font></p></th>';\n", + " //str += '<th width=\"20%\"><p style=\\\"text-align:center\\\"><font size = \\\"4pt\\\"><b>Number of <i>k</i> points per inverse distance</b></font></p></th>';\n", + " str += '</tr>'; //first row: head\n", + " table_content.push(str);\n", + "\n", + " for(var i = 0; i < N_materials; i++) //add info of each material\n", + " {\n", + " //alert(\"show_materials_submitted_info: material \"+ i); \n", + " table_content.push('<tr>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<input type = \\\"checkbox\\\" name = \"checkbox_material\" id = \\\"checkbox_material' + i.toString() + '\\\" unchecked onclick=\\\"checkbox_material(this.id)\\\">';\n", + " str += \"<b>  #\" + (i+1).toString() + \"</b>\";\n", + " table_content.push(str);\n", + " table_content.push('</td>');\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"atom_labels\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got atom_labels\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"space_group_symbol\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got space_group_symbol\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"lattice_constant\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got lattice_constant\");\n", + " */\n", + " \n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_name\"].toUpperCase() + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_name\");\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"program_basis_set_type\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got program_basis_set_type\");\n", + "\n", + "\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += info_obj_all[i][\"XC_functional_name\"] + ';   ';\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got XC_functional_name\");\n", + "\n", + " /*\n", + " table_content.push('<td>'); \n", + " str = '<font size = \\\"3pt\\\">';\n", + " str += band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"</font>\"\n", + " table_content.push(str); \n", + " table_content.push('</td>');\n", + " //alert(\"got average_N_k_points_per_inverse_distance\");\n", + " */\n", + " table_content.push('</tr>');\n", + "\n", + " }\n", + " \n", + " document.getElementById(\"table_materials_submitted_info\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + " function clean_materials_selection()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " }\n", + " }\n", + "\n", + " function select_all()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_material\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"checked\";\n", + " }\n", + " }\n", + "\n", + "\n", + "\n", + " function process()\n", + " {\n", + " //alert(\"Process:\"+band_paths)\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_js_plot'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_materials_submitted_info'));\n", + " show_materials_submitted_info();\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " str = N_materials.toString();\n", + " document.getElementById(\"n_materials\").innerHTML = \"Number of materials submitted: \" + str + \"<font size = 1px color = #C0C0C0 >   Please press \\'Visualize\\' to visualize the band structure. </font>\";\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " }\n", + " \n", + "\n", + " var image_band = '';\n", + " var image_dos = '';\n", + " var image_band_links = new Array(N_materials); //store the URL of each band figure -> used to compare 2 figures\n", + " var image_band_links_selected = [];\n", + " var image_band_selected_Number = []; //record which i_material has been selected\n", + "\n", + "\n", + "\n", + " function prepare(N_materials_show)\n", + " {\n", + " document.getElementById(\"table_visualize\").innerHTML = \"\";\n", + " var table_content = new Array(); \n", + " //document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " //-----Generate the html tables for each material--------\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " table_content.push('<tr>');\n", + " div_string = '<div style = \\\"height: 20px\\\"></div>';\n", + " table_content.push(div_string);\n", + " table_content.push('<th>');\n", + "\n", + " //add main container div\n", + " div_string = '<div id = \\\"div_band_dos' + i.toString() + '\\\" class = \\\"div_band_dos\\\" >';\n", + " table_content.push(div_string);\n", + "\n", + " //show No. of the material\n", + " i_material = i + 1;\n", + " div_string = '<div style = \\\"height:30px\\; font-size: 15pt;\">' + '#' + i_material.toString() + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //show band_path/dos info\n", + " div_string = '<div style = \\\"height:30px\\\">' + 'Band:   ' + band_paths[i] + ',    DOS:   ' + dos_paths[i] + '</div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_band\n", + " div_string = '<div id = \\\"div_band' + i.toString() + '\\\" class = \\\"div_band\\\" ></div>';\n", + " table_content.push(div_string);\n", + "\n", + " //add div_dos\n", + " div_string = '<div id = \\\"div_dos' + i.toString() + '\\\" class = \\\"div_dos\\\" ></div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add div_tools\n", + " div_string = '<div id = \\\"div_tools' + i.toString() + '\\\" class = \\\"div_tools\\\" >'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: infomation\n", + " div_string = '<div id = \\\"div_info' + i.toString() + '\\\">atom_labels<br>program_name</div>'; \n", + " table_content.push(div_string);\n", + "\n", + " //add: custom scale\n", + " div_string = '<br><p style=\\\"color: #000;font-weight: 100; font-size: 10pt; align:left\\\"> Set the lower and upper limit of energy scale (in eV): <br><br><font color=\\\"black\\\" size = 3px> Lower limit:    </font><textarea id=\\\"lowerlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">-10</textarea> <font color=\\\"black\\\" size = 3px>   eV</font>    <font color=\\\"black\\\" size = 3px> Upper limit:    </font><textarea id=\\\"upperlimit' + i.toString() + '\\\" rows=\\\"1\\\" style = \\\"width: 70px;\\\">10</textarea> <font color=\\\"black\\\" size = 3px>   eV   </font></p>';\n", + " table_content.push(div_string);\n", + " div_string = '<br><button class = \\\"button_tools\\\" id = \\\"button_customscale' + i.toString() + '\\\" onclick = \\\"customscale(this.id)\\\"> Rescale </button>'; \n", + " table_content.push(div_string);\n", + "\n", + "\n", + " //add button:autoscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_autoscale' + i.toString() + '\\\" onclick = \\\"autoscale(this.id)\\\" title = \\\"(-10 eV, 10 eV)\\\"> Autoscale </button>'; \n", + " table_content.push(div_string);\n", + " //add button:fullscale\n", + " div_string = '<button class = \\\"button_tools\\\" id = \\\"button_fullscale' + i.toString() + '\\\" onclick = \\\"fullscale(this.id)\\\" title = \\\"(-100 eV, 100 eV)\\\"> Full scale </button><br><br>'; \n", + " table_content.push(div_string);\n", + "\n", + " //table_content.push(\"Select and zoom:\");\n", + "\n", + " /*//overview for select and zoom\n", + " div_string = '<div id = \\\"div_overview' + i.toString() + '\\\" class = \\\"div_overview\\\" ></div>'; // <div id=\"overview\" style=\"width:300px;height:200px; margin-left:10px; margin-top: 50px; padding-top: 0px\"></div>\n", + " table_content.push(div_string);\n", + " div_string = '<p id = \\\"overviewLegend' + i.toString() + '\\\" ></p>'; // <p id=\"overviewLegend\" style=\"margin-left:10px\"></p>\n", + " table_content.push(div_string);*/\n", + "\n", + " //download figures as png\n", + " div_string = '<a id = \\\"img_band' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download band </a>';\n", + " table_content.push(div_string); \n", + " div_string = '<a id = \\\"img_dos' + i.toString() + '\\\" class = \\\"button_tools\\\" target=\\\"_blank\\\" style = \\\"text-decoration: none;\\\" > Download DOS </a>';\n", + " table_content.push(div_string);\n", + "\n", + " //add show VBM & CBM\n", + " div_string = '<br><br><p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_VBM' + i.toString() + '\\\" unchecked onclick=\\\"show_VBM(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Show VBM </font> (<font color=\\\"blue\\\">\\•</font>) <font color=\\\"black\\\" size = 3px> and CBM </font>(<font color=\\\"red\\\">\\•</font>) </p>';\n", + " table_content.push(div_string);\n", + "\n", + "\n", + " table_content.push('</div>');//div_tools\n", + "\n", + " //checkbox for comparison\n", + " div_string = '<div id = \\\"div_checkbox_compare' + i.toString() + '\\\" class = \\\"div_checkbox_compare\\\" >';\n", + " table_content.push(div_string);\n", + " //div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " div_string = '<p style = \\\"text-normal-black\\\"> <input type = \\\"checkbox\\\" id = \\\"checkbox_compare' + i.toString() + '\\\" checked = \\\"unchecked\\\" unchecked name = \\\"checkbox_compare\\\" onclick=\\\"check_compare(this.id)\\\"> <font color=\\\"black\\\" size = 3px> Compare </font></p><p><font size = 2px color = \"#666\">(select max. 2 materials) </font> </p>';\n", + " table_content.push(div_string);\n", + " table_content.push('</div>');//div_checkbox_compare\n", + "\n", + "\n", + " table_content.push('</div>');//div_band_dos\n", + " table_content.push('</th>');\n", + " table_content.push('</tr>'); \n", + " }\n", + "\n", + " document.getElementById(\"table_visualize\").innerHTML = table_content.join('');\n", + " }\n", + "\n", + "\n", + " function visualize_band_dos()\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_jquery'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_axislabels'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_dashes'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_navigate'));\n", + " //Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_selection'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_flot_legendoncanvas'));\n", + " document.getElementById(\"div_showall\").style.visibility=\"hidden\";\n", + " document.getElementById(\"div_compare_buttons\").style.visibility=\"\";\n", + "\n", + "\n", + "\n", + " if(N_materials > N_max_show)\n", + " {\n", + " document.getElementById(\"div_showall\").style.visibility=\"visible\";\n", + " document.getElementById(\"checkbox_showall\").checked = \"\";\n", + " } \n", + "\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + "\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + "\n", + " }\n", + "\n", + " function show_all(id)//\"plot_placeholder\"\n", + " {\n", + " var if_showall=0;\n", + " if_showall = check_show_VBM(id);\n", + " if(if_showall == 1)\n", + " {\n", + " N_materials_show = N_materials;\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + " else\n", + " {\n", + " N_materials_show = Math.min(N_max_show, N_materials);\n", + " prepare(N_materials_show);\n", + " clean_compare_list();\n", + " plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);\n", + " }\n", + "\n", + " }\n", + "\n", + " \n", + " //------------------Tool used to get the content from textarea---------------------\n", + " function get_text(textarea_id)\n", + " {\n", + " var text = document.getElementById(textarea_id).value;\n", + " return text;\n", + " }\n", + "\n", + "\n", + "\n", + " //-------------------Compare 2 band figures----------------------------------------\n", + "\n", + "\n", + " function check_compare(id)//checkbox_compare' + i.toString() + '\\\" unchecked onclick=\\\"check_compare(this.id)\n", + " {\n", + " var x = document.getElementById(id);\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " N_chosen ++;\n", + " }\n", + " }\n", + " if(N_chosen == 2) // In max. only 2 figures could be selected and compared.\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " if(!choices_compare[i].checked)\n", + " {\n", + " choices_compare[i].disabled = 'disabled';\n", + " }\n", + " }\n", + " }\n", + " else\n", + " {\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " }\n", + "\n", + " function compare()\n", + " {\n", + " $(\"#div_compare\").fadeIn(600);//show div for comparison\n", + " //check_compare(-100);\n", + "\n", + " var compare_list = [];\n", + " compare_list = make_compare_list();\n", + " //[i_material_1, i_material_2] = make_compare_list();\n", + " i_material_1 = compare_list[0];\n", + " i_material_2 = compare_list[1];\n", + " //document.getElementById(\"demo\").innerHTML = \"In add info compare:\" + i_material_1.toString() + i_material_2.toString();\n", + " compare_figures(i_material_1, i_material_2); \n", + " }\n", + " function make_compare_list()\n", + " {\n", + " //get the links to the images\n", + " images_selected_links = []; //store the links to the figures for comparison\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " var N_chosen = 0;\n", + " var str = ''; //tmp str for debug\n", + " var figure_selected = new Array(2);\n", + " for(var i=0; i<choices_compare.length; i++) //check which figures are selected\n", + " {\n", + " if(choices_compare[i].checked)\n", + " {\n", + " id_chosen = choices_compare[i].id;\n", + " i_chosen = Math.round(id_chosen.substring(16));\n", + " var tmp_str = image_band_links[i_chosen];\n", + " images_selected_links.push(tmp_str);\n", + " figure_selected[N_chosen] = i_chosen;\n", + " N_chosen ++;\n", + " //str += beakerx.image_band_links[i];\n", + " }\n", + " }\n", + " var i_material_1 = 0;\n", + " var i_material_2 = 0;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list';\n", + " image_band_links_selected = images_selected_links;\n", + " //document.getElementById(\"demo\").innerHTML = 'In making comare list: next';\n", + " if(N_chosen == 2)\n", + " {\n", + " i_material_1 = figure_selected[0];\n", + " i_material_2 = figure_selected[1];\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Compare_list: ' +i_material_1.toString() + ' ' + i_material_2.toString();\n", + "\n", + " return [i_material_1, i_material_2];\n", + " }\n", + "\n", + " function check_compare_scale(i_material_1, i_material_2)\n", + " {\n", + " lowerlimit_id_1 = \"lowerlimit\" + i_material_1.toString();\n", + " lowerlimit_id_2 = \"lowerlimit\" + i_material_2.toString();\n", + " upperlimit_id_1 = \"upperlimit\" + i_material_1.toString();\n", + " upperlimit_id_2 = \"upperlimit\" + i_material_2.toString();\n", + "\n", + " lowerlimit_1 = parseFloat(document.getElementById(lowerlimit_id_1).innerHTML);\n", + " lowerlimit_2 = parseFloat(document.getElementById(lowerlimit_id_2).innerHTML);\n", + " upperlimit_1 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " upperlimit_2 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);\n", + " if((lowerlimit_1 != lowerlimit_2) || (upperlimit_1 != upperlimit_2))\n", + " return -1;\n", + " else\n", + " return 1;\n", + " }\n", + "\n", + " function compare_figures(i_material_1, i_material_2)\n", + " {\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_query_beforeafter'));\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_compare_slide'));\n", + " add_info_compare(i_material_1, i_material_2);\n", + " document.getElementById(\"div_compare_container\").scrollIntoView({ behavior: 'smooth' }); \n", + " document.getElementById(\"div_compare_container\").scrollTop += 50;\n", + "\n", + " }\n", + "\n", + "\n", + " function clean_compare_list()\n", + " {\n", + " var choices_compare = document.getElementsByName(\"checkbox_compare\");\n", + " for(var i=0; i<choices_compare.length; i++)\n", + " {\n", + " //choices_compare[i].removeAttribute('checked');\n", + " //choices_compare[i].setAttribute(\"unchecked\", \"unchecked\");\n", + " choices_compare[i].checked = \"\";\n", + " choices_compare[i].removeAttribute('disabled');\n", + " }\n", + " }\n", + "\n", + " //-----------Add information about the calculation to \"div_tools\"---------------\n", + " function add_info(i)\n", + " {\n", + " \n", + " //document.getElementById(\"demoa\").innerHTML = i.toString() + div_info_id;\n", + " //for(var i = 0; i < beakerx.N_materials; i++)\n", + " //{\n", + " div_info_id = \"div_info\" + i.toString();\n", + "\n", + " var str = '';\n", + " str += \"<br> <p style=\\\"text-align:left\\\"><font size = 3pt><b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"] + '</font></p>';\n", + " //str += \"<font size = 3pt><b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"] + '</font>';\n", + " //str += \"<font size = 3pt><b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"] + '</font>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase() + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"] + '</font></p>';\n", + " str += \"<p style=\\\"text-align:left\\\"><font size = 3pt><b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[i][\"average_N_k_points_per_inverse_distance\"].toFixed(3) + '</font></p>';\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " //document.getElementById('program_name_1').innerHTML = \"<b>Code:</b>    \" + origData[\"program_name\"];\n", + " //document.getElementById('program_basis_set_type_1').innerHTML = \"<b>Basis set type:</b>    \" + origData[\"program_basis_set_type\"];\n", + " //document.getElementById('XC_functional_name_1').innerHTML = \"<b>Functional:</b>    \" + origData[\"XC_functional_name\"]; \n", + " //}\n", + " \n", + " }\n", + " function add_info_compare(i,j)\n", + " {\n", + "\n", + " div_info_id = \"div_compare_info\";\n", + " var str = '';\n", + "\n", + " if_same_scale = check_compare_scale(i_material_1, i_material_2);\n", + " if(if_same_scale == -1)\n", + " {\n", + " str = '<b><font size = \"15pt\" color=\"#940000\">Error: Different lower/upper limits.</font></b><br>';\n", + " document.getElementById(\"div_compare_container\").innerHTML = str;\n", + " document.getElementById(div_info_id).innerHTML = '';\n", + " return;\n", + " }\n", + "\n", + " str += \"<br><b><font-size:15pt>Information of the first calculation (left):</font></b> <br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[i][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[i][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[i][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[i][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[i][\"program_basis_set_type\"];\n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[i][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " str += \"<br><br><br><b><font-size:15pt>Information of the second calculation (right):</font></b><br>\";\n", + " str += \"<br> <b>Atom labels:</b>     \" + info_obj_all[j][\"atom_labels\"];\n", + " //str += \"<br> <b>Space group:</b>     \" + info_obj_all[j][\"space_group_symbol\"];\n", + " //str += \"<br> <b>Lattice constants (in Ang):</b>     \" + info_obj_all[j][\"lattice_constant\"];\n", + " str += \"<br> <b>Program name:</b>    \" + info_obj_all[j][\"program_name\"].toUpperCase();\n", + " str += \"<br> <b>Basis set type:</b>    \" + info_obj_all[j][\"program_basis_set_type\"]; \n", + " str += \"<br> <b>Functional:</b>    \" + info_obj_all[j][\"XC_functional_name\"];\n", + " str += \"<br> <b>Number of <i>k</i> points per inverse distance:</b>    \" + band_obj_all[j][\"average_N_k_points_per_inverse_distance\"].toFixed(3);\n", + " document.getElementById(div_info_id).innerHTML = str;// + origData[\"atom_labels\"];\n", + " }\n", + "\n", + "\n", + "\n", + " //-----------------------Show/hide VBM, CBM-------------------------\n", + " function check_show_VBM(checkbox_VBM_id)\n", + " {\n", + " var x = document.getElementById(checkbox_VBM_id);\n", + " var if_checked = 0;\n", + " if(x.checked)//== \"checked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"checked!\";\n", + " if_checked = 1;\n", + " }\n", + " else if (x.unchecked)// == \"unchecked\")\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"unchecked!\";\n", + " if_checked = -1;\n", + " }\n", + " else\n", + " {\n", + " //document.getElementById(\"demoa\").innerHTML = \"nothing detected!\";\n", + " }\n", + " return if_checked;\n", + " }\n", + "\n", + " function check_if_in_compare_list(i) // check if the current material i is to be compared\n", + " {\n", + "\n", + " var checkbox_compare_id = \"checkbox_compare\" + i.toString();\n", + " var if_compare = check_show_VBM(checkbox_compare_id);\n", + " //document.getElementById(\"demo\").innerHTML = 'if_compare of ' + i.toString() + ' : ' + if_compare.toString();\n", + " var i_compare_material_1, i_compare_material_2;\n", + " [i_compare_material_1, i_compare_material_2] = make_compare_list();\n", + " var i_in_compare_list = -1;\n", + " if(i_compare_material_1 == i)\n", + " {\n", + " i_in_compare_list = 1;\n", + " }\n", + " else if (i_compare_material_2 == i)\n", + " {\n", + " i_in_compare_list = 2;\n", + " }\n", + " else\n", + " {\n", + " i_in_compare_list = 0;\n", + " }\n", + " //document.getElementById(\"demo\").innerHTML = 'Checking ' + i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + " return [if_compare, i_in_compare_list];\n", + " }\n", + "\n", + " function show_VBM(id)\n", + " {\n", + " //prepare(\"new\");\n", + " //var if_show_VBM = -1;\n", + " var len_id = id.length;\n", + " var i_material = id.substring(12);\n", + " var i = Math.round(i_material);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + " //document.getElementById(\"demo\").innerHTML = i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + "\n", + " //---------------------Functions to rescale-------------------------------------------\n", + " function autoscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"10.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-10.0\";\n", + "\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + " plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function fullscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(16);\n", + " var i = Math.round(i_material);\n", + "\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " document.getElementById(upperlim_id).innerHTML =\"100.0\";\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " document.getElementById(lowerlim_id).innerHTML =\"-100.0\";\n", + "\n", + " //document.getElementById(\"demoa\").innerHTML =i_material;\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, -100, 100, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + " }\n", + "\n", + " function customscale(id)\n", + " {\n", + " var len_id = id.length;\n", + " var i_material = id.substring(18);\n", + " var i = Math.round(i_material);\n", + " //\n", + " upperlim_id = \"upperlimit\" + i_material;\n", + " upperlim = document.getElementById(upperlim_id).value;\n", + " upperlim_float = Math.round(upperlim);\n", + " lowerlim_id = \"lowerlimit\" + i_material;\n", + " lowerlim = document.getElementById(lowerlim_id).value;\n", + " lowerlim_float = Math.round(lowerlim);\n", + "\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + "\n", + " var if_compare, i_in_compare_list;\n", + " [if_compare, i_in_compare_list] = check_if_in_compare_list(i);\n", + "\n", + "\n", + "\n", + " plot_band_dos_i(i, lowerlim_float, upperlim_float, if_show_VBM, if_compare, i_in_compare_list); \n", + " }\n", + "\n", + "\n", + " function plot_band_dos(lowerLim, upperLim, N_materials_show)\n", + " {\n", + " placeholder_band = \"#div_band1\";\n", + " placeholder_dos = \"#div_dos1\";\n", + " // lowerLim = -10.01\n", + " //upperLim = 10.01\n", + "\n", + "\n", + "\n", + " //alert(\"plot_band_dos\");\n", + " //prepare();\n", + " for(var i = 0; i < N_materials_show; i++)\n", + " {\n", + " \n", + " var checkbox_material_id = \"checkbox_material\" + i.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + " add_info(i);\n", + " }\n", + "\n", + " //------Plot----------------\n", + " /*\n", + " for(var i_material = 0; i_material < N_materials_show; i_material++)\n", + " {\n", + "\n", + " //alert(\"Material \"+i);\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected != 1)\n", + " {\n", + " continue;\n", + " }\n", + "\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " */\n", + " //alert(\"next:for\")\n", + " for (let i_material = 0, p = Promise.resolve(); i_material < N_materials_show; i_material++) {\n", + " p = p.then(_ => new Promise(resolve =>\n", + " setTimeout(function () {\n", + " //alert(i_material)\n", + " var checkbox_material_id = \"checkbox_material\" + i_material.toString();\n", + " var if_selected = check_show_VBM(checkbox_material_id);\n", + " if(if_selected == 1)\n", + " {\n", + " plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);\n", + " }\n", + " resolve();\n", + " }, 0)\n", + " ));\n", + " }\n", + "\n", + "\n", + " return 1;\n", + " }\n", + "\n", + " var i = 0\n", + " var lowerLim = -10\n", + " var upperLim = 10\n", + " var if_show_VBM = 0\n", + " var if_compare = 0\n", + " var i_in_compare_list = -1\n", + "\n", + "\n", + " \n", + " function plot_band_dos_i(i_material, lowerLim_material, upperLim_material, if_show_VBM_material, if_compare_material, i_in_compare_list_material)\n", + " {\n", + " //alert(\"plot_band_dos_i\")\n", + "\n", + " i = i_material;\n", + " lowerLim = lowerLim_material;\n", + " upperLim = upperLim_material;\n", + " if_show_VBM = if_show_VBM_material;\n", + " if_compare = if_compare_material;\n", + " i_in_compare_list = i_in_compare_list_material;\n", + " //alert(\"plot_band_dos_i: i_material: \"+i)\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_band'));\n", + " //alert('i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list')\n", + " //plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + " Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_dos'));\n", + " } \n", + "</script>\n", + "\n", + " \n", + " \n", + "<br><br>\n", + "<button class=\"button\" onclick=\"process()\">Process data</button>\n", + "<br><br>\n", + "<div id = \"n_materials\" style = \"font-size: 18px; font-weight: 100; height: 60px; width: 100%;\"> Number of materials submitted: 0</div>\n", + "<div id = \"show_materials_submitted\" style = \"font-size: 20px; font-color: black;\"> </div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "<p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select materials to visualize the band structure and DOS:</p>\n", + "<div style = \"width :100%; height: 10px;\"></div> \n", + "<button class = \"button\" onclick = \"clean_materials_selection()\"> Clean selections </button> \n", + "<button class = \"button\" onclick = \"select_all()\"> Select all </button> \n", + "<button class = \"button\" onclick = \"visualize_band_dos()\"> Visualize </button> \n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "<div id = \"show_materials_submitted_info\" style = \"width: 100%; font-size: 20px; font-color: black;\"> \n", + " <table id = \"table_materials_submitted_info\" style=\"width:100%\"> </table>\n", + "</div>\n", + "\n", + "<div style = \"width :100%; height: 30px;\"></div> \n", + "\n", + "\n", + "\n", + "\n", + "<div id=\"div_compare_buttons\" style=\"visibility:hidden\">\n", + " <br><br><br>\n", + " <p style=\"color: #20335d;font-weight: 100; font-size: 18pt;\"> Select two materials in the checkbox on the right for comparison:</p>\n", + " <p style=\"color: #000;font-weight: 1000; font-size: 8pt;\"></p>\n", + " <button class = \"button\" onclick = \"clean_compare_list()\"> Clean selections </button> \n", + " <button class = \"button\" onclick = \"compare();compare()\" title = \"Select 2 materials in the checkbox below and compare: please make sure that the upper/lower limits are the same (using Rescale/Autoscale buttons).\" > Compare</button>\n", + "</div>\n", + "\n", + "\n", + "\n", + "<div id = \"div_showall\" style = \"width: 100%; visibility:hidden\">\n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + " <input type = \"checkbox\" id = \"checkbox_showall\" unchecked onclick=\"show_all(this.id)\"/> <font color=\"black\" size = 3px> Show all results </font><font size = 2px color = \"#666\"> (By default only the first 10 results are shown.) </font> \n", + " <div style = \"width: 100%; height: 30px; \"></div>\n", + "</div>\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "<div id = \"div_compare\" style = \"position: fixed; top: 20%; left: 10%; width: 1200px; height: 600px; z-index: 999999; border: 1px solid #555; background-color: #fff; display: none\" onclick = \"$(this).fadeOut(500)\"> \n", + " \n", + " <div style = \"float: right; width: 80px; height: 25px; margin-top: 10px; margin-right: 10px; z-index: 1000000; border: 1px solid #555; text-align: center; vertical-align: middle; background-color: #f9f9f9; font-size:12pt; font-color: #000; cursor:pointer;\" > CLOSE </div> <!--button to close the div-->\n", + " <div id = \"div_compare_info\" style = \" width: 350px; height: 500px; float: right; margin-top: 50px; margin-right: 10px; z-index: 10000000;\"></div>\n", + " <div id = \"div_compare_container\" style = \"margin-top: 50px; margin-left: 100px; width: 600px; height: 300px;\">\n", + " <div class=\"g-before-after\" id = \"div_compare_containerx\"></div>\n", + " </div>\n", + "</div>\n", + "\n", + "\n", + "<div id = \"demo\"></div>\n", + "\n", + "<div id = \"plot_placeholder\">\n", + " <div><br></div>\n", + " <table id = \"table_visualize\"> </table>\n", + "</div>\n", + "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "tags": [ + "plot_band" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + " //alert(\"tag: plot_band\")\n", + "\n", + "plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + "function plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)\n", + "{\n", + " //i=0;\n", + " //alert(\"plot_band \"+ i)\n", + " var placeholder_band = \"#div_band\" + i.toString();\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var img_band_id = \"img_band\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + " var placeholder_band_compare = \"\";\n", + "\n", + "\n", + " if(i_in_compare_list == 1)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\";\n", + " }\n", + " else if(i_in_compare_list == 2)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_2\";\n", + " }\n", + " else\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\"; // just for safe\n", + " }\n", + "\n", + " Object.size = function(obj) {\n", + " var size = 0, key;\n", + " for (key in obj) \n", + " {\n", + " if (obj.hasOwnProperty(key)) size++;\n", + " }\n", + " return size;\n", + " };\n", + "\n", + " //Get the number of bands\n", + " //alert(\"Getting band\")\n", + " //alert(band_obj_all)\n", + " //alert(\"band_obj_all got!\")\n", + " var N_bands = Object.size(band_obj_all[i][\"band_y_axis\"]);\n", + " var N_k_coors = Object.size(band_obj_all[i][\"band_x_axis\"]);\n", + " //alert(band_obj_all[i][\"band_y_axis\"])\n", + " var band_plotdata = [];\n", + " \n", + " for(var i_band =0; i_band < N_bands; i_band++)\n", + " {\n", + " var tmp_data = [];\n", + " for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)\n", + " {\n", + " tmp_data.push([band_obj_all[i][\"band_x_axis\"][j_k_coor],band_obj_all[i][\"band_y_axis\"][i_band][j_k_coor]]);\n", + " }\n", + " var plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };\n", + " band_plotdata.push(plotData);\n", + " }\n", + "\n", + "\n", + " var tmp_data0 = [[0, 0], [1, 0]];\n", + " var plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};\n", + " band_plotdata.push(plotData0);\n", + "\n", + " var band_plotdata_overview = band_plotdata.slice(0);\n", + "\n", + " var HOMOdata= [[band_obj_all[i][\"HOMO_coor\"],band_obj_all[i][\"HOMO_energy\"]]];\n", + " var HOMOlabel = [\"VBM\"];\n", + " var plotHOMO={ shadowSize:0, color: 'blue', data: HOMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'blue'},lines:{show: false}, showLabels: true, labels: HOMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " var LUMOdata= [[band_obj_all[i][\"LUMO_coor\"],band_obj_all[i][\"LUMO_energy\"]]];\n", + " var LUMOlabel = [\"CBM\"];\n", + " var plotLUMO={ shadowSize:0, color: 'red', data: LUMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'red'},lines:{show: false}, showLabels: true, labels: LUMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " //if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + " if (if_show_VBM == 1)\n", + " {\n", + " band_plotdata.push(plotHOMO);\n", + " band_plotdata.push(plotLUMO);\n", + " }\n", + "\n", + " \n", + " //alert(img_band_id + band_plotdata)\n", + " \n", + " //!!!FIXME: if ($(\"#showVBM:checked\").length > 0 && gap > 0.1) \n", + " //plotHOMOLUMO={ shadowSize:0, color: 'red', data: d5, points:{show:true, radius: 0.8 , fill: true}, showLabels: true, labels: d5label, labelPlacement: labelPos, canvasRender: true, cColor: 'red', cFont:\"1em Arial\" }\n", + "\n", + " var canvas_band;\n", + " var options_band = {\n", + " canvas: true,\n", + " //legend:{ type: \"canvas\" },\n", + " series: { lines: { show: true, lineWidth: 2 }, \n", + " points: { show: false } }, \n", + " xaxis: { \n", + " ticks: band_obj_all[i][\"labels\"], \n", + " color:\"#000\", \n", + " font: {size: 20}, \n", + " zoomRange: false,\n", + " panRange: false \n", + " }, \n", + " yaxis: { \n", + " axisLabel: \"Energy (eV)\", \n", + " axisLabelUseCanvas: true,\n", + " //axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20, family:\"Arial\"},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " zoom: { \n", + " interactive: true\n", + " },\n", + "\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " //selection: { mode: \"xy\", color: \"#86a6b4\" }, \n", + "\n", + " grid: { \n", + " labelMargin: 15,\n", + " hoverable: true, \n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] }, \n", + " borderWidth: {\n", + " top: 2, \n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null } \n", + " }\n", + " }\n", + " //var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);\n", + " //var plot_band = $.plot(\"#div_bandx\", band_plotdata, options_band);\n", + " var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas\n", + " var image_band = plot_band.toDataURL();\n", + " image_band = image_band.replace(\"image/png\",\"image/octet-stream\");\n", + " //beakerx.image_band = image_band;\n", + " document.getElementById(img_band_id).href= image_band;\n", + " image_band_links[i] = image_band;\n", + " //alert(\"band done\")\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + " //alert(\"tag: plot_band\")\n", + "\n", + "plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);\n", + "\n", + "function plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)\n", + "{\n", + " //i=0;\n", + " //alert(\"plot_band \"+ i)\n", + " var placeholder_band = \"#div_band\" + i.toString();\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var img_band_id = \"img_band\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + " var placeholder_band_compare = \"\";\n", + "\n", + "\n", + " if(i_in_compare_list == 1)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\";\n", + " }\n", + " else if(i_in_compare_list == 2)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_2\";\n", + " }\n", + " else\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\"; // just for safe\n", + " }\n", + "\n", + " Object.size = function(obj) {\n", + " var size = 0, key;\n", + " for (key in obj) \n", + " {\n", + " if (obj.hasOwnProperty(key)) size++;\n", + " }\n", + " return size;\n", + " };\n", + "\n", + " //Get the number of bands\n", + " //alert(\"Getting band\")\n", + " //alert(band_obj_all)\n", + " //alert(\"band_obj_all got!\")\n", + " var N_bands = Object.size(band_obj_all[i][\"band_y_axis\"]);\n", + " var N_k_coors = Object.size(band_obj_all[i][\"band_x_axis\"]);\n", + " //alert(band_obj_all[i][\"band_y_axis\"])\n", + " var band_plotdata = [];\n", + " \n", + " for(var i_band =0; i_band < N_bands; i_band++)\n", + " {\n", + " var tmp_data = [];\n", + " for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)\n", + " {\n", + " tmp_data.push([band_obj_all[i][\"band_x_axis\"][j_k_coor],band_obj_all[i][\"band_y_axis\"][i_band][j_k_coor]]);\n", + " }\n", + " var plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };\n", + " band_plotdata.push(plotData);\n", + " }\n", + "\n", + "\n", + " var tmp_data0 = [[0, 0], [1, 0]];\n", + " var plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};\n", + " band_plotdata.push(plotData0);\n", + "\n", + " var band_plotdata_overview = band_plotdata.slice(0);\n", + "\n", + " var HOMOdata= [[band_obj_all[i][\"HOMO_coor\"],band_obj_all[i][\"HOMO_energy\"]]];\n", + " var HOMOlabel = [\"VBM\"];\n", + " var plotHOMO={ shadowSize:0, color: 'blue', data: HOMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'blue'},lines:{show: false}, showLabels: true, labels: HOMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " var LUMOdata= [[band_obj_all[i][\"LUMO_coor\"],band_obj_all[i][\"LUMO_energy\"]]];\n", + " var LUMOlabel = [\"CBM\"];\n", + " var plotLUMO={ shadowSize:0, color: 'red', data: LUMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'red'},lines:{show: false}, showLabels: true, labels: LUMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " //if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + " if (if_show_VBM == 1)\n", + " {\n", + " band_plotdata.push(plotHOMO);\n", + " band_plotdata.push(plotLUMO);\n", + " }\n", + "\n", + " \n", + " //alert(img_band_id + band_plotdata)\n", + " \n", + " //!!!FIXME: if ($(\"#showVBM:checked\").length > 0 && gap > 0.1) \n", + " //plotHOMOLUMO={ shadowSize:0, color: 'red', data: d5, points:{show:true, radius: 0.8 , fill: true}, showLabels: true, labels: d5label, labelPlacement: labelPos, canvasRender: true, cColor: 'red', cFont:\"1em Arial\" }\n", + "\n", + " var canvas_band;\n", + " var options_band = {\n", + " canvas: true,\n", + " //legend:{ type: \"canvas\" },\n", + " series: { lines: { show: true, lineWidth: 2 }, \n", + " points: { show: false } }, \n", + " xaxis: { \n", + " ticks: band_obj_all[i][\"labels\"], \n", + " color:\"#000\", \n", + " font: {size: 20}, \n", + " zoomRange: false,\n", + " panRange: false \n", + " }, \n", + " yaxis: { \n", + " axisLabel: \"Energy (eV)\", \n", + " axisLabelUseCanvas: true,\n", + " //axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20, family:\"Arial\"},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " zoom: { \n", + " interactive: true\n", + " },\n", + "\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " //selection: { mode: \"xy\", color: \"#86a6b4\" }, \n", + "\n", + " grid: { \n", + " labelMargin: 15,\n", + " hoverable: true, \n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] }, \n", + " borderWidth: {\n", + " top: 2, \n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null } \n", + " }\n", + " }\n", + " //var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);\n", + " //var plot_band = $.plot(\"#div_bandx\", band_plotdata, options_band);\n", + " var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas\n", + " var image_band = plot_band.toDataURL();\n", + " image_band = image_band.replace(\"image/png\",\"image/octet-stream\");\n", + " //beakerx.image_band = image_band;\n", + " document.getElementById(img_band_id).href= image_band;\n", + " image_band_links[i] = image_band;\n", + " //alert(\"band done\")\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "tags": [ + "plot_dos" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + " //alert(\"tag: plot_dos \" + i)\n", + " //i=0;\n", + "\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + "//----Plot DOS----------------------\n", + " var dos_plotdata = [];\n", + " //alert(\"dos:\"+dos_obj_all[i])\n", + " var xdos = dos_obj_all[i][\"dos_x_axis\"];\n", + " var ydos = dos_obj_all[i][\"dos_y_axis\"][0];\n", + " var dosLabelPos = Math.max.apply(Math, ydos)/2;\n", + " var d2 = [];\n", + " for (var ii = 0; ii < xdos.length; ii+=1) {\n", + " d2.push([ydos[ii],xdos[ii]]);\n", + " }\n", + " var plotData2={ shadowSize: 0, color: 'black' , data: d2};\n", + " dos_plotdata.push(plotData2);\n", + " //alert(\"dos_plotdata\"+JSON.stringify(dos_plotdata[0]));\n", + " \n", + " function find_xaxis_max_min(data, lowerbound, upperbound)\n", + " {\n", + " //data[xaxis,y] find the max and min value of x axis\n", + " //alert(\"dos[0]:\" + data[0][\"data\"]);\n", + " //alert(\"Bounds: \" + lowerbound + \" , \" + upperbound)\n", + " var n_data = data.length;\n", + " //alert(\"N dos: \" + n_data);\n", + " var data_min = 1000000;\n", + " var data_max = -1000000;\n", + " var data_current = 0;\n", + " for (var i = 0; i < n_data; i++)\n", + " {\n", + " if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))\n", + " {\n", + " data_current = data[i][0];\n", + " //alert(\"data[i]: \" + data[i] + \"data[i][0]: \" + data_current);\n", + " if(data_current >= data_max)\n", + " {\n", + " data_max = data_current;\n", + " }\n", + " if(data_current <= data_min)\n", + " {\n", + " data_min = data_current;\n", + " }\n", + " }\n", + " }\n", + " var data_max_min = [data_max, data_min];\n", + " //alert(\"data_max_min: \" + data_max_min);\n", + " return data_max_min;\n", + " }\n", + " var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0][\"data\"], lowerLim, upperLim);\n", + " var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;\n", + " //alert(\"dos_x_max_min:\"+dos_x_max_min+\", dosLabelPos:\"+dosLabelPos);\n", + " var options_dos ={\n", + " canvas: true,\n", + " series: {\n", + " lines: { show: true, lineWidth:2 },\n", + " points: { show: false }\n", + " },\n", + "\n", + " yaxis: { \n", + " axisLabel: \"\", \n", + " axisLabelUseCanvas: true,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " xaxis: {\n", + " axisLabel: \" \",\n", + " axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial',\n", + " axisLabelPadding: 3,\n", + " color:\"rgb(0, 0, 0)\",\n", + " font: {size: 20, family:\"Arial\"},\n", + " //ticks: 10,\n", + " tickLength:0,\n", + " min: dos_x_max_min[1],//0,\n", + " max: dos_x_max_min[0],//1,\n", + " tickDecimals: 0,\n", + " ticks: [[ dosLabelPos ,'DOS']],\n", + " //tickFormatter: MyFormatter\n", + " panRange: false\n", + " },\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " grid: {\n", + " labelMargin: 15,\n", + " hoverable: true,\n", + " //borderWidth : 1000,\n", + " //show : false,\n", + " // //backgroundColor: { colors: [ \"#fff\", \"#eee\" ] },\n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] },\n", + " borderWidth: {\n", + " top: 2,\n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null\n", + " }\n", + " }\n", + " }\n", + " var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();\n", + " var image_dos = plot_dos.toDataURL();\n", + " image_dos = image_dos.replace(\"image/png\",\"image/octet-stream\");\n", + " image_dos = image_dos;\n", + " document.getElementById(img_dos_id).href= image_dos;\n", + " //alert(\"dos done.\")\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + " //alert(\"tag: plot_dos \" + i)\n", + " //i=0;\n", + "\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + "\n", + "//----Plot DOS----------------------\n", + " var dos_plotdata = [];\n", + " //alert(\"dos:\"+dos_obj_all[i])\n", + " var xdos = dos_obj_all[i][\"dos_x_axis\"];\n", + " var ydos = dos_obj_all[i][\"dos_y_axis\"][0];\n", + " var dosLabelPos = Math.max.apply(Math, ydos)/2;\n", + " var d2 = [];\n", + " for (var ii = 0; ii < xdos.length; ii+=1) {\n", + " d2.push([ydos[ii],xdos[ii]]);\n", + " }\n", + " var plotData2={ shadowSize: 0, color: 'black' , data: d2};\n", + " dos_plotdata.push(plotData2);\n", + " //alert(\"dos_plotdata\"+JSON.stringify(dos_plotdata[0]));\n", + " \n", + " function find_xaxis_max_min(data, lowerbound, upperbound)\n", + " {\n", + " //data[xaxis,y] find the max and min value of x axis\n", + " //alert(\"dos[0]:\" + data[0][\"data\"]);\n", + " //alert(\"Bounds: \" + lowerbound + \" , \" + upperbound)\n", + " var n_data = data.length;\n", + " //alert(\"N dos: \" + n_data);\n", + " var data_min = 1000000;\n", + " var data_max = -1000000;\n", + " var data_current = 0;\n", + " for (var i = 0; i < n_data; i++)\n", + " {\n", + " if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))\n", + " {\n", + " data_current = data[i][0];\n", + " //alert(\"data[i]: \" + data[i] + \"data[i][0]: \" + data_current);\n", + " if(data_current >= data_max)\n", + " {\n", + " data_max = data_current;\n", + " }\n", + " if(data_current <= data_min)\n", + " {\n", + " data_min = data_current;\n", + " }\n", + " }\n", + " }\n", + " var data_max_min = [data_max, data_min];\n", + " //alert(\"data_max_min: \" + data_max_min);\n", + " return data_max_min;\n", + " }\n", + " var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0][\"data\"], lowerLim, upperLim);\n", + " var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;\n", + " //alert(\"dos_x_max_min:\"+dos_x_max_min+\", dosLabelPos:\"+dosLabelPos);\n", + " var options_dos ={\n", + " canvas: true,\n", + " series: {\n", + " lines: { show: true, lineWidth:2 },\n", + " points: { show: false }\n", + " },\n", + "\n", + " yaxis: { \n", + " axisLabel: \"\", \n", + " axisLabelUseCanvas: true,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " xaxis: {\n", + " axisLabel: \" \",\n", + " axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial',\n", + " axisLabelPadding: 3,\n", + " color:\"rgb(0, 0, 0)\",\n", + " font: {size: 20, family:\"Arial\"},\n", + " //ticks: 10,\n", + " tickLength:0,\n", + " min: dos_x_max_min[1],//0,\n", + " max: dos_x_max_min[0],//1,\n", + " tickDecimals: 0,\n", + " ticks: [[ dosLabelPos ,'DOS']],\n", + " //tickFormatter: MyFormatter\n", + " panRange: false\n", + " },\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " grid: {\n", + " labelMargin: 15,\n", + " hoverable: true,\n", + " //borderWidth : 1000,\n", + " //show : false,\n", + " // //backgroundColor: { colors: [ \"#fff\", \"#eee\" ] },\n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] },\n", + " borderWidth: {\n", + " top: 2,\n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null\n", + " }\n", + " }\n", + " }\n", + " var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();\n", + " var image_dos = plot_dos.toDataURL();\n", + " image_dos = image_dos.replace(\"image/png\",\"image/octet-stream\");\n", + " image_dos = image_dos;\n", + " document.getElementById(img_dos_id).href= image_dos;\n", + " //alert(\"dos done.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "tags": [ + "init_jquery" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"http://code.jquery.com/jquery-1.8.3.min.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"http://code.jquery.com/jquery-1.8.3.min.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "tags": [ + "init_flot" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.js\"></script>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "tags": [ + "init_flot_axislabels" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.axislabels.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.axislabels.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "tags": [ + "init_flot_navigate" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.navigate.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.navigate.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "tags": [ + "init_flot_selection" + ] + }, + "outputs": [ + { + "data": { + "text/html": [ + "<script src=\"js/jquery.flot.selection.js\"></script>\n" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%HTML\n", + "<script src=\"js/jquery.flot.selection.js\"></script>" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": { + "tags": [ + "js_query_beforeafter" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "//jquery.beforeafter.min.js\n", + "!function(e){e.fn.beforeafter=function(i){var t=e.extend({touch:!0,message:\"Slide\",hide_message:!0,reset:!0,reset_delay:3e3,drag_horizontal:!0,split_horizontal:!0\n", + "},i);return this.each(function(){var i=e(this),a=i.find(\"img\"),n=a.data(\"aftersrc\"),s=i.width(),d=0;a.after('<div class=\"g-img-after\"><img style=\"width: '+s+'px;\" src=\"'+n+'\"></div>'),\n", + "a.addClass(\"g-img-before\").width(s),i.append('<div class=\"g-img-divider\"><span>'+t.message+\"</span></div>\"),d=i.height(),t.split_horizontal||i.addClass(\"g-vertical\"),\n", + "i.on(\"mouseenter touchstart\",function(e){var t=i.data(\"reset-timer\");t&&(window.clearTimeout(t),i.data(\"reset-timer\",!1))}).on(\"mousemove touchmove\",function(a){\n", + "var n=0,o=0,r=i.find(\".g-img-divider span\");if(t.drag_horizontal)n=a.pageX-i.offset().left,o=n/s*100;else{var f=i.offset().top-e(window).scrollTop();n=a.clientY/f,\n", + "o=(a.clientY-f)/d*100}if(t.touch&&\"undefined\"!=typeof a.originalEvent.touches){var g=a.originalEvent.touches[0];o=t.drag_horizontal?(g.pageX-i.offset().left)/s*100:(g.pageY-i.offset().top)/d*100;\n", + "}t.split_horizontal?(i.find(\".g-img-after\").css(\"left\",o+\"%\"),i.find(\".g-img-divider\").css(\"left\",o+\"%\")):(i.find(\".g-img-after\").css(\"top\",o+\"%\"),i.find(\".g-img-divider\").css(\"top\",o+\"%\")),\n", + "t.hide_message&&r.is(\":visible\")&&r.fadeOut()}).on(\"mouseleave touchend touchcancel\",function(e){var a=i.data(\"reset-timer\"),n=i.find(\".g-img-divider span\");\n", + "t.reset&&(a||(a=window.setTimeout(function(){t.split_horizontal?(i.find(\".g-img-after\").animate({left:\"50%\"},500),i.find(\".g-img-divider\").animate({left:\"50%\"\n", + "},500,function(){n.fadeIn()})):(i.find(\".g-img-after\").animate({top:\"50%\"},500),i.find(\".g-img-divider\").animate({top:\"50%\"},500,function(){n.fadeIn()})),\n", + "i.data(\"reset-timer\",!1)},t.reset_delay),i.data(\"reset-timer\",a)))})}),this}}(jQuery);\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + "//jquery.beforeafter.min.js\n", + "!function(e){e.fn.beforeafter=function(i){var t=e.extend({touch:!0,message:\"Slide\",hide_message:!0,reset:!0,reset_delay:3e3,drag_horizontal:!0,split_horizontal:!0\n", + "},i);return this.each(function(){var i=e(this),a=i.find(\"img\"),n=a.data(\"aftersrc\"),s=i.width(),d=0;a.after('<div class=\"g-img-after\"><img style=\"width: '+s+'px;\" src=\"'+n+'\"></div>'),\n", + "a.addClass(\"g-img-before\").width(s),i.append('<div class=\"g-img-divider\"><span>'+t.message+\"</span></div>\"),d=i.height(),t.split_horizontal||i.addClass(\"g-vertical\"),\n", + "i.on(\"mouseenter touchstart\",function(e){var t=i.data(\"reset-timer\");t&&(window.clearTimeout(t),i.data(\"reset-timer\",!1))}).on(\"mousemove touchmove\",function(a){\n", + "var n=0,o=0,r=i.find(\".g-img-divider span\");if(t.drag_horizontal)n=a.pageX-i.offset().left,o=n/s*100;else{var f=i.offset().top-e(window).scrollTop();n=a.clientY/f,\n", + "o=(a.clientY-f)/d*100}if(t.touch&&\"undefined\"!=typeof a.originalEvent.touches){var g=a.originalEvent.touches[0];o=t.drag_horizontal?(g.pageX-i.offset().left)/s*100:(g.pageY-i.offset().top)/d*100;\n", + "}t.split_horizontal?(i.find(\".g-img-after\").css(\"left\",o+\"%\"),i.find(\".g-img-divider\").css(\"left\",o+\"%\")):(i.find(\".g-img-after\").css(\"top\",o+\"%\"),i.find(\".g-img-divider\").css(\"top\",o+\"%\")),\n", + "t.hide_message&&r.is(\":visible\")&&r.fadeOut()}).on(\"mouseleave touchend touchcancel\",function(e){var a=i.data(\"reset-timer\"),n=i.find(\".g-img-divider span\");\n", + "t.reset&&(a||(a=window.setTimeout(function(){t.split_horizontal?(i.find(\".g-img-after\").animate({left:\"50%\"},500),i.find(\".g-img-divider\").animate({left:\"50%\"\n", + "},500,function(){n.fadeIn()})):(i.find(\".g-img-after\").animate({top:\"50%\"},500),i.find(\".g-img-divider\").animate({top:\"50%\"},500,function(){n.fadeIn()})),\n", + "i.data(\"reset-timer\",!1)},t.reset_delay),i.data(\"reset-timer\",a)))})}),this}}(jQuery);" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": { + "tags": [ + "js_compare_slide" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "var div_str = '';\n", + "//div_str = '<style> .g-before-after{position:relative;overflow:hidden}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%} </style>'\n", + "//div_str += '<script>$(\\'#div_compare_containerx\\').beforeafter(); </script>';\n", + "//div_str +='<script type=\\\"text/javascript\\\" src=\\\"https://github.com/jquery/jquery/blob/master/src/jquery.js\\\"></script> '\n", + "//div_str += '<div class=\\\"g-before-after\\\" id=\\\"div_compare_containerx\\\">';\n", + "div_str +='<img src = \\\"'\n", + "\n", + "var src1 = image_band_links_selected[0];\n", + "var src2 = image_band_links_selected[1];\n", + "var tmp_src1 = src1;\n", + "var tmp_src2 = src2;\n", + "//src1 = \"https://images4.alphacoders.com/640/640956.jpg\";\n", + "//src2 = \"http://imgmr.com/wp-content/uploads/2016/06/SAO-anime.jpg\";\n", + "div_str +=src1;\n", + "div_str += '\\\" data-aftersrc=\\\"'\n", + "div_str +=src2;\n", + "//div_str += '\\\"></div>';\n", + "div_str += '\\\"/>';\n", + "//#div_compare_containerx\n", + "document.getElementById(\"div_compare_containerx\").innerHTML = div_str;\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "//beakerx.image_band_links[i]\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + "var div_str = '';\n", + "//div_str = '<style> .g-before-after{position:relative;overflow:hidden}.g-before-after img{display:block}.g-before-after .g-img-before{float:left}.g-before-after .g-img-after,.g-before-after.g-vertical .g-img-after{position:absolute;top:0;right:0;left:50%;bottom:0;overflow:hidden}.g-before-after .g-img-after img{position:absolute;right:0;top:0}.g-before-after .g-img-divider{position:absolute;left:50%;top:0;bottom:0;width:0;border-left:1px solid #fff;border-right:1px solid #fff}.g-before-after .g-img-divider>span{position:absolute;top:50%;display:block;background-color:#fff;padding:5px 10px;line-height:1;text-align:center;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.g-before-after.g-vertical .g-img-after{top:50%;left:0}.g-before-after.g-vertical .g-img-after img{position:absolute;right:auto;top:auto;left:0;bottom:0}.g-before-after.g-vertical .g-img-divider{position:absolute;left:0;top:50%;bottom:auto;right:0;height:0;width:100%;border-top:1px solid #fff;border-bottom:1px solid #fff;border-left:0 none;border-right:0 none}.g-before-after.g-vertical .g-img-divider>span{top:50%;left:50%} </style>'\n", + "//div_str += '<script>$(\\'#div_compare_containerx\\').beforeafter(); </script>';\n", + "//div_str +='<script type=\\\"text/javascript\\\" src=\\\"https://github.com/jquery/jquery/blob/master/src/jquery.js\\\"></script> '\n", + "//div_str += '<div class=\\\"g-before-after\\\" id=\\\"div_compare_containerx\\\">';\n", + "div_str +='<img src = \\\"'\n", + "\n", + "var src1 = image_band_links_selected[0];\n", + "var src2 = image_band_links_selected[1];\n", + "var tmp_src1 = src1;\n", + "var tmp_src2 = src2;\n", + "//src1 = \"https://images4.alphacoders.com/640/640956.jpg\";\n", + "//src2 = \"http://imgmr.com/wp-content/uploads/2016/06/SAO-anime.jpg\";\n", + "div_str +=src1;\n", + "div_str += '\\\" data-aftersrc=\\\"'\n", + "div_str +=src2;\n", + "//div_str += '\\\"></div>';\n", + "div_str += '\\\"/>';\n", + "//#div_compare_containerx\n", + "document.getElementById(\"div_compare_containerx\").innerHTML = div_str;\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});\n", + "//beakerx.image_band_links[i]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "tags": [ + "process_band_dos_data_python" + ] + }, + "outputs": [], + "source": [ + "#tag:python_2\n", + "import urllib.request, json\n", + "import numpy as np\n", + "import math\n", + "\n", + "#======Define global objs============\n", + "info_all = []\n", + "band_obj_all = []\n", + "dos_obj_all = []\n", + "\n", + "def load_jsonfile(path):\n", + " #with open(path, encoding='utf-8') as band_file: \n", + " # return json.load(band_file)\n", + "\n", + " \n", + " with urllib.request.urlopen(path) as url:\n", + " data = json.loads(url.read().decode())\n", + " return data\n", + "\n", + "#-----Get the labels for x axis---------------\n", + "def get_label_flag(coor_array):\n", + " #np.sort(coor_array)\n", + " x = coor_array[0]\n", + " y = coor_array[1]\n", + " z = coor_array[2]\n", + " coor =np.sort([x,y,z])\n", + " xx = coor[0]\n", + " yy = coor[1]\n", + " zz = coor[2]\n", + " coor = [xx, yy, zz]\n", + " #pprint(coor)\n", + " if (coor == [0, 0.5, 0.5]):\n", + " return \"X\"\n", + " if (coor == [0, 0.0, 0.5]):\n", + " return \"M\"\n", + " elif (coor == [0.5, 0.5, 0.5]):\n", + " return \"L\"\n", + " elif (coor == [0.375, 0.375, 0.75]):\n", + " return \"K\"\n", + " elif (coor == [0.25, 0.5, 0.75]):\n", + " return \"W\"\n", + " elif (coor == [0, 0, 0]):\n", + " return \"\\u0393\"\n", + " elif (coor == [0.25, 0.625, 0.625]):\n", + " return \"U\"\n", + " else:\n", + " return \"?\"\n", + "\n", + "#============Process the band structure data============\n", + "def get_band_obj(band_path, dos_fermi_energy):\n", + "\n", + " #band_data: read from json file \n", + " #Load the data files for band\n", + " band_data = load_jsonfile(band_path)\n", + " \n", + " #---------Read section_k_band_segment------------\n", + " section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']\n", + " \n", + " #--------Get the number of k band segments-------------\n", + " N_k_band_segments = len(section_k_band_segment)\n", + " \n", + " #----------Get the total number of k points in all segments---------\n", + " N_k_points_all = 0\n", + " for i in range(N_k_band_segments):\n", + " band_k_points = section_k_band_segment[i]['band_k_points']\n", + " N_k_points_all = N_k_points_all + len(band_k_points)\n", + " \n", + " #--------Get the x axis for the band structure figure: the coordinates of k points in 1D\n", + " # store in k_coor_1D[N_k_points_total]-----------------\n", + "\n", + " band_distance_segments = np.zeros(N_k_band_segments)\n", + " for i in range(N_k_band_segments):\n", + " [[x1, y1, z1],[x2, y2, z2]]= section_k_band_segment[i]['band_segm_start_end'] #\"band_segm_start_end\": [[0.5, 0.0, 0.5],[0.5, 0.25, 0.75]],\n", + " band_distance_segments[i] = math.pow((x1-x2), 2) + math.pow((y1-y2), 2) + math.pow((z1-z2), 2)\n", + "\n", + " \n", + " band_distance_total = math.fsum(band_distance_segments)\n", + " #print(band_distance_segments)\n", + " average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total\n", + " \n", + " #Prepare the parameters to rescale the k coordinates into [0,1]\n", + " step_k_point = 1.0 / N_k_points_all\n", + " step_k_point = (1.0 + step_k_point) / N_k_points_all\n", + " \n", + " # \n", + " k_coor_1D = np.zeros((N_k_points_all))\n", + " for i_k_points in range(N_k_points_all):\n", + " k_coor_1D[i_k_points] = round( step_k_point * i_k_points, 3)\n", + " #for i in range(N_k_band_segments):\n", + " # ki[i] = \n", + " \n", + "\n", + " #--------Get the eigenvalues of each band trajectory--------------\n", + " N_k_points_per_segment = len(section_k_band_segment[0]['band_energies'][0]) #suppose the numebr of k points in all the segments are the same\n", + " N_bands = len(section_k_band_segment[0]['band_energies'][0][0])\n", + " band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues\n", + " N_k_points_all = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " band_energies = section_k_band_segment[i_segments]['band_energies']\n", + " N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized\n", + " N_k_points_per_segment = len(band_energies[0])\n", + " for i_k_points in range(N_k_points_per_segment):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))\n", + " N_k_points_all = N_k_points_all + 1\n", + " \n", + " \n", + " N_labels = 0\n", + " for i_segments in range(N_k_band_segments):\n", + " for j in range(2):\n", + " labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];\n", + " N_labels = N_labels + 1\n", + "\n", + " label_flag = [\"\" for i in range(N_labels)] #stores the flags of the labels (X, W, G, etc)\n", + "\n", + " i_label = 0\n", + " label_flag_last_final = \"\"\n", + " label_flag_current_initial = \"\"\n", + " for i_segments in range(N_k_band_segments):\n", + " labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0];\n", + " labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1];\n", + " np.sort(labels_coor_0)\n", + " np.sort(labels_coor_1)\n", + " label_flag_0 = get_label_flag(labels_coor_0)\n", + " label_flag_1 = get_label_flag(labels_coor_1)\n", + " label_flag_current_initial = label_flag_0\n", + " if(label_flag_last_final == \"\"):\n", + " label_flag_last_final = label_flag_0\n", + "\n", + " if(label_flag_last_final == label_flag_current_initial):\n", + " label_flag[i_label] = label_flag_current_initial\n", + " else:\n", + " label_flag[i_label] = \"\".join([label_flag_last_final, '|', label_flag_current_initial])\n", + " label_flag_last_final = label_flag_1\n", + " \n", + "\n", + " i_label = i_label + 1\n", + " if(i_segments == N_k_band_segments - 1):\n", + " label_flag[i_label] = label_flag_1\n", + " i_label = i_label + 1\n", + "\n", + " N_labels = i_label\n", + " \n", + " #------------Get the coordinates for the labels------------\n", + " #label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels\n", + " label_coor_relative = np.zeros((N_labels))\n", + " for i_label in range(N_labels):\n", + " #Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates\n", + " #x = labels_coor_0[0]\n", + " #y = labels_coor_0[1]\n", + " #z = labels_coor_0[2]\n", + " #label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)\n", + " label_coor_relative[i_label] = step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all);\n", + "\n", + " #----Store the label-----------\n", + " label_obj =[['' for i in range(2)] for j in range(N_labels)]\n", + " for i_label in range(N_labels):\n", + " label_obj[i_label][0] = label_coor_relative[i_label]\n", + " label_obj[i_label][1] = label_flag[i_label]\n", + " \n", + " #print(label_obj)\n", + " \n", + " \n", + " #Rescal the energies with respect to dos_fermi_energy\n", + " for i_k_points in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " band_energies_all[i_bands][i_k_points] = band_energies_all[i_bands][i_k_points] - dos_fermi_energy\n", + "\n", + " #-------Get VBM, CBM----------------\n", + "\n", + " HOMO = -1000\n", + " LUMO = 1000\n", + " coor_k_point_HOMO = np.zeros((3)) #the coordinate of k point that stores HOMO\n", + " coor_k_point_LUMO = np.zeros((3)) #the coordinate of k point that stores LUMO\n", + " #band_gap_direct = 0.0\n", + " band_gap_indirect = 0.0\n", + " \n", + " \n", + " #band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " #band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))\n", + " band_energy_max = 10\n", + " band_energy_min = -10\n", + " #N_band_energy_index = 10000\n", + " #band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " #N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " #i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level\n", + "\n", + " for i_k_points_all in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " #i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)\n", + " #N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1\n", + " band_energy = band_energies_all[i_bands][i_k_points_all]\n", + " if(band_energy > 0):\n", + " if(band_energy < LUMO):\n", + " LUMO = band_energy\n", + " else:\n", + " if(band_energy > HOMO):\n", + " HOMO = band_energy\n", + " #for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO\n", + " # if(N_allowed_states[i_band_index] > 0):\n", + " # LUMO = band_energy_min + band_energy_step * i_band_index\n", + " print('HOMO, LUMO: ',HOMO, LUMO)\n", + " band_gap_indirect = abs(LUMO - HOMO)\n", + " \n", + " if(band_gap_indirect < 0.5): #VBM and CBM has to be found in another way for metals/charged system:\n", + " HOMO = -1000\n", + " LUMO = 1000\n", + " band_energy_max = 10\n", + " band_energy_min = 0\n", + " N_band_energy_index = 10000\n", + " band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index\n", + " N_allowed_states = np.zeros(N_band_energy_index + 1)\n", + " \n", + " #get the DOS and store in N_allowed_states[]\n", + " for i_k_points_all in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " band_energy = band_energies_all[i_bands][i_k_points_all]\n", + " if(band_energy_min < band_energy < band_energy_max):\n", + " i_band_index = math.floor((band_energy - band_energy_min) / band_energy_step)\n", + " N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1\n", + " if_gapped = 0\n", + " for i_band_index in range(N_band_energy_index): #go through the energy levels from the bottom\n", + " band_energy = band_energy_min + band_energy_step * i_band_index\n", + " if(N_allowed_states[i_band_index] == 0):\n", + " if_gapped = if_gapped + 1\n", + " if(band_energy > band_energy_max - 0.5) and (if_gapped == 0):\n", + " print(\"No gap found in this system. It seems to be a metal.\")\n", + " HOMO = 1000\n", + " LUMO = 1000\n", + " break\n", + " #print(\"At \", band_energy,\": # allowed states = \", N_allowed_states[i_band_index],\" if_gapped = \", if_gapped)\n", + " \n", + " if(N_allowed_states[i_band_index] > 0):\n", + " if(if_gapped * band_energy_step> 0.3 ): #above VBM-CBM gap: LUMO\n", + " if(band_energy < LUMO):\n", + " #print(\"LUMO got!\")\n", + " LUMO = band_energy\n", + " break #break before touching another gap that is above the band gap\n", + " if(if_gapped * band_energy_step < 0.3): #below VBM-CBM gap: HOMO\n", + " if(band_energy > HOMO):\n", + " #print(\"HOMO got!\")\n", + " HOMO = band_energy\n", + " \n", + " if_gapped = 0\n", + " \n", + " print('HOMO, LUMO for metal/charged system: ',HOMO, LUMO)\n", + " \n", + " '''\n", + "\n", + "# print('HOMO: ',tmp_HOMO_max)\n", + " HOMO_global = tmp_HOMO_max\n", + " LUMO_global = tmp_LUMO_min\n", + " band_gap_indirect = LUMO_global - HOMO_global\n", + " E_top_valence = HOMO_global\n", + " if(band_gap_indirect < 0):\n", + " band_gap_indirect = 0\n", + "\n", + " #Rescal HOMO and LUMO with respect to HOMO\n", + " HOMO_global = round((HOMO_global - E_top_valence), 3)\n", + " LUMO_global = round((LUMO_global - E_top_valence), 3)\n", + " '''\n", + " \n", + " \n", + " \n", + " #Find the position of HOMO, LUMO\n", + "\n", + " for i_k_points in range(N_k_points_all):\n", + " for i_bands in range(N_bands):\n", + " if(abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001):\n", + " coor_k_point_HOMO = k_coor_1D[i_k_points]\n", + " if(abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001):\n", + " coor_k_point_LUMO = k_coor_1D[i_k_points] \n", + "\n", + "\n", + " \n", + " \n", + " #Store the band data to band_obj\n", + "\n", + " band_obj = {}\n", + " band_obj[\"band_x_axis\"] = np.array(k_coor_1D).tolist()\n", + " band_obj[\"band_y_axis\"] = np.array(band_energies_all).tolist()\n", + " band_obj[\"labels\"] = np.array(label_obj).tolist()\n", + " band_obj[\"HOMO_energy\"] = np.array(HOMO).tolist()\n", + " band_obj[\"HOMO_coor\"] = np.array(coor_k_point_HOMO).tolist()\n", + " band_obj[\"LUMO_energy\"] = np.array(LUMO).tolist()\n", + " band_obj[\"LUMO_coor\"] = np.array(coor_k_point_LUMO).tolist()\n", + " band_obj[\"average_N_k_points_per_inverse_distance\"] = np.array(average_N_k_points_per_inverse_distance).tolist()\n", + " \n", + "\n", + " \n", + " return band_obj\n", + "\n", + "\n", + "#===============Get the space group information===========\n", + "def get_space_group(band_data):\n", + " import pymatgen as mg\n", + " from pymatgen.symmetry.analyzer import SpacegroupAnalyzer\n", + "\n", + " simulation_cell = np.array(band_data[\"section_run\"][\"section_system\"][0].get('simulation_cell',\"empty\")) * 10000000000\n", + " atom_positions = np.array(band_data[\"section_run\"][\"section_system\"][0].get('atom_positions',\"empty\")) * 10000000000\n", + " atom_labels = np.array(band_data[\"section_run\"][\"section_system\"][0].get('atom_labels',\"empty\"))\n", + " structure = mg.Structure(simulation_cell,atom_labels, atom_positions, coords_are_cartesian = True)\n", + " \n", + " finder = SpacegroupAnalyzer(structure, symprec=1e-3, angle_tolerance=5)\n", + " space_group_symbol = finder.get_space_group_symbol()\n", + " lattice_constant = []\n", + " for item in structure.lattice.abc:\n", + " lattice_constant.append(item)\n", + " for i in range(len(lattice_constant)):\n", + " item = str(round(lattice_constant[i], 3))\n", + " lattice_constant[i] = item\n", + " \n", + " return [space_group_symbol, lattice_constant]\n", + "\n", + "#================Get the DOS data==============================\n", + "def get_dos_obj(dos_path):\n", + " #dos_data: read from json file \n", + " #Load the data files for dos\n", + " dos_data = load_jsonfile(dos_path)\n", + "\n", + " print(dos_path)\n", + " #N_dos_values = len(dos_data['sections']['section_run-0']['sections']['section_single_configuration_calculation-0']['section_dos'][0]['dos_energies'])\n", + " N_dos_values = len(dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'])\n", + " #in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]\n", + "\n", + " dos_energies = np.zeros((N_dos_values))\n", + " dos_energies_tmp = np.zeros((N_dos_values)) #tmp array for unit convertion\n", + " dos_values = np.zeros((N_dos_values))\n", + "\n", + " dos_energies_tmp = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies']\n", + " dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_values'][0]\n", + " \n", + "\n", + " dos_fermi_energy= dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0].get('dos_fermi_energy',\"empty\")\n", + " if(dos_fermi_energy == \"empty\"): #dos_fermi_energy is not available in EXCITING\n", + " dos_fermi_energy_exciting = dos_data['section_run']['section_single_configuration_calculation'].get('x_exciting_dos_fermi',\"empty\")\n", + " if(dos_fermi_energy_exciting == \"empty\"):\n", + " dos_fermi_energy = 0\n", + " else:\n", + " dos_fermi_energy = dos_fermi_energy_exciting / (1.60217656535 * pow(10,-19))\n", + " else:\n", + " dos_fermi_energy = dos_fermi_energy / (1.60217656535 * pow(10,-19))\n", + " print(\"dos_fermi_energy:\", dos_fermi_energy)\n", + " \n", + " for i_dos_values in range(N_dos_values):\n", + " dos_energies[i_dos_values] = 0.0\n", + " dos_energies[i_dos_values] = dos_energies_tmp[i_dos_values] / (1.60217656535 * pow(10,-19))\n", + " dos_energies[i_dos_values] = round((dos_energies[i_dos_values] - dos_fermi_energy), 3) #reference with the fermi level\n", + "\n", + " dos_obj = {}\n", + " dos_obj[\"dos_x_axis\"] = np.array(dos_energies).tolist()\n", + " dos_obj[\"dos_y_axis\"] = np.array(dos_values).tolist()\n", + " dos_obj[\"dos_fermi_energy\"] = np.array(dos_fermi_energy).tolist()\n", + "\n", + " return dos_obj\n", + "\n", + "\n", + "def get_info_obj(band_path):\n", + "\n", + " #band_data: read from json file \n", + " #Load the data files for band\n", + " band_data = load_jsonfile(band_path)\n", + " info_obj = {}\n", + " #---------Read the information of the calculation--------\n", + " info_obj[\"program_name\"] = band_data[\"section_run\"][\"program_name\"];\n", + " info_obj[\"program_basis_set_type\"] = band_data[\"section_run\"][\"program_basis_set_type\"];\n", + " info_obj[\"atom_labels\"] = band_data[\"section_run\"][\"section_system\"][0][\"atom_labels\"];\n", + " info_obj[\"XC_functional_name\"] = band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][0][\"XC_functional_name\"] + \" + \"+ band_data[\"section_run\"][\"section_method\"][\"section_XC_functionals\"][1][\"XC_functional_name\"];\n", + " \n", + " #----------Get the space group information----------\n", + " \n", + " [space_group_symbol, lattice_constant] = get_space_group(band_data)\n", + " info_obj[\"space_group_symbol\"] = np.array(space_group_symbol).tolist()\n", + " info_obj[\"lattice_constant\"] = np.array(lattice_constant).tolist()\n", + " print(\"space group:\", info_obj[\"space_group_symbol\"])\n", + " print(\"lattice_constant:\", lattice_constant)\n", + " \n", + " return info_obj\n", + "\n", + "\n", + "#============main===========================================\n", + "\n", + "#import matplotlib.pyplot as plt\n", + "band_obj_all = []\n", + "dos_obj_all = []\n", + "info_obj_all = []\n", + "print(\"Number of materials: \", N_materials)\n", + "\n", + "for i in range (N_materials):\n", + " print(\"Material: \", i)\n", + " band_path = band_paths[i]\n", + " dos_path = dos_paths[i]\n", + " \n", + " \n", + " dos_obj = get_dos_obj(dos_path)\n", + " dos_fermi_energy = dos_obj[\"dos_fermi_energy\"]\n", + " band_obj = get_band_obj(band_path, dos_fermi_energy)\n", + " info_obj = get_info_obj(band_path)\n", + " \n", + " band_obj_all.append(band_obj)\n", + " dos_obj_all.append(dos_obj)\n", + " info_obj_all.append(info_obj)\n", + " \n", + " \n", + " print(\"average_N_k_points_per_inverse_distance: \", band_obj[\"average_N_k_points_per_inverse_distance\"])\n", + "\n", + "print(\"Finish processing data.\")\n", + "\n", + "#run_cell_by_tag('save_data_to_js')\n", + "\n", + "print(\"Initialization of visulization finished.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 331, + "metadata": { + "tags": [ + "js_plot" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + " \n", + "var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + " \n", + "var N_max_show = 10; //Number of results to be shown by default\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%javascript\n", + "// BACKUP!\n", + "/*\n", + "//Main plot function for given material:\n", + " function plot_band_dos_i_backup(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)\n", + " {\n", + " //alert(\"plot_band_dos_i\")\n", + " //i=0;\n", + " lowerLim = -10\n", + " upperLim = 10\n", + " if_show_VBM = 0\n", + " if_compare = 0\n", + " i_in_compare_list = -1\n", + " //i=0;\n", + " var placeholder_band = \"#div_band\" + i.toString();\n", + " var placeholder_dos = \"#div_dos\" + i.toString();\n", + " var placeholder_tools = \"#div_tools\" + i.toString();\n", + " var placeholder_overview = \"#div_overview\" + i.toString();\n", + " var placeholder_overviewlegend = \"#overviewLegend\" + i.toString();\n", + " var checkbox_VBM_id = \"checkbox_VBM\" + i.toString();\n", + " var img_band_id = \"img_band\" + i.toString();\n", + " var img_dos_id = \"img_dos\" + i.toString();\n", + " var placeholder_band_compare = \"\";\n", + "\n", + " if(i_in_compare_list == 1)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\";\n", + " }\n", + " else if(i_in_compare_list == 2)\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_2\";\n", + " }\n", + " else\n", + " {\n", + " placeholder_band_compare = \"#div_band_compare_1\"; // just for safe\n", + " }\n", + "\n", + " Object.size = function(obj) {\n", + " var size = 0, key;\n", + " for (key in obj) \n", + " {\n", + " if (obj.hasOwnProperty(key)) size++;\n", + " }\n", + " return size;\n", + " };\n", + "\n", + " //Get the number of bands\n", + " //alert(\"Getting band\")\n", + " //alert(band_obj_all)\n", + " //alert(\"band_obj_all got!\")\n", + " var N_bands = Object.size(band_obj_all[i][\"band_y_axis\"]);\n", + " var N_k_coors = Object.size(band_obj_all[i][\"band_x_axis\"]);\n", + " alert(band_obj_all[i][\"band_y_axis\"])\n", + " band_plotdata = [];\n", + "\n", + " for(var i_band =0; i_band < N_bands; i_band++)\n", + " {\n", + " var tmp_data = [];\n", + " for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)\n", + " {\n", + " tmp_data.push([band_obj_all[i][\"band_x_axis\"][j_k_coor],band_obj_all[i][\"band_y_axis\"][i_band][j_k_coor]]);\n", + " }\n", + " plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };\n", + " band_plotdata.push(plotData);\n", + " }\n", + "\n", + "\n", + " var tmp_data0 = [[0, 0], [1, 0]];\n", + " plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};\n", + " band_plotdata.push(plotData0);\n", + "\n", + " band_plotdata_overview = band_plotdata.slice(0);\n", + "\n", + " var HOMOdata= [[band_obj_all[i][\"HOMO_coor\"],band_obj_all[i][\"HOMO_energy\"]]];\n", + " HOMOlabel = [\"VBM\"];\n", + " plotHOMO={ shadowSize:0, color: 'blue', data: HOMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'blue'},lines:{show: false}, showLabels: true, labels: HOMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " var LUMOdata= [[band_obj_all[i][\"LUMO_coor\"],band_obj_all[i][\"LUMO_energy\"]]];\n", + " LUMOlabel = [\"CBM\"];\n", + " plotLUMO={ shadowSize:0, color: 'red', data: LUMOdata, points:{show:true, radius: 4 , fill: true, fillColor: 'red'},lines:{show: false}, showLabels: true, labels: LUMOlabel, canvasRender: true, cColor: 'red', cFont:\"2em Arial\"};\n", + "\n", + " //if_show_VBM = check_show_VBM(checkbox_VBM_id);\n", + " if (if_show_VBM == 1)\n", + " {\n", + " band_plotdata.push(plotHOMO);\n", + " band_plotdata.push(plotLUMO);\n", + " }\n", + "\n", + " \n", + " alert(img_band_id + band_plotdata)\n", + " \n", + " //!!!FIXME: if ($(\"#showVBM:checked\").length > 0 && gap > 0.1) \n", + " //plotHOMOLUMO={ shadowSize:0, color: 'red', data: d5, points:{show:true, radius: 0.8 , fill: true}, showLabels: true, labels: d5label, labelPlacement: labelPos, canvasRender: true, cColor: 'red', cFont:\"1em Arial\" }\n", + "\n", + " var canvas_band;\n", + " var options_band = {\n", + " canvas: true,\n", + " //legend:{ type: \"canvas\" },\n", + " series: { lines: { show: true, lineWidth: 2 }, \n", + " points: { show: false } }, \n", + " xaxis: { \n", + " ticks: band_obj_all[i][\"labels\"], \n", + " color:\"#000\", \n", + " font: {size: 20}, \n", + " zoomRange: false,\n", + " panRange: false \n", + " }, \n", + " yaxis: { \n", + " axisLabel: \"Energy (eV)\", \n", + " axisLabelUseCanvas: true,\n", + " //axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20, family:\"Arial\"},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " zoom: { \n", + " interactive: true\n", + " },\n", + "\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " //selection: { mode: \"xy\", color: \"#86a6b4\" }, \n", + "\n", + " grid: { \n", + " labelMargin: 15,\n", + " hoverable: true, \n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] }, \n", + " borderWidth: {\n", + " top: 2, \n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null } \n", + " }\n", + " }\n", + " //var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);\n", + " //var plot_band = $.plot(\"#div_bandx\", band_plotdata, options_band);\n", + " var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas\n", + " image_band = plot_band.toDataURL();\n", + " image_band = image_band.replace(\"image/png\",\"image/octet-stream\");\n", + " //beakerx.image_band = image_band;\n", + " document.getElementById(img_band_id).href= image_band;\n", + " image_band_links[i] = image_band;\n", + " alert(\"band plot done.\")\n", + "\n", + "\n", + " //----Plot DOS----------------------\n", + " var dos_plotdata = [];\n", + " alert(\"dos:\"+dos_obj_all[i])\n", + " var xdos = dos_obj_all[i][\"dos_x_axis\"];\n", + " var ydos = dos_obj_all[i][\"dos_y_axis\"];\n", + " var dosLabelPos = Math.max.apply(Math, ydos)/2;\n", + " var d2 = [];\n", + " for (var ii = 0; ii < xdos.length; ii+=1) {\n", + " d2.push([ydos[ii],xdos[ii]]);\n", + " }\n", + " var plotData2={ shadowSize: 0, color: 'black' , data: d2}\n", + " dos_plotdata.push(plotData2)\n", + "\n", + " function find_xaxis_max_min(data, lowerbound, upperbound)\n", + " {\n", + " //data[xaxis,y] find the max and min value of x axis\n", + " //alert(\"dos[0]:\" + data[0][\"data\"]);\n", + " //alert(\"Bounds: \" + lowerbound + \" , \" + upperbound)\n", + " var n_data = data.length;\n", + " //alert(\"N dos: \" + n_data);\n", + " var data_min = 1000000;\n", + " var data_max = -1000000;\n", + " var data_current = 0;\n", + " for (var i = 0; i < n_data; i++)\n", + " {\n", + " if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))\n", + " {\n", + " data_current = data[i][0];\n", + " //alert(\"data[i]: \" + data[i] + \"data[i][0]: \" + data_current);\n", + " if(data_current >= data_max)\n", + " {\n", + " data_max = data_current;\n", + " }\n", + " if(data_current <= data_min)\n", + " {\n", + " data_min = data_current;\n", + " }\n", + " }\n", + " }\n", + " var data_max_min = [data_max, data_min];\n", + " //alert(\"data_max_min: \" + data_max_min);\n", + " return data_max_min;\n", + " }\n", + " var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0][\"data\"], lowerLim, upperLim);\n", + " var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;\n", + "\n", + " var options_dos ={\n", + " canvas: true,\n", + " series: {\n", + " lines: { show: true, lineWidth:2 },\n", + " points: { show: false }\n", + " },\n", + "\n", + " yaxis: { \n", + " axisLabel: \"\", \n", + " axisLabelUseCanvas: true,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial', \n", + " axisLabelPadding: 10, \n", + " color:\"#000\", \n", + " font: {size: 20},\n", + " tickLength:-5, \n", + " min: lowerLim, \n", + " max: upperLim,\n", + " tickDecimals: 0, \n", + " zoomRange: [0.001, 1000],\n", + " panRange: [-100, 100] \n", + " },\n", + "\n", + " xaxis: {\n", + " axisLabel: \" \",\n", + " axisLabelUseCanvas: false,\n", + " axisLabelFontSizePixels: 20,\n", + " axisLabelFontFamily: 'Arial',\n", + " axisLabelPadding: 3,\n", + " color:\"rgb(0, 0, 0)\",\n", + " font: {size: 20, family:\"Arial\"},\n", + " //ticks: 10,\n", + " tickLength:0,\n", + " min: dos_x_max_min[1],//0,\n", + " max: dos_x_max_min[0],//1,\n", + " tickDecimals: 0,\n", + " ticks: [[ dosLabelPos ,'DOS']],\n", + " //tickFormatter: MyFormatter\n", + " panRange: false\n", + " },\n", + " pan: {\n", + " interactive: true\n", + " }, \n", + "\n", + " grid: {\n", + " labelMargin: 15,\n", + " hoverable: true,\n", + " //borderWidth : 1000,\n", + " //show : false,\n", + " // //backgroundColor: { colors: [ \"#fff\", \"#eee\" ] },\n", + " backgroundColor: { colors: [\"#fff\", \"#fff\"] },\n", + " borderWidth: {\n", + " top: 2,\n", + " right: 2,\n", + " bottom: 2,\n", + " left: 2,\n", + " color : null\n", + " }\n", + " }\n", + " }\n", + " var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();\n", + " var image_dos = plot_dos.toDataURL();\n", + " image_dos = image_dos.replace(\"image/png\",\"image/octet-stream\");\n", + " image_dos = image_dos;\n", + " document.getElementById(img_dos_id).href= image_dos;\n", + " \n", + " }\n", + "*/" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": false, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": false, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/band_structure_visualization.ipynb b/band_structure_visualization.ipynb index b2c4549632725c1ee3c50a465af06e961f44b6c1..ae802f47de3dca31c7508a4235089d6b4bb680f0 100644 --- a/band_structure_visualization.ipynb +++ b/band_structure_visualization.ipynb @@ -266,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 6, "metadata": { "init_cell": true, "tags": [ @@ -906,7 +906,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 131, "metadata": { "tags": [ "process_band_dos_data" @@ -1749,7 +1749,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 132, "metadata": { "scrolled": false, "tags": [ @@ -3331,7 +3331,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 173, "metadata": { "tags": [ "plot_band" @@ -3660,7 +3660,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 174, "metadata": { "tags": [ "plot_dos" @@ -3929,7 +3929,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 167, "metadata": { "tags": [ "init_jquery" @@ -3956,7 +3956,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 168, "metadata": { "tags": [ "init_flot" @@ -3983,7 +3983,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 169, "metadata": { "tags": [ "init_flot_axislabels" @@ -4010,7 +4010,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 170, "metadata": { "tags": [ "init_flot_navigate" @@ -4064,7 +4064,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 149, "metadata": { "tags": [ "js_query_beforeafter" @@ -4113,7 +4113,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 150, "metadata": { "tags": [ "js_compare_slide"