Skip to content
Snippets Groups Projects
Commit 1c695bd5 authored by xyliu's avatar xyliu
Browse files

Fixed bugs.

parent 207d835d
Branches
No related tags found
No related merge requests found
%% Cell type:code id: tags:
``` python
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
```
%% Output
%% Cell type:code id: tags:
``` python
from IPython.core.display import Javascript
from IPython.display import display
def run_cell_by_tag(tags):
display(Javascript("window.runCells('"+tags+"')"))
```
%% Cell type:code id: tags:
``` python
%%HTML
<script>
code_show=true;
function code_toggle() {
if (code_show)
{
$('div.input').hide();
}
else
{
$('div.input').show();
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
The raw code for this notebook is by default hidden for easier reading.
To toggle on/off the raw code, click <a href="javascript:code_toggle()">here</a>.
```
%% Output
%% Cell type:code id: tags:
``` python
%%HTML
<div align="left" style="background-color: rgba(149,170,79, 1.0); width: 100%; height: 390px; overflow: hidden;">
<div >
<table>
<tr></tr>
<tr>
<td><img src="Nomad_tutorial_head.png"></td>
</tr>
</table>
</div>
<br><br>
<div style="position:relative; left:3%"><font size=6em color="#20335d" ><b> - Visualization of the band structure of materials </b></font></div>
<p style="position:relative;left:10%; ">
<br>
Created by:
Xiangyue Liu<sup>1</sup>(<a href="mailto:xyliu@fhi-berlin.mpg.de">email</a>),
Fawzi Mohamed<sup>1</sup>,
and Luca M. Ghiringhelli<sup>1</sup>(<a href="mailto:ghiringhelli@fhi-berlin.mpg.de">email</a>), <br>
<br><br>
<sup>1</sup> Fritz Haber Institute of the Max Planck Society, Faradayweg 4-6, D-14195 Berlin, Germany <br>
<br>
</p>
<br>
<div style="position:relative;bottom:3%">
<div style="position:absolute;right:5%;bottom: 0%;"><font color="#999999" size="10em">v2.0.0</font></div>
<div style="position:absolute;right:5%;bottom: 0%;"><font color="#666666" size="2.7em">[Last updated: August 5, 2019]</font></div>
</div>
</div>
<div style='text-align: right;'>
<a href="https://analytics-toolkit.nomad-coe.eu/home/" class="btn btn-primary" style="font-size:larger;">Back to Analytics Home</a>
<a href="https://www.nomad-coe.eu/" class="btn btn-primary" style="font-size:larger; ">Back to nomad-coe</a>
</div>
```
%% Output
%% Cell type:code id: tags:
``` python
%%HTML
<script>
window.findCellIndicesByTag = function findCellIndicesByTag(tagName) {
return (Jupyter.notebook.get_cells()
.filter(
({metadata: {tags}}) => tags && tags.includes(tagName)
)
.map((cell) => Jupyter.notebook.find_cell_index(cell))
);
};
window.runCells = function runPlotCells(tags) {
var c = window.findCellIndicesByTag(tags);
Jupyter.notebook.execute_cells(c);
};
</script>
```
%% Output
%% Cell type:code id: tags:search_materials
``` python
%%html
<br><br>
<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>
<br><br>
<style>
.button {
background-color: #e7e7e7;
border: 0.5px solid #A4A4A4;
color: black;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-family: Arial;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
}
.text-normal-black{
color: #000;font-weight: 200; font-size: 10pt;
font-family: Arial;
}
.div_band_dos{
box-sizing: border-box;
width: 100%;
height: 600px;
font-weight: 100;
font-family: Arial;
padding-left: 20px;
padding-top: 10px;
padding-right: 1em;
margin: 0;
border: 0;
}
.div_band_dos_compare{
box-sizing: border-box;
width: 1600px;
height: 600px;
color: #00AEFF;
font-weight: 100;
font-family: Arial;
padding-left: 20px;
padding-top: 10px;
padding-right: 1em;
margin: 0;
border: 0;
}
.div_band{
font-family: Arial;
font-size: 0.875em;
width: 37%;
height: 80%;
background-color: #fff;
float:left;
}
.div_dos{
font-family: Arial;
font-size: 0.875em;
width: 13%;
height: 80%;
background-color: #fff;
float:left;
}
.div_tools{
color: #20335d;font-weight: 150; font-size: 13pt;
width: 35%;
height: 80%;
background-color: #fff;
margin-left:20pt;
float:left;
font-family: Arial;
}
.div_checkbox_compare{
color: #888;font-weight: 150; font-size: 12pt;
width: 10%;
height: 80%;
background-color: #fff;
border: solid #fff 1px;
float:right;
font-family: Arial;
}
.div_overview{
width: 300px;
height: 200px;
background-color: #fff;
margin-left:10px;
margin-top: 20px;
font-family: Arial;
}
.button_tools {
background-color: #F0F0F0;
border: 0.5px solid #A4A4A4;
color: black;
padding: 10px 15px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
font-family: Arial;
}
.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%}
</style>
<script>
//Search for certain keyword: https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment
//FjiYy5-ETRCrs5ktzJA55w/bOY0cPkBvvNAY7pZdbginlKXJ2kF
//"upload_id"/"calc_id"
//Global variables
var paths_section_k_band_segment = [];
var paths_section_dos = [];
var band_obj_all = [];
var dos_obj_all = [];
var info_obj_all = [];
var band_paths = [];
var dos_paths = [];
var N_materials = 0; //Number of materials that have both band and DOS in the same calculation
function getJSON(url) {
var resp ;
var xmlHttp ;
resp = '' ;
xmlHttp = new XMLHttpRequest();
if(xmlHttp != null)
{
xmlHttp.open( "GET", url, false );
xmlHttp.send( null );
resp = xmlHttp.responseText;
}
return resp;
}
function match_band_dos()
{
//TMP for local tests
/*
paths_section_k_band_segment = ["data/kOJR-AlPSgiNG9AdZoxd4g_9mxjIU0edrPosfsTc4uyDG9H_UXr.json","data/kOJR-AlPSgiNG9AdZoxd4g_lfkGCmWozYENeiGhu5W7dJUqLTkj.json"];
paths_section_dos = ["data/kOJR-AlPSgiNG9AdZoxd4g_8tEGnaz0yY91eSyysKZkIUH9qx8J.json", "data/kOJR-AlPSgiNG9AdZoxd4g_lxUT3viRZcC_1IsH_KvO5tChAtV1.json"];
*/
//band_paths = [];
//dos_paths = [];
//N_materials = 0;
var data_k_band = [];
for(var i_path_k_band = 0; i_path_k_band < paths_section_k_band_segment.length; i_path_k_band ++)
{
var i_data_k_band_json = JSON.parse(getJSON(paths_section_k_band_segment[i_path_k_band]));
var i_data_k_band = {};
i_data_k_band["program_name"] = i_data_k_band_json["section_run"]["program_name"];
i_data_k_band["k_mesh_points"] = i_data_k_band_json["section_run"]["section_method"]["k_mesh_points"];
i_data_k_band["simulation_cell"] = i_data_k_band_json["section_run"]["section_system"][0]["simulation_cell"];
i_data_k_band["atom_positions"] = i_data_k_band_json["section_run"]["section_system"][0]["atom_positions"];
i_data_k_band["atom_labels"] = i_data_k_band_json["section_run"]["section_system"][0]["atom_labels"];
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"]
i_data_k_band["path"] = paths_section_k_band_segment[i_path_k_band];
data_k_band.push(i_data_k_band);
}
var data_dos = [];
for(var i_path_dos = 0; i_path_dos < paths_section_dos.length; i_path_dos ++)
{
var i_data_dos_json = JSON.parse(getJSON(paths_section_dos[i_path_dos]));
var i_data_dos = {};
i_data_dos["program_name"] = i_data_dos_json["section_run"]["program_name"];
i_data_dos["k_mesh_points"] = i_data_dos_json["section_run"]["section_method"]["k_mesh_points"];
i_data_dos["simulation_cell"] = i_data_dos_json["section_run"]["section_system"][0]["simulation_cell"];
i_data_dos["atom_positions"] = i_data_dos_json["section_run"]["section_system"][0]["atom_positions"];
i_data_dos["atom_labels"] = i_data_dos_json["section_run"]["section_system"][0]["atom_labels"];
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"]
i_data_dos["path"] = paths_section_dos[i_path_dos];
data_dos.push(i_data_dos);
}
//Matching: band[i] ~ dos[i] (the same systems are arranged with the same index)
band_paths = [];
dos_paths = [];
N_materials = 0;
for(var i_k_band = 0; i_k_band < data_k_band.length; i_k_band ++)
{
for(var i_dos = 0; i_dos < data_dos.length; i_dos ++)
{
if(data_k_band[i_k_band]["program_name"] != data_dos[i_dos]["program_name"])
continue;
//if(data_k_band[i_k_band]["k_mesh_points"].join() != data_dos[i_dos]["k_mesh_points"].join())
// continue;
if(data_k_band[i_k_band]["simulation_cell"].join() != data_dos[i_dos]["simulation_cell"].join())
continue;
if(data_k_band[i_k_band]["atom_positions"].join() != data_dos[i_dos]["atom_positions"].join())
continue;
if(data_k_band[i_k_band]["atom_labels"].join() != data_dos[i_dos]["atom_labels"].join())
continue;
if(data_k_band[i_k_band]["XC_functional_name"] != data_dos[i_dos]["XC_functional_name"])
continue;
band_paths.push(data_k_band[i_k_band]["path"]);
dos_paths.push(data_dos[i_dos]["path"]);
N_materials ++;
}
}
//Pass the arrays to python
var command = "N_materials = " + N_materials + ";"
var kernel = IPython.notebook.kernel;
command += "band_paths = " + "[\'" + band_paths.join("\',\'") + "\'];";
command += "dos_paths = " + "[\'" + dos_paths.join("\',\'") + "\'];";
kernel.execute(command);
}
function get_paths_from_search_results(result_json, div_id_search_results,div_head)
{
paths = [];
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>'];
for(var i_key in result_json)
{
if(i_key == "results")
{
for(var system in result_json[i_key])
{
//Get the path to the data files (json): https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/archive/upload_id/calc_id
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"]
paths.push(path);
//Show the results in div
// "formula" "spacegroup_symbol" "code_name" "xc_functional"
content = '<tr>';
content += '<td>' + result_json[i_key][system]["formula"] + '</td>';
content += '<td>' + result_json[i_key][system]["spacegroup_symbol"] + '</td>';
content += '<td>' + result_json[i_key][system]["code_name"] + '</td>';
content += '<td>' + result_json[i_key][system]["xc_functional"] + '</td>';
content += '<td>' + result_json[i_key][system]["upload_id"] + '</td>';
content += '<td>' + result_json[i_key][system]["calc_id"] + '</td>';
content += '<td>' + path + '</td>';
content += '</tr>';
search_results_content.push(content);
}
}
}
search_results_content.push('</table>');
document.getElementById(div_id_search_results).innerHTML = search_results_content.join('');
return paths
}
function submit_search()
{
var result;
var formula = document.getElementById("keyword_chemical_formula").value;
var query_command_k_band = "https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=" + formula + "&quantities=section_k_band_segment";
var query_command_dos = "https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?formula=" + formula + "&quantities=section_dos";
//result = getJSON("https://labdev-nomad.esc.rzg.mpg.de/fairdi/nomad/migration/api/repo/?quantities=section_k_band_segment");
var result_k_band = getJSON(query_command_k_band);
var result_dos = getJSON(query_command_dos);
var result_json_k_band = JSON.parse(result_k_band);//parse the searching results to json from URL
var result_json_dos = JSON.parse(result_dos);
paths_section_k_band_segment = [];
paths_section_dos = [];
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>");
paths_section_dos = get_paths_from_search_results(result_json_dos, "search_results_section_dos", "<br><font size=4em>Calculations containing DOS:</font><br>");
var promise = Promise.resolve();
promise
.then(match_band_dos())
.then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')))
.then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')));
//match_band_dos();
//Jupyter.notebook.execute_cells(window.findCellIndicesByTag('process_band_dos_data')); //Read the json files, and prepare data for plot
//Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot')); //Prepare for plot
}
function reset_search()
{
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('search_materials'));
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_results_and_plot'));
}
</script>
<font size=4em>Please input the chemical formula:</font>
<input type="text" id="keyword_chemical_formula" value="AlInO3">
<button class="button" onclick="submit_search()">Search</button>
<button class="button" onclick="reset_search()">Reset</button>
<br><br><br>
<div id="search_results_section_k_band_segment"></div>
<div id="search_results_section_dos"></div>
```
%% Output
%% Cell type:code id: tags:process_band_dos_data
``` python
%%HTML
<script>
var band_obj_all = [];
var dos_obj_all = [];
var info_obj_all = [];
//alert("process_band_dos_data: " +band_paths)
//alert("process_band_dos_data: " +info_obj_all)
function get_label_flag(coor_array)
{
var coor = coor_array.sort().join();
if(coor == '0,0.5,0.5')
return "X";
if(coor == '0,0,0.5')
return "M";
else if(coor == '0.5,0.5,0.5')
return "L";
else if(coor == '0.375,0.375,0.75')
return "K";
else if(coor == '0.25,0.5,0.75')
return "W";
else if(coor == '0,0,0')
return "\u0393";
else if(coor == '0.25,0.625,0.625')
return "U";
else
{
//alert("k label not found: " + coor);
return "?";
}
}
//============Process the band structure data============
function get_band_obj(band_path, dos_fermi_energy)
{
var band_data = JSON.parse(getJSON(band_path));
//---------Read section_k_band_segment------------
var section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']
//--------Get the number of k band segments-------------
var N_k_band_segments = section_k_band_segment.length;
//----------Get the total number of k points in all segments---------
var N_k_points_all = 0;
for(var i = 0; i < N_k_band_segments; i++)
N_k_points_all = N_k_points_all + section_k_band_segment[i]['band_k_points'].length;
//--------Get the x axis for the band structure figure: the coordinates of k points in 1D
// store in k_coor_1D[N_k_points_total]-----------------
var band_distance_segments = [];
for(i = 0; i < N_k_band_segments; i++)
{
var x1, x2, y1, y2, z1, z2;
[[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]],
band_distance_segments.push(Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) + Math.pow((z1-z2), 2));
}
var band_distance_total = band_distance_segments.reduce((x,y) => x+y); //sum of band_distance_segments
var average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total;
//Prepare the parameters to rescale the k coordinates into [0,1]
var step_k_point = 1.0 / N_k_points_all;
var step_k_point = (1.0 + step_k_point) / N_k_points_all;
var k_coor_1D = [];
for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points ++)
{
k_coor_1D.push(step_k_point * i_k_points)
}
//--------Get the eigenvalues of each band trajectory--------------
/*
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_bands = len(section_k_band_segment[0]['band_energies'][0][0])
band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues
N_k_points_all = 0
for i_segments in range(N_k_band_segments):
band_energies = section_k_band_segment[i_segments]['band_energies']
N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized
N_k_points_per_segment = len(band_energies[0])
for i_k_points in range(N_k_points_per_segment):
for i_bands in range(N_bands):
band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))
N_k_points_all = N_k_points_all + 1
*/
//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
var N_bands = section_k_band_segment[0]['band_energies'][0][0].length;
var band_energies_all = new Array(N_bands);
for(var i_bands = 0; i_bands < N_bands; i_bands ++)
band_energies_all[i_bands] = new Array(N_k_points_all);// new Array(N_bands, N_k_points_all); //store the eigenvalues
var i_k_points_all = 0;
for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)
{
var band_energies = section_k_band_segment[i_segments]['band_energies'];
var N_spin_channel = band_energies.length; //Number of the spin channel --FIXME: no spin polarized
var N_k_points_per_segment = band_energies[0].length;
for(var i_k_points = 0; i_k_points < N_k_points_per_segment; i_k_points ++)
{
for(var i_bands = 0; i_bands < N_bands; i_bands ++)
{
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;
}
i_k_points_all = i_k_points_all + 1 ;
}
}
var N_labels = 0
for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)
{
for(var j = 0; j < 2; j++)
//labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];
N_labels = N_labels + 1
}
var label_flag = [];//["" for i in range(N_labels)] //stores the flags of the labels (X, W, G, etc)
var i_label = 0;
var label_flag_last_final = "";
var label_flag_current_initial = "";
for(var i_segments = 0; i_segments < N_k_band_segments; i_segments ++)
{
var labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0].sort();
var labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1].sort();
var label_flag_0 = get_label_flag(labels_coor_0);
var label_flag_1 = get_label_flag(labels_coor_1);
var label_flag_current_initial = label_flag_0;
if(label_flag_last_final == "")
label_flag_last_final = label_flag_0;
if(label_flag_last_final == label_flag_current_initial)
label_flag[i_label] = label_flag_current_initial;
else
label_flag[i_label] = label_flag_last_final + '|' + label_flag_current_initial;
label_flag_last_final = label_flag_1
i_label = i_label + 1;
if(i_segments == N_k_band_segments - 1)
{
label_flag[i_label] = label_flag_1;
i_label = i_label + 1;
}
}
N_labels = i_label;
//------------Get the coordinates for the labels------------
//label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels
var label_coor_relative = [];//np.zeros((N_labels))
for(i_label = 0; i_label < N_labels; i_label ++)
{
//Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates
//x = labels_coor_0[0]
//y = labels_coor_0[1]
//z = labels_coor_0[2]
//label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)
label_coor_relative.push(step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all));
}
//----Store the label-----------
var label_obj = [];//[['' for i in range(2)] for j in range(N_labels)]
for(i_label = 0; i_label < N_labels; i_label ++)
{
label_obj.push([label_coor_relative[i_label], label_flag[i_label]]);
}
//-------Get VBM, CBM----------------
var HOMO = -1000;
var LUMO = 1000;
var coor_k_point_HOMO = []; //the coordinate of k point that stores HOMO
var coor_k_point_LUMO = [];//np.zeros((3)) #the coordinate of k point that stores LUMO
//band_gap_direct = 0.0
var band_gap_indirect = 0.0;
//band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))
//band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))
var band_energy_max = 10;
var band_energy_min = -10;
//N_band_energy_index = 10000
//band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index
//N_allowed_states = np.zeros(N_band_energy_index + 1)
//i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level
for(var i_bands = 0; i_bands < N_bands; i_bands ++)
{
for(var i_k_points_all = 0; i_k_points_all< N_k_points_all; i_k_points_all ++)
{
//i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)
//N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1
var band_energy = band_energies_all[i_bands][i_k_points_all];
if(band_energy > 0)
{
if(band_energy < LUMO)
LUMO = band_energy;
}
else
{
if(band_energy > HOMO)
HOMO = band_energy;
}
}
}
//#for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO
// if(N_allowed_states[i_band_index] > 0):
// LUMO = band_energy_min + band_energy_step * i_band_index
//print('HOMO, LUMO: ',HOMO, LUMO)
band_gap_indirect = Math.abs(LUMO - HOMO);
if(band_gap_indirect < 0.5) //VBM and CBM has to be found in another way for metals/charged system:
{
HOMO = -1000.0;
LUMO = 1000.0;
band_energy_max = 10.0;
band_energy_min = 0.0;
var N_band_energy_index = 10000;
var band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index;
var N_allowed_states = [];
for(var i_state = 0; i_state < N_band_energy_index+1; i_state++)
N_allowed_states.push(0);
//get the DOS and store in N_allowed_states[]
for(var i_k_points_all = 0; i_k_points_all < N_k_points_all; i_k_points_all ++)
{
for(var i_bands = 0; i_bands < N_bands; i_bands ++)
{
var band_energy = band_energies_all[i_bands][i_k_points_all];
if((band_energy_min < band_energy)&&(band_energy < band_energy_max))
{
var i_band_index = Math.floor((band_energy - band_energy_min) / band_energy_step);
N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1;
}
}
}
var if_gapped = 0;
for(var i_band_index = 0; i_band_index < N_band_energy_index; i_band_index ++)//go through the energy levels from the bottom
{
var band_energy = band_energy_min + band_energy_step * i_band_index
if(N_allowed_states[i_band_index] == 0)
if_gapped = if_gapped + 1;
if((band_energy > band_energy_max - 0.5) && (if_gapped == 0))
{
//alert("No gap found in this system. It seems to be a metal.");
HOMO = 1000;
LUMO = 1000;
break;
}
//print("At ", band_energy,": # allowed states = ", N_allowed_states[i_band_index]," if_gapped = ", if_gapped)
if(N_allowed_states[i_band_index] > 0)
{
if(if_gapped * band_energy_step > 0.3 )//above VBM-CBM gap: LUMO
{
if(band_energy < LUMO)
{
//print("LUMO got!")
LUMO = band_energy;
break; //break before touching another gap that is above the band gap
}
}
if(if_gapped * band_energy_step < 0.3) //below VBM-CBM gap: HOMO
{
if(band_energy > HOMO)
{
//print("HOMO got!")
HOMO = band_energy;
}
}
if_gapped = 0;
}
}
//alert('HOMO, LUMO for metal/charged system: '+ HOMO +","+LUMO)
}
//Find the position of HOMO, LUMO
var coor_k_point_HOMO = 0, coor_k_point_LUMO = 0;
for(var i_k_points = 0; i_k_points < N_k_points_all; i_k_points++)
{
for(var i_bands = 0; i_bands < N_bands; i_bands ++)
{
if(Math.abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001)
coor_k_point_HOMO = k_coor_1D[i_k_points];
if(Math.abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001)
coor_k_point_LUMO = k_coor_1D[i_k_points];
}
}
//alert(coor_k_point_HOMO +"," + coor_k_point_LUMO);
//Store the band data to band_obj
var band_obj = {};
band_obj["band_x_axis"] = k_coor_1D;
band_obj["band_y_axis"] = band_energies_all
band_obj["labels"] = label_obj;
band_obj["HOMO_energy"] = HOMO;
band_obj["HOMO_coor"] = coor_k_point_HOMO;
band_obj["LUMO_energy"] = LUMO;
band_obj["LUMO_coor"] = coor_k_point_LUMO;
band_obj["average_N_k_points_per_inverse_distance"] = average_N_k_points_per_inverse_distance;
return band_obj
}
function get_dos_obj(dos_path)
{
var dos_data = JSON.parse(getJSON(dos_path));
var N_dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'].length;
//in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]
//dos_energies = new Array(N_dos_values).fill(0.0);
//dos_energies_tmp = new Array(N_dos_values).fill(0.0) #tmp array for unit convertion
//dos_values = new Array(N_dos_values).fill(0.0)
var dos_energies = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'];
var dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_integrated_values'];//[0]
//To do: check if every section_dos has 'dos_fermi_energy'
var dos_fermi_energy = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_fermi_energy'];
dos_fermi_energy = dos_fermi_energy / (1.60217656535 * Math.pow(10,-19));
for(var i = 0; i < N_dos_values; i++)
{
dos_energies[i] = dos_energies[i] / (1.60217656535 * Math.pow(10,-19)) - dos_fermi_energy;
}
dos_obj = {}
dos_obj["dos_x_axis"] = dos_energies;
dos_obj["dos_y_axis"] = dos_values;
dos_obj["dos_fermi_energy"] = dos_fermi_energy;
return dos_obj
}
function get_info_obj(band_path)
{
var band_data = JSON.parse(getJSON(band_path));
var info_obj = {};
//---------Read the information of the calculation--------
info_obj["program_name"] = band_data["section_run"]["program_name"];
info_obj["program_basis_set_type"] = band_data["section_run"]["program_basis_set_type"];
info_obj["atom_labels"] = band_data["section_run"]["section_system"][0]["atom_labels"];
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"];
//----------Get the space group information----------
/*
[space_group_symbol, lattice_constant] = get_space_group(band_data);
info_obj["space_group_symbol"] = np.array(space_group_symbol).tolist();
info_obj["lattice_constant"] = np.array(lattice_constant).tolist();
*/
return info_obj
}
function process_band_dos_data()
{
info_all = [];
band_obj_all = [];
dos_obj_all = [];
for(var i = 0; i < N_materials; i++)
{
var band_path = band_paths[i];
var dos_path = dos_paths[i];
var dos_obj = get_dos_obj(dos_path);
var dos_fermi_energy = dos_obj["dos_fermi_energy"];
band_obj = get_band_obj(band_path, dos_fermi_energy);
var info_obj = get_info_obj(band_path);
band_obj_all.push(band_obj);
dos_obj_all.push(dos_obj);
info_obj_all.push(info_obj);
}
}
process_band_dos_data();
//alert("process_band_dos_data: info_obj_all: "+JSON.stringify(info_obj_all));
</script>
```
%% Output
%% Cell type:code id: tags:show_results_and_plot
``` python
%%HTML
<script>
var N_max_show = 10; //Number of results to be shown by default
function show_materials_submitted_info()
{
//alert("N_materials=" + N_materials)
//"table_materials_submitted_info"
//alert("show_materials_submitted_info: info_obj_all: "+JSON.stringify(info_obj_all))
var table_content = new Array();
str = '<tr>';
str += '<th width="5%"></th>'
str += '<th width="10%"><p style=\"text-align:center\"><font size = \"4pt\"><b>Atom labels</b></font></p></th>';
//str += '<th width="10%"><p style=\"text-align:center\"><font size = \"4pt\"><b>Space group</b></font></p></th>';
//str += '<th width="15%"><p style=\"text-align:center\"><font size = \"4pt\"><b>Lattice constants (in Ang)</b></font></p></th>';
str += '<th width="10%"><p style=\"text-align:center\"><font size = \"4pt\"><b>Program name</b></font></p></th>';
str += '<th width="10%"><p style=\"text-align:center\"><font size = \"4pt\"><b>Basis set type</b></font></p></th>';
str += '<th width="15%"><p style=\"text-align:center\"><font size = \"4pt\"><b>Functional</b></font></p></th>';
//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>';
str += '</tr>'; //first row: head
table_content.push(str);
for(var i = 0; i < N_materials; i++) //add info of each material
{
//alert("show_materials_submitted_info: material "+ i);
table_content.push('<tr>');
table_content.push('<td>');
str = '<input type = \"checkbox\" name = "checkbox_material" id = \"checkbox_material' + i.toString() + '\" unchecked onclick=\"checkbox_material(this.id)\">';
str += "<b>&nbsp&nbsp#" + (i+1).toString() + "</b>";
table_content.push(str);
table_content.push('</td>');
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += info_obj_all[i]["atom_labels"] + '; &nbsp&nbsp';
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got atom_labels");
/*
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += info_obj_all[i]["space_group_symbol"] + '; &nbsp&nbsp';
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got space_group_symbol");
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += info_obj_all[i]["lattice_constant"] + '; &nbsp&nbsp';
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got lattice_constant");
*/
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += info_obj_all[i]["program_name"].toUpperCase() + '; &nbsp&nbsp';
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got program_name");
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += info_obj_all[i]["program_basis_set_type"] + '; &nbsp&nbsp';
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got program_basis_set_type");
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += info_obj_all[i]["XC_functional_name"] + '; &nbsp&nbsp';
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got XC_functional_name");
/*
table_content.push('<td>');
str = '<font size = \"3pt\">';
str += band_obj_all[i]["average_N_k_points_per_inverse_distance"].toFixed(3);
str += "</font>"
table_content.push(str);
table_content.push('</td>');
//alert("got average_N_k_points_per_inverse_distance");
*/
table_content.push('</tr>');
}
document.getElementById("table_materials_submitted_info").innerHTML = table_content.join('');
}
function clean_materials_selection()
{
var choices_compare = document.getElementsByName("checkbox_material");
for(var i=0; i<choices_compare.length; i++)
{
//choices_compare[i].removeAttribute('checked');
//choices_compare[i].setAttribute("unchecked", "unchecked");
choices_compare[i].checked = "";
}
}
function select_all()
{
var choices_compare = document.getElementsByName("checkbox_material");
for(var i=0; i<choices_compare.length; i++)
{
//choices_compare[i].removeAttribute('checked');
//choices_compare[i].setAttribute("unchecked", "unchecked");
choices_compare[i].checked = "checked";
}
}
function process()
{
//alert("Process:"+band_paths)
//Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_js_plot'));
//Jupyter.notebook.execute_cells(window.findCellIndicesByTag('show_materials_submitted_info'));
show_materials_submitted_info();
document.getElementById("table_visualize").innerHTML = "";
str = N_materials.toString();
document.getElementById("n_materials").innerHTML = "Number of materials submitted: " + str + "<font size = 1px color = #C0C0C0 > &nbsp Please press \'Visualize\' to visualize the band structure. </font>";
document.getElementById("div_showall").style.visibility="hidden";
}
var image_band = '';
var image_dos = '';
var image_band_links = new Array(N_materials); //store the URL of each band figure -> used to compare 2 figures
var image_band_links_selected = [];
var image_band_selected_Number = []; //record which i_material has been selected
function prepare(N_materials_show)
{
document.getElementById("table_visualize").innerHTML = "";
var table_content = new Array();
//document.getElementById("table_visualize").innerHTML = table_content.join('');
//-----Generate the html tables for each material--------
for(var i = 0; i < N_materials_show; i++)
{
checkbox_material_id = "checkbox_material" + i.toString();
var if_selected = check_show_VBM(checkbox_material_id);
if(if_selected != 1)
{
continue;
}
table_content.push('<tr>');
div_string = '<div style = \"height: 20px\"></div>';
table_content.push(div_string);
table_content.push('<th>');
//add main container div
div_string = '<div id = \"div_band_dos' + i.toString() + '\" class = \"div_band_dos\" >';
table_content.push(div_string);
//show No. of the material
i_material = i + 1;
div_string = '<div style = \"height:30px\; font-size: 15pt;">' + '#' + i_material.toString() + '</div>';
table_content.push(div_string);
//show band_path/dos info
div_string = '<div style = \"height:30px\">' + 'Band: &nbsp&nbsp' + band_paths[i] + ',&nbsp&nbsp&nbsp&nbspDOS: &nbsp&nbsp' + dos_paths[i] + '</div>';
table_content.push(div_string);
//add div_band
div_string = '<div id = \"div_band' + i.toString() + '\" class = \"div_band\" ></div>';
table_content.push(div_string);
//add div_dos
div_string = '<div id = \"div_dos' + i.toString() + '\" class = \"div_dos\" ></div>';
table_content.push(div_string);
//add div_tools
div_string = '<div id = \"div_tools' + i.toString() + '\" class = \"div_tools\" >';
table_content.push(div_string);
//add: infomation
div_string = '<div id = \"div_info' + i.toString() + '\">atom_labels<br>program_name</div>';
table_content.push(div_string);
//add: custom scale
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: &nbsp&nbsp </font><textarea id=\"lowerlimit' + i.toString() + '\" rows=\"1\" style = \"width: 70px;\">-10</textarea> <font color=\"black\" size = 3px> &nbsp eV</font> &nbsp&nbsp&nbsp<font color=\"black\" size = 3px> Upper limit: &nbsp&nbsp </font><textarea id=\"upperlimit' + i.toString() + '\" rows=\"1\" style = \"width: 70px;\">10</textarea> <font color=\"black\" size = 3px> &nbsp eV&nbsp&nbsp&nbsp</font></p>';
table_content.push(div_string);
div_string = '<br><button class = \"button_tools\" id = \"button_customscale' + i.toString() + '\" onclick = \"customscale(this.id)\"> Rescale </button>';
table_content.push(div_string);
//add button:autoscale
div_string = '<button class = \"button_tools\" id = \"button_autoscale' + i.toString() + '\" onclick = \"autoscale(this.id)\" title = \"(-10 eV, 10 eV)\"> Autoscale </button>';
table_content.push(div_string);
//add button:fullscale
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>';
table_content.push(div_string);
//table_content.push("Select and zoom:");
/*//overview for select and zoom
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>
table_content.push(div_string);
div_string = '<p id = \"overviewLegend' + i.toString() + '\" ></p>'; // <p id="overviewLegend" style="margin-left:10px"></p>
table_content.push(div_string);*/
//download figures as png
div_string = '<a id = \"img_band' + i.toString() + '\" class = \"button_tools\" target=\"_blank\" style = \"text-decoration: none;\" > Download band </a>';
table_content.push(div_string);
div_string = '<a id = \"img_dos' + i.toString() + '\" class = \"button_tools\" target=\"_blank\" style = \"text-decoration: none;\" > Download DOS </a>';
table_content.push(div_string);
//add show VBM & CBM
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>';
table_content.push(div_string);
table_content.push('</div>');//div_tools
//checkbox for comparison
div_string = '<div id = \"div_checkbox_compare' + i.toString() + '\" class = \"div_checkbox_compare\" >';
table_content.push(div_string);
//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>';
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>';
table_content.push(div_string);
table_content.push('</div>');//div_checkbox_compare
table_content.push('</div>');//div_band_dos
table_content.push('</th>');
table_content.push('</tr>');
}
document.getElementById("table_visualize").innerHTML = table_content.join('');
}
function visualize_band_dos()
{
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_jquery'));
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot'));
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_axislabels'));
//Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_dashes'));
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_navigate'));
//Jupyter.notebook.execute_cells(window.findCellIndicesByTag('init_flot_selection'));
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_flot_legendoncanvas'));
document.getElementById("div_showall").style.visibility="hidden";
document.getElementById("div_compare_buttons").style.visibility="";
if(N_materials > N_max_show)
{
document.getElementById("div_showall").style.visibility="visible";
document.getElementById("checkbox_showall").checked = "";
}
N_materials_show = Math.min(N_max_show, N_materials);
prepare(N_materials_show);
clean_compare_list();
plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);
check_plot_band_dos_status(-10, 10, N_materials_show);
//check_plot_band_dos = check_plot_band_dos_status(-10, 10, N_materials_show);
}
function show_all(id)//"plot_placeholder"
{
var if_showall=0;
if_showall = check_show_VBM(id);
if(if_showall == 1)
{
N_materials_show = N_materials;
prepare(N_materials_show);
clean_compare_list();
plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);
}
else
{
N_materials_show = Math.min(N_max_show, N_materials);
prepare(N_materials_show);
clean_compare_list();
plot_band_dos_status = plot_band_dos(-10,10, N_materials_show);
}
}
//------------------Tool used to get the content from textarea---------------------
function get_text(textarea_id)
{
var text = document.getElementById(textarea_id).value;
return text;
}
//-------------------Compare 2 band figures----------------------------------------
function check_compare(id)//checkbox_compare' + i.toString() + '\" unchecked onclick=\"check_compare(this.id)
{
var x = document.getElementById(id);
var choices_compare = document.getElementsByName("checkbox_compare");
var N_chosen = 0;
for(var i=0; i<choices_compare.length; i++)
{
if(choices_compare[i].checked)
{
N_chosen ++;
}
}
if(N_chosen == 2) // In max. only 2 figures could be selected and compared.
{
for(var i=0; i<choices_compare.length; i++)
{
if(!choices_compare[i].checked)
{
choices_compare[i].disabled = 'disabled';
}
}
}
else
{
for(var i=0; i<choices_compare.length; i++)
{
choices_compare[i].removeAttribute('disabled');
}
}
}
function compare()
{
$("#div_compare").fadeIn(600);//show div for comparison
//check_compare(-100);
var compare_list = [];
compare_list = make_compare_list();
i_material_1 = compare_list[0];
i_material_2 = compare_list[1];
if((i_material_1 == -1) || (i_material_2 == -1))
{
var str = '<b><font size = "5pt" color="#940000">Error: Please select two materials before comparison.</font></b><br>';
document.getElementById("div_compare_errormsg").innerHTML = str;
document.getElementById("div_compare_containerx1").innerHTML = "";
document.getElementById("div_compare_containerx2").innerHTML = "";
document.getElementById("div_compare_info1").innerHTML = "";
document.getElementById("div_compare_info2").innerHTML = "";
str = "";
return;
}
document.getElementById("div_compare_errormsg").innerHTML = "";
compare_figures(i_material_1, i_material_2);
}
function make_compare_list()
{
//get the links to the images
images_selected_links = []; //store the links to the figures for comparison
var choices_compare = document.getElementsByName("checkbox_compare");
var N_chosen = 0;
var str = ''; //tmp str for debug
var figure_selected = new Array(2);
for(var i=0; i<choices_compare.length; i++) //check which figures are selected
{
if(choices_compare[i].checked)
{
id_chosen = choices_compare[i].id;
i_chosen = Math.round(id_chosen.substring(16));
var tmp_str = image_band_links[i_chosen];
images_selected_links.push(tmp_str);
figure_selected[N_chosen] = i_chosen;
N_chosen ++;
//str += beakerx.image_band_links[i];
}
}
var i_material_1 = -1;
var i_material_2 = -1;
//document.getElementById("demo").innerHTML = 'In making comare list';
image_band_links_selected = images_selected_links;
//document.getElementById("demo").innerHTML = 'In making comare list: next';
if(N_chosen == 2)
{
i_material_1 = figure_selected[0];
i_material_2 = figure_selected[1];
}
//document.getElementById("demo").innerHTML = 'Compare_list: ' +i_material_1.toString() + ' ' + i_material_2.toString();
return [i_material_1, i_material_2];
}
function check_compare_scale(i_material_1, i_material_2)
{
lowerlimit_id_1 = "lowerlimit" + i_material_1.toString();
lowerlimit_id_2 = "lowerlimit" + i_material_2.toString();
upperlimit_id_1 = "upperlimit" + i_material_1.toString();
upperlimit_id_2 = "upperlimit" + i_material_2.toString();
lowerlimit_1 = parseFloat(document.getElementById(lowerlimit_id_1).innerHTML);
lowerlimit_2 = parseFloat(document.getElementById(lowerlimit_id_2).innerHTML);
upperlimit_1 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);
upperlimit_2 = parseFloat(document.getElementById(upperlimit_id_2).innerHTML);
if((lowerlimit_1 != lowerlimit_2) || (upperlimit_1 != upperlimit_2))
return -1;
else
return 1;
}
function compare_figures(i_material_1, i_material_2)
{
var promise = Promise.resolve();
promise
.then(Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_compare_slide')))
.then(add_info_compare(i_material_1, i_material_2))
.then(document.getElementById("div_compare_container").scrollIntoView({ behavior: 'smooth' }))
.then(document.getElementById("div_compare_container").scrollTop += 50);
/*
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_query_beforeafter'));
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('js_compare_slide'));
add_info_compare(i_material_1, i_material_2);
document.getElementById("div_compare_container").scrollIntoView({ behavior: 'smooth' });
document.getElementById("div_compare_container").scrollTop += 50;
*/
}
function clean_compare_list()
{
var choices_compare = document.getElementsByName("checkbox_compare");
for(var i=0; i<choices_compare.length; i++)
{
//choices_compare[i].removeAttribute('checked');
//choices_compare[i].setAttribute("unchecked", "unchecked");
choices_compare[i].checked = "";
choices_compare[i].removeAttribute('disabled');
}
}
//-----------Add information about the calculation to "div_tools"---------------
function add_info(i)
{
//document.getElementById("demoa").innerHTML = i.toString() + div_info_id;
//for(var i = 0; i < beakerx.N_materials; i++)
//{
div_info_id = "div_info" + i.toString();
var str = '';
str += "<br> <p style=\"text-align:left\"><font size = 3pt><b>Atom labels:</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["atom_labels"] + '</font></p>';
//str += "<font size = 3pt><b>Space group:</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["space_group_symbol"] + '</font>';
//str += "<font size = 3pt><b>Lattice constants (in Ang):</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["lattice_constant"] + '</font>';
str += "<p style=\"text-align:left\"><font size = 3pt><b>Program name:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["program_name"].toUpperCase() + '</font></p>';
str += "<p style=\"text-align:left\"><font size = 3pt><b>Basis set type:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["program_basis_set_type"] + '</font></p>';
str += "<p style=\"text-align:left\"><font size = 3pt><b>Functional:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["XC_functional_name"] + '</font></p>';
str += "<p style=\"text-align:left\"><font size = 3pt><b>Number of <i>k</i> points per inverse distance:</b>&nbsp&nbsp&nbsp&nbsp" + band_obj_all[i]["average_N_k_points_per_inverse_distance"].toFixed(3) + '</font></p>';
document.getElementById(div_info_id).innerHTML = str;// + origData["atom_labels"];
//document.getElementById('program_name_1').innerHTML = "<b>Code:</b>&nbsp&nbsp&nbsp&nbsp" + origData["program_name"];
//document.getElementById('program_basis_set_type_1').innerHTML = "<b>Basis set type:</b>&nbsp&nbsp&nbsp&nbsp" + origData["program_basis_set_type"];
//document.getElementById('XC_functional_name_1').innerHTML = "<b>Functional:</b>&nbsp&nbsp&nbsp&nbsp" + origData["XC_functional_name"];
//}
}
function add_info_compare(i,j)
{
var str = '';
if_same_scale = check_compare_scale(i_material_1, i_material_2);
if(if_same_scale == -1)
{
str = '<b><font size = "5pt" color="#940000">Warning: Different lower/upper limits.</font></b><br>';
document.getElementById("div_compare_errormsg").innerHTML = str;
}
document.getElementById("div_compare_errormsg").innerHTML = "";
str += "<br> <b>Atom labels:</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["atom_labels"];
//str += "<br> <b>Space group:</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["space_group_symbol"];
//str += "<br> <b>Lattice constants (in Ang):</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["lattice_constant"];
str += "<br> <b>Program name:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["program_name"].toUpperCase();
str += "<br> <b>Basis set type:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["program_basis_set_type"];
str += "<br> <b>Functional:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[i]["XC_functional_name"];
str += "<br> <b>Number of <i>k</i> points per inverse distance:</b>&nbsp&nbsp&nbsp&nbsp" + band_obj_all[j]["average_N_k_points_per_inverse_distance"].toFixed(3);
document.getElementById("div_compare_info1").innerHTML = str;// + origData["atom_labels"];
str = "<br> <b>Atom labels:</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[j]["atom_labels"];
//str += "<br> <b>Space group:</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[j]["space_group_symbol"];
//str += "<br> <b>Lattice constants (in Ang):</b> &nbsp&nbsp&nbsp&nbsp" + info_obj_all[j]["lattice_constant"];
str += "<br> <b>Program name:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[j]["program_name"].toUpperCase();
str += "<br> <b>Basis set type:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[j]["program_basis_set_type"];
str += "<br> <b>Functional:</b>&nbsp&nbsp&nbsp&nbsp" + info_obj_all[j]["XC_functional_name"];
str += "<br> <b>Number of <i>k</i> points per inverse distance:</b>&nbsp&nbsp&nbsp&nbsp" + band_obj_all[j]["average_N_k_points_per_inverse_distance"].toFixed(3);
document.getElementById("div_compare_info2").innerHTML = str;// + origData["atom_labels"];
}
//-----------------------Show/hide VBM, CBM-------------------------
function check_show_VBM(checkbox_VBM_id)
{
var x = document.getElementById(checkbox_VBM_id);
var if_checked = 0;
if(x.checked)//== "checked")
{
//document.getElementById("demoa").innerHTML = "checked!";
if_checked = 1;
}
else if (x.unchecked)// == "unchecked")
{
//document.getElementById("demoa").innerHTML = "unchecked!";
if_checked = -1;
}
else
{
//document.getElementById("demoa").innerHTML = "nothing detected!";
}
return if_checked;
}
function check_if_in_compare_list(i) // check if the current material i is to be compared
{
var checkbox_compare_id = "checkbox_compare" + i.toString();
var if_compare = check_show_VBM(checkbox_compare_id);
//document.getElementById("demo").innerHTML = 'if_compare of ' + i.toString() + ' : ' + if_compare.toString();
var i_compare_material_1, i_compare_material_2;
[i_compare_material_1, i_compare_material_2] = make_compare_list();
var i_in_compare_list = -1;
if(i_compare_material_1 == i)
{
i_in_compare_list = 1;
}
else if (i_compare_material_2 == i)
{
i_in_compare_list = 2;
}
else
{
i_in_compare_list = 0;
}
//document.getElementById("demo").innerHTML = 'Checking ' + i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();
return [if_compare, i_in_compare_list];
}
function show_VBM(id)
{
//prepare("new");
//var if_show_VBM = -1;
var len_id = id.length;
var i_material = id.substring(12);
var i = Math.round(i_material);
var checkbox_VBM_id = "checkbox_VBM" + i.toString();
var if_show_VBM = check_show_VBM(checkbox_VBM_id);
var if_compare, i_in_compare_list;
[if_compare, i_in_compare_list] = check_if_in_compare_list(i);
//document.getElementById("demo").innerHTML = i.toString() + ' in Compare_list: ' + i_in_compare_list.toString();
plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);
}
//---------------------Functions to rescale-------------------------------------------
function autoscale(id)
{
var len_id = id.length;
var i_material = id.substring(16);
var i = Math.round(i_material);
upperlim_id = "upperlimit" + i_material;
document.getElementById(upperlim_id).innerHTML ="10.0";
upperlim = document.getElementById(upperlim_id).value = 10.0;
lowerlim_id = "lowerlimit" + i_material;
document.getElementById(lowerlim_id).innerHTML ="-10.0";
upperlim = document.getElementById(lowerlim_id).value = -10.0;
//document.getElementById("demoa").innerHTML =i_material;
var checkbox_VBM_id = "checkbox_VBM" + i.toString();
var if_show_VBM = check_show_VBM(checkbox_VBM_id);
var if_compare, i_in_compare_list;
[if_compare, i_in_compare_list] = check_if_in_compare_list(i);
plot_band_dos_i(i, -10, 10, if_show_VBM, if_compare, i_in_compare_list);
}
function fullscale(id)
{
var len_id = id.length;
var i_material = id.substring(16);
var i = Math.round(i_material);
upperlim_id = "upperlimit" + i_material;
document.getElementById(upperlim_id).innerHTML ="100.0";
upperlim = document.getElementById(upperlim_id).value = 100.0;
lowerlim_id = "lowerlimit" + i_material;
document.getElementById(lowerlim_id).innerHTML ="-100.0";
upperlim = document.getElementById(lowerlim_id).value = -100.0;
//document.getElementById("demoa").innerHTML =i_material;
var checkbox_VBM_id = "checkbox_VBM" + i.toString();
var if_show_VBM = check_show_VBM(checkbox_VBM_id);
var if_compare, i_in_compare_list;
[if_compare, i_in_compare_list] = check_if_in_compare_list(i);
plot_band_dos_i(i, -100, 100, if_show_VBM, if_compare, i_in_compare_list);
}
function customscale(id)
{
var len_id = id.length;
var i_material = id.substring(18);
var i = Math.round(i_material);
//
upperlim_id = "upperlimit" + i_material;
upperlim = document.getElementById(upperlim_id).value;
upperlim_float = Math.round(upperlim);
lowerlim_id = "lowerlimit" + i_material;
lowerlim = document.getElementById(lowerlim_id).value;
lowerlim_float = Math.round(lowerlim);
var checkbox_VBM_id = "checkbox_VBM" + i.toString();
var if_show_VBM = check_show_VBM(checkbox_VBM_id);
var if_compare, i_in_compare_list;
[if_compare, i_in_compare_list] = check_if_in_compare_list(i);
plot_band_dos_i(i, lowerlim_float, upperlim_float, if_show_VBM, if_compare, i_in_compare_list);
}
/*
function check_plot_band_dos_status(lowerLim, upperLim, N_materials_show)
{
var N_plot_done = 0;
for (let i_material = 0, p = Promise.resolve(); i_material < N_materials_show; i_material++) {
p = p.then(_ => new Promise(resolve =>
setTimeout(function () {
//alert(i_material)
var promise = Promise.resolve();
promise
.then(var checkbox_material_id = "checkbox_material" + i_material.toString())
.then(var if_selected = check_show_VBM(checkbox_material_id))
.then(if(if_selected == 1){plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);N_plot_done ++;});
var checkbox_material_id = "checkbox_material" + i_material.toString();
var if_selected = check_show_VBM(checkbox_material_id);
if(if_selected == 1)
{
plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);
N_plot_done ++;
}
resolve();
}, 0)
));
}
if(N_plot_done != N_materials_show)
alert("Plot not complete: " + " Ploted: "+ str(N_plot_done) + "; N_materials = "+str(N_materials_show));
return N_plot_done;
}
*/
function plot_band_dos(lowerLim, upperLim, N_materials_show)
{
placeholder_band = "#div_band1";
placeholder_dos = "#div_dos1";
// lowerLim = -10.01
//upperLim = 10.01
//alert("plot_band_dos");
//prepare();
for(var i = 0; i < N_materials_show; i++)
{
var checkbox_material_id = "checkbox_material" + i.toString();
var if_selected = check_show_VBM(checkbox_material_id);
if(if_selected != 1)
{
continue;
}
add_info(i);
}
//------Plot----------------
/*
for(var i_material = 0; i_material < N_materials_show; i_material++)
{
//alert("Material "+i);
var checkbox_material_id = "checkbox_material" + i_material.toString();
var if_selected = check_show_VBM(checkbox_material_id);
if(if_selected != 1)
{
continue;
}
plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);
}
*/
//alert("next:for")
for (let i_material = 0, p = Promise.resolve(); i_material < N_materials_show; i_material++) {
p = p.then(_ => new Promise(resolve =>
setTimeout(function () {
//alert(i_material)
var checkbox_material_id = "checkbox_material" + i_material.toString();
var if_selected = check_show_VBM(checkbox_material_id);
if(if_selected == 1)
{
plot_band_dos_i(i_material, lowerLim, upperLim, 0, 0, -1);
}
resolve();
}, 0)
));
}
return 1;
}
var i = 0
var lowerLim = -10
var upperLim = 10
var if_show_VBM = 0
var if_compare = 0
var i_in_compare_list = -1
function plot_band_dos_i(i_material, lowerLim_material, upperLim_material, if_show_VBM_material, if_compare_material, i_in_compare_list_material)
{
//alert("plot_band_dos_i")
i = i_material;
lowerLim = lowerLim_material;
upperLim = upperLim_material;
if_show_VBM = if_show_VBM_material;
if_compare = if_compare_material;
i_in_compare_list = i_in_compare_list_material;
//alert("plot_band_dos_i: i_material: "+i)
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_band'));
//alert('i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list')
//plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);
Jupyter.notebook.execute_cells(window.findCellIndicesByTag('plot_dos'));
}
</script>
<br><br>
<button class="button" onclick="process()">Process data</button>
<br><br>
<div id = "n_materials" style = "font-size: 18px; font-weight: 100; height: 60px; width: 100%;"> Number of materials submitted: 0</div>
<div id = "show_materials_submitted" style = "font-size: 20px; font-color: black;"> </div>
<div style = "width :100%; height: 30px;"></div>
<p style="color: #20335d;font-weight: 100; font-size: 18pt;"> Select materials to visualize the band structure and DOS:</p>
<div style = "width :100%; height: 10px;"></div>
<button class = "button" onclick = "clean_materials_selection()"> Clean selections </button>
<button class = "button" onclick = "select_all()"> Select all </button>
<button class = "button" onclick = "visualize_band_dos()"> Visualize </button>
<div style = "width :100%; height: 30px;"></div>
<div id = "show_materials_submitted_info" style = "width: 100%; font-size: 20px; font-color: black;">
<table id = "table_materials_submitted_info" style="width:100%"> </table>
</div>
<div style = "width :100%; height: 30px;"></div>
<div id="div_compare_buttons" style="visibility:hidden">
<br><br><br>
<p style="color: #20335d;font-weight: 100; font-size: 18pt;"> Select two materials in the checkbox on the right for comparison:</p>
<p style="color: #000;font-weight: 1000; font-size: 8pt;"></p>
<button class = "button" onclick = "clean_compare_list()"> Clean selections </button>
<button class = "button" onclick = "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>
</div>
<div id = "div_showall" style = "width: 100%; visibility:hidden">
<div style = "width: 100%; height: 30px; "></div>
<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>
<div style = "width: 100%; height: 30px; "></div>
</div>
<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)">
<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-->
<div id = "div_compare_container" style = "margin-top: 50px; margin-left: 100px; width: 1200px; height: 600px;">
<div id = "div_compare_errormsg"></div>
<table>
<tr>
<td>
<div id = "div_compare_containerx1"></div>
</td>
<td>
<div id = "div_compare_containerx2"></div>
</td>
</tr>
<tr>
<td>
<div id = "div_compare_info1" style = "z-index: 10000000;"></div>
</td>
<td>
<div id = "div_compare_info2" style = "z-index: 10000000;"></div>
</td>
</tr>
</table>
</div>
</div>
<div id = "demo"></div>
<div id = "plot_placeholder">
<div><br></div>
<table id = "table_visualize"> </table>
</div>
<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>
```
%% Output
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:plot_band
``` python
%%javascript
//alert("tag: plot_band")
plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list);
function plot_band(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)
{
//i=0;
//alert("plot_band "+ i)
var placeholder_band = "#div_band" + i.toString();
var placeholder_dos = "#div_dos" + i.toString();
var placeholder_tools = "#div_tools" + i.toString();
var placeholder_overview = "#div_overview" + i.toString();
var placeholder_overviewlegend = "#overviewLegend" + i.toString();
var checkbox_VBM_id = "checkbox_VBM" + i.toString();
var img_band_id = "img_band" + i.toString();
var img_dos_id = "img_dos" + i.toString();
var placeholder_band_compare = "";
if(i_in_compare_list == 1)
{
placeholder_band_compare = "#div_band_compare_1";
}
else if(i_in_compare_list == 2)
{
placeholder_band_compare = "#div_band_compare_2";
}
else
{
placeholder_band_compare = "#div_band_compare_1"; // just for safe
}
Object.size = function(obj) {
var size = 0, key;
for (key in obj)
{
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
//Get the number of bands
//alert("Getting band")
//alert(band_obj_all)
//alert("band_obj_all got!")
var N_bands = Object.size(band_obj_all[i]["band_y_axis"]);
var N_k_coors = Object.size(band_obj_all[i]["band_x_axis"]);
//alert(band_obj_all[i]["band_y_axis"])
var band_plotdata = [];
for(var i_band =0; i_band < N_bands; i_band++)
{
var tmp_data = [];
for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)
{
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]]);
}
var plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };
band_plotdata.push(plotData);
}
var tmp_data0 = [[0, 0], [1, 0]];
var plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};
band_plotdata.push(plotData0);
var band_plotdata_overview = band_plotdata.slice(0);
var HOMOdata= [[band_obj_all[i]["HOMO_coor"],band_obj_all[i]["HOMO_energy"]]];
var HOMOlabel = ["VBM"];
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"};
var LUMOdata= [[band_obj_all[i]["LUMO_coor"],band_obj_all[i]["LUMO_energy"]]];
var LUMOlabel = ["CBM"];
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"};
//if_show_VBM = check_show_VBM(checkbox_VBM_id);
if (if_show_VBM == 1)
{
band_plotdata.push(plotHOMO);
band_plotdata.push(plotLUMO);
}
//alert(img_band_id + band_plotdata)
//!!!FIXME: if ($("#showVBM:checked").length > 0 && gap > 0.1)
//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" }
var canvas_band;
var options_band = {
canvas: true,
//legend:{ type: "canvas" },
series: { lines: { show: true, lineWidth: 2 },
points: { show: false } },
xaxis: {
ticks: band_obj_all[i]["labels"],
color:"#000",
font: {size: 20},
zoomRange: false,
panRange: false
},
yaxis: {
axisLabel: "Energy (eV)",
axisLabelUseCanvas: true,
//axisLabelUseCanvas: false,
axisLabelFontSizePixels: 20,
axisLabelFontFamily: 'Arial',
axisLabelPadding: 10,
color:"#000",
font: {size: 20, family:"Arial"},
tickLength:-5,
min: lowerLim,
max: upperLim,
tickDecimals: 0,
zoomRange: [0.001, 1000],
panRange: [-100, 100]
},
zoom: {
interactive: true
},
pan: {
interactive: true
},
//selection: { mode: "xy", color: "#86a6b4" },
grid: {
labelMargin: 15,
hoverable: true,
backgroundColor: { colors: ["#fff", "#fff"] },
borderWidth: {
top: 2,
right: 2,
bottom: 2,
left: 2,
color : null }
}
}
//var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);
//var plot_band = $.plot("#div_bandx", band_plotdata, options_band);
var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas
var image_band = plot_band.toDataURL();
image_band = image_band.replace("image/png","image/octet-stream");
//beakerx.image_band = image_band;
document.getElementById(img_band_id).href= image_band;
image_band_links[i] = image_band;
//alert("band done")
}
```
%% Output
%% Cell type:code id: tags:plot_dos
``` python
%%javascript
//alert("tag: plot_dos " + i)
//i=0;
var placeholder_dos = "#div_dos" + i.toString();
var placeholder_tools = "#div_tools" + i.toString();
var placeholder_overview = "#div_overview" + i.toString();
var placeholder_overviewlegend = "#overviewLegend" + i.toString();
var img_dos_id = "img_dos" + i.toString();
//----Plot DOS----------------------
var dos_plotdata = [];
//alert("dos:"+dos_obj_all[i])
var xdos = dos_obj_all[i]["dos_x_axis"];
var ydos = dos_obj_all[i]["dos_y_axis"][0];
var dosLabelPos = Math.max.apply(Math, ydos)/2;
var d2 = [];
for (var ii = 0; ii < xdos.length; ii+=1) {
d2.push([ydos[ii],xdos[ii]]);
}
var plotData2={ shadowSize: 0, color: 'black' , data: d2};
dos_plotdata.push(plotData2);
//alert("dos_plotdata"+JSON.stringify(dos_plotdata[0]));
function find_xaxis_max_min(data, lowerbound, upperbound)
{
//data[xaxis,y] find the max and min value of x axis
//alert("dos[0]:" + data[0]["data"]);
//alert("Bounds: " + lowerbound + " , " + upperbound)
var n_data = data.length;
//alert("N dos: " + n_data);
var data_min = 1000000;
var data_max = -1000000;
var data_current = 0;
for (var i = 0; i < n_data; i++)
{
if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))
{
data_current = data[i][0];
//alert("data[i]: " + data[i] + "data[i][0]: " + data_current);
if(data_current >= data_max)
{
data_max = data_current;
}
if(data_current <= data_min)
{
data_min = data_current;
}
}
}
var data_max_min = [data_max, data_min];
//alert("data_max_min: " + data_max_min);
return data_max_min;
}
var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0]["data"], lowerLim, upperLim);
var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;
//alert("dos_x_max_min:"+dos_x_max_min+", dosLabelPos:"+dosLabelPos);
var options_dos ={
canvas: true,
series: {
lines: { show: true, lineWidth:2 },
points: { show: false }
},
yaxis: {
axisLabel: "",
axisLabelUseCanvas: true,
axisLabelFontSizePixels: 20,
axisLabelFontFamily: 'Arial',
axisLabelPadding: 10,
color:"#000",
font: {size: 20},
tickLength:-5,
min: lowerLim,
max: upperLim,
tickDecimals: 0,
zoomRange: [0.001, 1000],
panRange: [-100, 100]
},
xaxis: {
axisLabel: " ",
axisLabelUseCanvas: false,
axisLabelFontSizePixels: 20,
axisLabelFontFamily: 'Arial',
axisLabelPadding: 3,
color:"rgb(0, 0, 0)",
font: {size: 20, family:"Arial"},
//ticks: 10,
tickLength:0,
min: dos_x_max_min[1],//0,
max: dos_x_max_min[0],//1,
tickDecimals: 0,
ticks: [[ dosLabelPos ,'DOS']],
//tickFormatter: MyFormatter
panRange: false
},
pan: {
interactive: true
},
grid: {
labelMargin: 15,
hoverable: true,
//borderWidth : 1000,
//show : false,
// //backgroundColor: { colors: [ "#fff", "#eee" ] },
backgroundColor: { colors: ["#fff", "#fff"] },
borderWidth: {
top: 2,
right: 2,
bottom: 2,
left: 2,
color : null
}
}
}
var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();
var image_dos = plot_dos.toDataURL();
image_dos = image_dos.replace("image/png","image/octet-stream");
image_dos = image_dos;
document.getElementById(img_dos_id).href= image_dos;
//alert("dos done.")
```
%% Output
%% Cell type:code id: tags:init_jquery
``` python
%%HTML
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
```
%% Output
%% Cell type:code id: tags:init_flot
``` python
%%HTML
<script src="js/jquery.flot.js"></script>
```
%% Output
%% Cell type:code id: tags:init_flot_axislabels
``` python
%%HTML
<script src="js/jquery.flot.axislabels.js"></script>
```
%% Output
%% Cell type:code id: tags:init_flot_navigate
``` python
%%HTML
<script src="js/jquery.flot.navigate.js"></script>
```
%% Output
%% Cell type:code id: tags:init_flot_selection
``` python
%%HTML
<script src="js/jquery.flot.selection.js"></script>
```
%% Output
%% Cell type:code id: tags:js_query_beforeafter
``` python
%%javascript
//jquery.beforeafter.min.js
!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
},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>'),
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"),
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){
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,
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;
}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+"%")),
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");
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%"
},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()})),
i.data("reset-timer",!1)},t.reset_delay),i.data("reset-timer",a)))})}),this}}(jQuery);
```
%% Output
%% Cell type:code id: tags:js_compare_slide
``` python
%%javascript
var div_str = '';
div_str +='<img src = \"'
var src1 = image_band_links_selected[0];
var src2 = image_band_links_selected[1];
div_str +=src1;
div_str += '\" height=\"600\" width=\"400\" >';
document.getElementById("div_compare_containerx1").innerHTML = div_str;
div_str ='<img src= \"'
div_str +=src2;
//div_str += '\"></div>';
div_str += '\" height=\"600\" width=\"400\">';
//#div_compare_containerx
document.getElementById("div_compare_containerx2").innerHTML = div_str;
//$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});
//$('#div_compare_containerx').beforeafter({drag_horizontal: false, split_horizontal: false});
//beakerx.image_band_links[i]
```
%% Output
%% Cell type:code id: tags:process_band_dos_data_python
``` python
#tag:python_2
import urllib.request, json
import numpy as np
import math
#======Define global objs============
info_all = []
band_obj_all = []
dos_obj_all = []
def load_jsonfile(path):
#with open(path, encoding='utf-8') as band_file:
# return json.load(band_file)
with urllib.request.urlopen(path) as url:
data = json.loads(url.read().decode())
return data
#-----Get the labels for x axis---------------
def get_label_flag(coor_array):
#np.sort(coor_array)
x = coor_array[0]
y = coor_array[1]
z = coor_array[2]
coor =np.sort([x,y,z])
xx = coor[0]
yy = coor[1]
zz = coor[2]
coor = [xx, yy, zz]
#pprint(coor)
if (coor == [0, 0.5, 0.5]):
return "X"
if (coor == [0, 0.0, 0.5]):
return "M"
elif (coor == [0.5, 0.5, 0.5]):
return "L"
elif (coor == [0.375, 0.375, 0.75]):
return "K"
elif (coor == [0.25, 0.5, 0.75]):
return "W"
elif (coor == [0, 0, 0]):
return "\u0393"
elif (coor == [0.25, 0.625, 0.625]):
return "U"
else:
return "?"
#============Process the band structure data============
def get_band_obj(band_path, dos_fermi_energy):
#band_data: read from json file
#Load the data files for band
band_data = load_jsonfile(band_path)
#---------Read section_k_band_segment------------
section_k_band_segment = band_data['section_run']['section_single_configuration_calculation']['section_k_band'][0]['section_k_band_segment']
#--------Get the number of k band segments-------------
N_k_band_segments = len(section_k_band_segment)
#----------Get the total number of k points in all segments---------
N_k_points_all = 0
for i in range(N_k_band_segments):
band_k_points = section_k_band_segment[i]['band_k_points']
N_k_points_all = N_k_points_all + len(band_k_points)
#--------Get the x axis for the band structure figure: the coordinates of k points in 1D
# store in k_coor_1D[N_k_points_total]-----------------
band_distance_segments = np.zeros(N_k_band_segments)
for i in range(N_k_band_segments):
[[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]],
band_distance_segments[i] = math.pow((x1-x2), 2) + math.pow((y1-y2), 2) + math.pow((z1-z2), 2)
band_distance_total = math.fsum(band_distance_segments)
#print(band_distance_segments)
average_N_k_points_per_inverse_distance = N_k_points_all / band_distance_total
#Prepare the parameters to rescale the k coordinates into [0,1]
step_k_point = 1.0 / N_k_points_all
step_k_point = (1.0 + step_k_point) / N_k_points_all
#
k_coor_1D = np.zeros((N_k_points_all))
for i_k_points in range(N_k_points_all):
k_coor_1D[i_k_points] = round( step_k_point * i_k_points, 3)
#for i in range(N_k_band_segments):
# ki[i] =
#--------Get the eigenvalues of each band trajectory--------------
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_bands = len(section_k_band_segment[0]['band_energies'][0][0])
band_energies_all = np.zeros((N_bands, N_k_points_all)) #store the eigenvalues
N_k_points_all = 0
for i_segments in range(N_k_band_segments):
band_energies = section_k_band_segment[i_segments]['band_energies']
N_spin_channel = len(band_energies) #Number of the spin channel --FIXME: no spin polarized
N_k_points_per_segment = len(band_energies[0])
for i_k_points in range(N_k_points_per_segment):
for i_bands in range(N_bands):
band_energies_all[i_bands][N_k_points_all] = band_energies[0][i_k_points][i_bands] / (1.60217656535 * pow(10, -19))
N_k_points_all = N_k_points_all + 1
N_labels = 0
for i_segments in range(N_k_band_segments):
for j in range(2):
labels_tmp = section_k_band_segment[i_segments]['band_segm_start_end'][j];
N_labels = N_labels + 1
label_flag = ["" for i in range(N_labels)] #stores the flags of the labels (X, W, G, etc)
i_label = 0
label_flag_last_final = ""
label_flag_current_initial = ""
for i_segments in range(N_k_band_segments):
labels_coor_0 = section_k_band_segment[i_segments]['band_segm_start_end'][0];
labels_coor_1 = section_k_band_segment[i_segments]['band_segm_start_end'][1];
np.sort(labels_coor_0)
np.sort(labels_coor_1)
label_flag_0 = get_label_flag(labels_coor_0)
label_flag_1 = get_label_flag(labels_coor_1)
label_flag_current_initial = label_flag_0
if(label_flag_last_final == ""):
label_flag_last_final = label_flag_0
if(label_flag_last_final == label_flag_current_initial):
label_flag[i_label] = label_flag_current_initial
else:
label_flag[i_label] = "".join([label_flag_last_final, '|', label_flag_current_initial])
label_flag_last_final = label_flag_1
i_label = i_label + 1
if(i_segments == N_k_band_segments - 1):
label_flag[i_label] = label_flag_1
i_label = i_label + 1
N_labels = i_label
#------------Get the coordinates for the labels------------
#label_coor_abs = np.zeros((N_labels)) #stores the absolute coordinates of the labels
label_coor_relative = np.zeros((N_labels))
for i_label in range(N_labels):
#Here the evenly-distributed relative coordinates is used, because the coordinates of the labels could be too nerrow when using there absolute coordinates
#x = labels_coor_0[0]
#y = labels_coor_0[1]
#z = labels_coor_0[2]
#label_coor_abs[i_label] = np.sqrt(x*x+y*y+z*z)
label_coor_relative[i_label] = step_k_point * N_k_points_per_segment * i_label / (1 + 1.0 / N_k_points_all);
#----Store the label-----------
label_obj =[['' for i in range(2)] for j in range(N_labels)]
for i_label in range(N_labels):
label_obj[i_label][0] = label_coor_relative[i_label]
label_obj[i_label][1] = label_flag[i_label]
#print(label_obj)
#Rescal the energies with respect to dos_fermi_energy
for i_k_points in range(N_k_points_all):
for i_bands in range(N_bands):
band_energies_all[i_bands][i_k_points] = band_energies_all[i_bands][i_k_points] - dos_fermi_energy
#-------Get VBM, CBM----------------
HOMO = -1000
LUMO = 1000
coor_k_point_HOMO = np.zeros((3)) #the coordinate of k point that stores HOMO
coor_k_point_LUMO = np.zeros((3)) #the coordinate of k point that stores LUMO
#band_gap_direct = 0.0
band_gap_indirect = 0.0
#band_energy_max = np.amax(band_energies[0])/ (1.60217656535* pow(10,-19))
#band_energy_min = np.amin(band_energies[0])/ (1.60217656535* pow(10,-19))
band_energy_max = 10
band_energy_min = -10
#N_band_energy_index = 10000
#band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index
#N_allowed_states = np.zeros(N_band_energy_index + 1)
#i_index_fermi = math.floor((0 - band_energy_min) / band_energy_step) #the index that stores states at the Fermi level
for i_k_points_all in range(N_k_points_all):
for i_bands in range(N_bands):
#i_band_index = math.floor((band_energies_all[i_bands][i_k_points_all] - band_energy_min) / band_energy_step)
#N_allowed_states[index_band_energy] = N_allowed_states[index_band_energy] + 1
band_energy = band_energies_all[i_bands][i_k_points_all]
if(band_energy > 0):
if(band_energy < LUMO):
LUMO = band_energy
else:
if(band_energy > HOMO):
HOMO = band_energy
#for i_band_index in range(i_index_fermi, N_band_energy_index): #get LUMO
# if(N_allowed_states[i_band_index] > 0):
# LUMO = band_energy_min + band_energy_step * i_band_index
print('HOMO, LUMO: ',HOMO, LUMO)
band_gap_indirect = abs(LUMO - HOMO)
if(band_gap_indirect < 0.5): #VBM and CBM has to be found in another way for metals/charged system:
HOMO = -1000
LUMO = 1000
band_energy_max = 10
band_energy_min = 0
N_band_energy_index = 10000
band_energy_step = (band_energy_max - band_energy_min) / N_band_energy_index
N_allowed_states = np.zeros(N_band_energy_index + 1)
#get the DOS and store in N_allowed_states[]
for i_k_points_all in range(N_k_points_all):
for i_bands in range(N_bands):
band_energy = band_energies_all[i_bands][i_k_points_all]
if(band_energy_min < band_energy < band_energy_max):
i_band_index = math.floor((band_energy - band_energy_min) / band_energy_step)
N_allowed_states[i_band_index] = N_allowed_states[i_band_index] + 1
if_gapped = 0
for i_band_index in range(N_band_energy_index): #go through the energy levels from the bottom
band_energy = band_energy_min + band_energy_step * i_band_index
if(N_allowed_states[i_band_index] == 0):
if_gapped = if_gapped + 1
if(band_energy > band_energy_max - 0.5) and (if_gapped == 0):
print("No gap found in this system. It seems to be a metal.")
HOMO = 1000
LUMO = 1000
break
#print("At ", band_energy,": # allowed states = ", N_allowed_states[i_band_index]," if_gapped = ", if_gapped)
if(N_allowed_states[i_band_index] > 0):
if(if_gapped * band_energy_step> 0.3 ): #above VBM-CBM gap: LUMO
if(band_energy < LUMO):
#print("LUMO got!")
LUMO = band_energy
break #break before touching another gap that is above the band gap
if(if_gapped * band_energy_step < 0.3): #below VBM-CBM gap: HOMO
if(band_energy > HOMO):
#print("HOMO got!")
HOMO = band_energy
if_gapped = 0
print('HOMO, LUMO for metal/charged system: ',HOMO, LUMO)
'''
# print('HOMO: ',tmp_HOMO_max)
HOMO_global = tmp_HOMO_max
LUMO_global = tmp_LUMO_min
band_gap_indirect = LUMO_global - HOMO_global
E_top_valence = HOMO_global
if(band_gap_indirect < 0):
band_gap_indirect = 0
#Rescal HOMO and LUMO with respect to HOMO
HOMO_global = round((HOMO_global - E_top_valence), 3)
LUMO_global = round((LUMO_global - E_top_valence), 3)
'''
#Find the position of HOMO, LUMO
for i_k_points in range(N_k_points_all):
for i_bands in range(N_bands):
if(abs(band_energies_all[i_bands][i_k_points] - HOMO) < 0.001):
coor_k_point_HOMO = k_coor_1D[i_k_points]
if(abs(band_energies_all[i_bands][i_k_points] - LUMO) < 0.001):
coor_k_point_LUMO = k_coor_1D[i_k_points]
#Store the band data to band_obj
band_obj = {}
band_obj["band_x_axis"] = np.array(k_coor_1D).tolist()
band_obj["band_y_axis"] = np.array(band_energies_all).tolist()
band_obj["labels"] = np.array(label_obj).tolist()
band_obj["HOMO_energy"] = np.array(HOMO).tolist()
band_obj["HOMO_coor"] = np.array(coor_k_point_HOMO).tolist()
band_obj["LUMO_energy"] = np.array(LUMO).tolist()
band_obj["LUMO_coor"] = np.array(coor_k_point_LUMO).tolist()
band_obj["average_N_k_points_per_inverse_distance"] = np.array(average_N_k_points_per_inverse_distance).tolist()
return band_obj
#===============Get the space group information===========
def get_space_group(band_data):
import pymatgen as mg
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
simulation_cell = np.array(band_data["section_run"]["section_system"][0].get('simulation_cell',"empty")) * 10000000000
atom_positions = np.array(band_data["section_run"]["section_system"][0].get('atom_positions',"empty")) * 10000000000
atom_labels = np.array(band_data["section_run"]["section_system"][0].get('atom_labels',"empty"))
structure = mg.Structure(simulation_cell,atom_labels, atom_positions, coords_are_cartesian = True)
finder = SpacegroupAnalyzer(structure, symprec=1e-3, angle_tolerance=5)
space_group_symbol = finder.get_space_group_symbol()
lattice_constant = []
for item in structure.lattice.abc:
lattice_constant.append(item)
for i in range(len(lattice_constant)):
item = str(round(lattice_constant[i], 3))
lattice_constant[i] = item
return [space_group_symbol, lattice_constant]
#================Get the DOS data==============================
def get_dos_obj(dos_path):
#dos_data: read from json file
#Load the data files for dos
dos_data = load_jsonfile(dos_path)
print(dos_path)
#N_dos_values = len(dos_data['sections']['section_run-0']['sections']['section_single_configuration_calculation-0']['section_dos'][0]['dos_energies'])
N_dos_values = len(dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies'])
#in new parser, it seems that the spin channel of 'dos_energies' disappears: Shape: [ number_of_dos_values ]
dos_energies = np.zeros((N_dos_values))
dos_energies_tmp = np.zeros((N_dos_values)) #tmp array for unit convertion
dos_values = np.zeros((N_dos_values))
dos_energies_tmp = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_energies']
dos_values = dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0]['dos_values'][0]
dos_fermi_energy= dos_data['section_run']['section_single_configuration_calculation']['section_dos'][0].get('dos_fermi_energy',"empty")
if(dos_fermi_energy == "empty"): #dos_fermi_energy is not available in EXCITING
dos_fermi_energy_exciting = dos_data['section_run']['section_single_configuration_calculation'].get('x_exciting_dos_fermi',"empty")
if(dos_fermi_energy_exciting == "empty"):
dos_fermi_energy = 0
else:
dos_fermi_energy = dos_fermi_energy_exciting / (1.60217656535 * pow(10,-19))
else:
dos_fermi_energy = dos_fermi_energy / (1.60217656535 * pow(10,-19))
print("dos_fermi_energy:", dos_fermi_energy)
for i_dos_values in range(N_dos_values):
dos_energies[i_dos_values] = 0.0
dos_energies[i_dos_values] = dos_energies_tmp[i_dos_values] / (1.60217656535 * pow(10,-19))
dos_energies[i_dos_values] = round((dos_energies[i_dos_values] - dos_fermi_energy), 3) #reference with the fermi level
dos_obj = {}
dos_obj["dos_x_axis"] = np.array(dos_energies).tolist()
dos_obj["dos_y_axis"] = np.array(dos_values).tolist()
dos_obj["dos_fermi_energy"] = np.array(dos_fermi_energy).tolist()
return dos_obj
def get_info_obj(band_path):
#band_data: read from json file
#Load the data files for band
band_data = load_jsonfile(band_path)
info_obj = {}
#---------Read the information of the calculation--------
info_obj["program_name"] = band_data["section_run"]["program_name"];
info_obj["program_basis_set_type"] = band_data["section_run"]["program_basis_set_type"];
info_obj["atom_labels"] = band_data["section_run"]["section_system"][0]["atom_labels"];
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"];
#----------Get the space group information----------
[space_group_symbol, lattice_constant] = get_space_group(band_data)
info_obj["space_group_symbol"] = np.array(space_group_symbol).tolist()
info_obj["lattice_constant"] = np.array(lattice_constant).tolist()
print("space group:", info_obj["space_group_symbol"])
print("lattice_constant:", lattice_constant)
return info_obj
#============main===========================================
#import matplotlib.pyplot as plt
band_obj_all = []
dos_obj_all = []
info_obj_all = []
print("Number of materials: ", N_materials)
for i in range (N_materials):
print("Material: ", i)
band_path = band_paths[i]
dos_path = dos_paths[i]
dos_obj = get_dos_obj(dos_path)
dos_fermi_energy = dos_obj["dos_fermi_energy"]
band_obj = get_band_obj(band_path, dos_fermi_energy)
info_obj = get_info_obj(band_path)
band_obj_all.append(band_obj)
dos_obj_all.append(dos_obj)
info_obj_all.append(info_obj)
print("average_N_k_points_per_inverse_distance: ", band_obj["average_N_k_points_per_inverse_distance"])
print("Finish processing data.")
#run_cell_by_tag('save_data_to_js')
print("Initialization of visulization finished.")
```
%% Cell type:code id: tags:js_plot
``` python
%%javascript
var N_max_show = 10; //Number of results to be shown by default
```
%% Output
%% Cell type:code id: tags:
``` python
```
%% Cell type:code id: tags:
``` python
%%javascript
// BACKUP!
/*
//Main plot function for given material:
function plot_band_dos_i_backup(i, lowerLim, upperLim, if_show_VBM, if_compare, i_in_compare_list)
{
//alert("plot_band_dos_i")
//i=0;
lowerLim = -10
upperLim = 10
if_show_VBM = 0
if_compare = 0
i_in_compare_list = -1
//i=0;
var placeholder_band = "#div_band" + i.toString();
var placeholder_dos = "#div_dos" + i.toString();
var placeholder_tools = "#div_tools" + i.toString();
var placeholder_overview = "#div_overview" + i.toString();
var placeholder_overviewlegend = "#overviewLegend" + i.toString();
var checkbox_VBM_id = "checkbox_VBM" + i.toString();
var img_band_id = "img_band" + i.toString();
var img_dos_id = "img_dos" + i.toString();
var placeholder_band_compare = "";
if(i_in_compare_list == 1)
{
placeholder_band_compare = "#div_band_compare_1";
}
else if(i_in_compare_list == 2)
{
placeholder_band_compare = "#div_band_compare_2";
}
else
{
placeholder_band_compare = "#div_band_compare_1"; // just for safe
}
Object.size = function(obj) {
var size = 0, key;
for (key in obj)
{
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
//Get the number of bands
//alert("Getting band")
//alert(band_obj_all)
//alert("band_obj_all got!")
var N_bands = Object.size(band_obj_all[i]["band_y_axis"]);
var N_k_coors = Object.size(band_obj_all[i]["band_x_axis"]);
//alert(band_obj_all[i]["band_y_axis"])
band_plotdata = [];
for(var i_band =0; i_band < N_bands; i_band++)
{
var tmp_data = [];
for(var j_k_coor = 0; j_k_coor < N_k_coors; j_k_coor ++)
{
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]]);
}
plotData = { shadowSize: 0 , data: tmp_data, color: 'black', series: { lines: { show: true } , points: {show: false} } };
band_plotdata.push(plotData);
}
var tmp_data0 = [[0, 0], [1, 0]];
plotData0 = { shadowSize:0, color: 'black', data: tmp_data0, dashes:{ show:true, lineWidth: 1.5}};
band_plotdata.push(plotData0);
band_plotdata_overview = band_plotdata.slice(0);
var HOMOdata= [[band_obj_all[i]["HOMO_coor"],band_obj_all[i]["HOMO_energy"]]];
HOMOlabel = ["VBM"];
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"};
var LUMOdata= [[band_obj_all[i]["LUMO_coor"],band_obj_all[i]["LUMO_energy"]]];
LUMOlabel = ["CBM"];
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"};
//if_show_VBM = check_show_VBM(checkbox_VBM_id);
if (if_show_VBM == 1)
{
band_plotdata.push(plotHOMO);
band_plotdata.push(plotLUMO);
}
alert(img_band_id + band_plotdata)
//!!!FIXME: if ($("#showVBM:checked").length > 0 && gap > 0.1)
//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" }
var canvas_band;
var options_band = {
canvas: true,
//legend:{ type: "canvas" },
series: { lines: { show: true, lineWidth: 2 },
points: { show: false } },
xaxis: {
ticks: band_obj_all[i]["labels"],
color:"#000",
font: {size: 20},
zoomRange: false,
panRange: false
},
yaxis: {
axisLabel: "Energy (eV)",
axisLabelUseCanvas: true,
//axisLabelUseCanvas: false,
axisLabelFontSizePixels: 20,
axisLabelFontFamily: 'Arial',
axisLabelPadding: 10,
color:"#000",
font: {size: 20, family:"Arial"},
tickLength:-5,
min: lowerLim,
max: upperLim,
tickDecimals: 0,
zoomRange: [0.001, 1000],
panRange: [-100, 100]
},
zoom: {
interactive: true
},
pan: {
interactive: true
},
//selection: { mode: "xy", color: "#86a6b4" },
grid: {
labelMargin: 15,
hoverable: true,
backgroundColor: { colors: ["#fff", "#fff"] },
borderWidth: {
top: 2,
right: 2,
bottom: 2,
left: 2,
color : null }
}
}
//var plot_band = $.plot($(placeholder_band), band_plotdata, options_band);
//var plot_band = $.plot("#div_bandx", band_plotdata, options_band);
var plot_band = $.plot($(placeholder_band), band_plotdata, options_band).getCanvas(); // save the canvas
image_band = plot_band.toDataURL();
image_band = image_band.replace("image/png","image/octet-stream");
//beakerx.image_band = image_band;
document.getElementById(img_band_id).href= image_band;
image_band_links[i] = image_band;
alert("band plot done.")
//----Plot DOS----------------------
var dos_plotdata = [];
alert("dos:"+dos_obj_all[i])
var xdos = dos_obj_all[i]["dos_x_axis"];
var ydos = dos_obj_all[i]["dos_y_axis"];
var dosLabelPos = Math.max.apply(Math, ydos)/2;
var d2 = [];
for (var ii = 0; ii < xdos.length; ii+=1) {
d2.push([ydos[ii],xdos[ii]]);
}
var plotData2={ shadowSize: 0, color: 'black' , data: d2}
dos_plotdata.push(plotData2)
function find_xaxis_max_min(data, lowerbound, upperbound)
{
//data[xaxis,y] find the max and min value of x axis
//alert("dos[0]:" + data[0]["data"]);
//alert("Bounds: " + lowerbound + " , " + upperbound)
var n_data = data.length;
//alert("N dos: " + n_data);
var data_min = 1000000;
var data_max = -1000000;
var data_current = 0;
for (var i = 0; i < n_data; i++)
{
if((data[i][1] >= lowerbound) && (data[i][1] <= upperbound))
{
data_current = data[i][0];
//alert("data[i]: " + data[i] + "data[i][0]: " + data_current);
if(data_current >= data_max)
{
data_max = data_current;
}
if(data_current <= data_min)
{
data_min = data_current;
}
}
}
var data_max_min = [data_max, data_min];
//alert("data_max_min: " + data_max_min);
return data_max_min;
}
var dos_x_max_min = find_xaxis_max_min(dos_plotdata[0]["data"], lowerLim, upperLim);
var dosLabelPos = (dos_x_max_min[0] + dos_x_max_min[1])/2;
var options_dos ={
canvas: true,
series: {
lines: { show: true, lineWidth:2 },
points: { show: false }
},
yaxis: {
axisLabel: "",
axisLabelUseCanvas: true,
axisLabelFontSizePixels: 20,
axisLabelFontFamily: 'Arial',
axisLabelPadding: 10,
color:"#000",
font: {size: 20},
tickLength:-5,
min: lowerLim,
max: upperLim,
tickDecimals: 0,
zoomRange: [0.001, 1000],
panRange: [-100, 100]
},
xaxis: {
axisLabel: " ",
axisLabelUseCanvas: false,
axisLabelFontSizePixels: 20,
axisLabelFontFamily: 'Arial',
axisLabelPadding: 3,
color:"rgb(0, 0, 0)",
font: {size: 20, family:"Arial"},
//ticks: 10,
tickLength:0,
min: dos_x_max_min[1],//0,
max: dos_x_max_min[0],//1,
tickDecimals: 0,
ticks: [[ dosLabelPos ,'DOS']],
//tickFormatter: MyFormatter
panRange: false
},
pan: {
interactive: true
},
grid: {
labelMargin: 15,
hoverable: true,
//borderWidth : 1000,
//show : false,
// //backgroundColor: { colors: [ "#fff", "#eee" ] },
backgroundColor: { colors: ["#fff", "#fff"] },
borderWidth: {
top: 2,
right: 2,
bottom: 2,
left: 2,
color : null
}
}
}
var plot_dos = $.plot(placeholder_dos, dos_plotdata, options_dos).getCanvas();
var image_dos = plot_dos.toDataURL();
image_dos = image_dos.replace("image/png","image/octet-stream");
image_dos = image_dos;
document.getElementById(img_dos_id).href= image_dos;
}
*/
```
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment