2019-09-28 15:23:25 +02:00
---
title: "Multiple dataset"
date: 2019-09-27 16:41
draft: false
---
2019-10-07 12:10:45 +02:00
< link rel = "stylesheet" type = "text/css" href = "/css/modal.css" / >
2019-10-10 10:40:34 +02:00
< link rel = "stylesheet" type = "text/css" href = "/css/form.css" / >
2019-12-29 20:00:13 +01:00
< link rel = "stylesheet" type = "text/css" href = "/css/table.css" / >
2019-10-07 10:23:21 +02:00
< script src = "/js/data.js" type = "text/javascript" > < / script >
< script src = "/js/loadAllData.js" type = "text/javascript" > < / script >
< script src = "/js/getFullDataPath.js" type = "text/javascript" > < / script >
< script src = "/js/getTextFromFile.js" type = "text/javascript" > < / script >
< script src = "/js/trueTypeOf.js" type = "text/javascript" > < / script >
< script src = "/js/uniq.js" > < / script >
2019-10-07 11:22:44 +02:00
< script src = "/js/processingIndicator.js" > < / script >
2019-10-07 10:23:21 +02:00
< script src = "/js/noNan.js" > < / script >
< script src = "/js/websiteFile.js" > < / script >
2019-11-27 18:29:29 +01:00
< script src = "/js/getSets.js" > < / script >
2019-09-28 15:23:25 +02:00
< script src = "https://cdn.rawgit.com/larsgw/citation.js/archive/citation.js/citation-0.4.0-9.js"
type="text/javascript">< / script >
2019-11-02 15:53:53 +01:00
< script src = "/js/DOICache.js" > < / script >
2019-09-29 15:58:34 +02:00
< script src = "https://unpkg.com/simple-statistics@7.0.2/dist/simple-statistics.min.js" > < / script >
2019-09-28 15:23:25 +02:00
< script >
2019-10-09 20:10:48 +02:00
window.onload = async () => {
2019-11-02 15:53:53 +01:00
window.doiCache = new DOICache()
2019-10-09 20:10:48 +02:00
$('#form_dat > fieldset > input[type=radio]').on('change', async function (event) {
processingIndicator.isActive = true
$("#Geom_th,#GSGeom_th,#ESGeom_th").each(function () {
$(this).attr("hidden", true)
2019-10-09 17:53:10 +02:00
})
2019-09-28 15:23:25 +02:00
var result = $(this).val();
2019-10-09 20:10:48 +02:00
var proms = [];
2019-09-28 15:23:25 +02:00
switch (result) {
case "abs":
2019-10-09 20:10:48 +02:00
proms = getAbsFilesName().map((f) => AbsDataFile.loadAsync(f));
$("#Geom_th").attr("hidden", false)
2019-09-28 15:23:25 +02:00
break;
case "fluo":
2019-10-09 20:10:48 +02:00
proms = getFluoFilesName().map((f) => FluoDataFile.loadAsync(f));
$("#Geom_th").attr("hidden", false)
2019-09-28 15:23:25 +02:00
break;
case "zpe":
2019-10-09 20:10:48 +02:00
proms = getZPEFilesName().map((f) => ZPEDataFile.loadAsync(f));
$("#GSGeom_th,#ESGeom_th").each(function () {
$(this).attr("hidden", false)
2019-10-09 17:53:10 +02:00
})
2019-09-28 15:23:25 +02:00
break;
}
2019-10-09 20:10:48 +02:00
window.dats = await Promise.all(proms)
processingIndicator.isActive = false
2019-10-02 19:20:37 +02:00
reloadFileSelector()
await reloadSelect()
2019-09-28 15:23:25 +02:00
})
}
2019-10-09 20:10:48 +02:00
function reloadFileSelector() {
$("#customFiles_input").attr("value", "").attr("disabled", false)
2019-10-02 19:20:37 +02:00
}
2019-10-09 20:10:48 +02:00
async function reloadSelect() {
processingIndicator.isActive = true
radioval = $('#form_dat > fieldset > input[name=datatype]:checked').val();
const files = $("#customFiles_input")[0].files
for (file of [...files]) {
2019-10-02 19:20:37 +02:00
switch (radioval) {
case "abs":
2019-10-09 20:10:48 +02:00
var dat = await AbsDataFile.loadAsync(file)
2019-10-02 19:20:37 +02:00
window.dats.push(dat)
break;
case "fluo":
2019-10-09 20:10:48 +02:00
dat = await FluoDataFile.loadAsync(file)
2019-10-02 19:20:37 +02:00
window.dats.push(dat)
break;
case "ZPE":
2019-10-09 20:10:48 +02:00
dat = await ZPEDataFile.loadAsync(file)
2019-10-02 19:20:37 +02:00
window.dats.push(dat)
break;
}
}
2019-10-10 09:49:39 +02:00
$('#form_dat > fieldset > div > select,#sel_ref').each(function () {
2019-09-28 15:23:25 +02:00
$(this).find('option[value!=""]').remove()
2019-10-10 09:49:39 +02:00
})
2019-11-27 18:29:29 +01:00
$('#form_dat > fieldset > div > select').each(async function () {
2019-10-09 20:10:48 +02:00
const vals = uniq(window.dats.map((d) => { return d[$(this).attr("name")] }))
2019-11-27 18:29:29 +01:00
var sets=await getSets()
2019-10-09 20:10:48 +02:00
for (const val of vals) {
2019-11-27 18:29:29 +01:00
var op=$("< option / > ", {
2019-10-09 20:10:48 +02:00
value: JSON.stringify(val)
2019-11-27 18:29:29 +01:00
})
if ($(this).attr("name")=="DOI" & & sets.has(val.toString())){
$(op).text(sets.get(val.toString()))
}
else{
$(op).text(val.toString())
}
op.appendTo(this)
2019-10-09 17:53:10 +02:00
}
2019-09-28 15:23:25 +02:00
})
2019-10-07 14:19:01 +02:00
$('#form_dat > input[type="submit"').prop('disabled', false);
2019-10-09 20:10:48 +02:00
processingIndicator.isActive = false
2019-10-02 19:20:37 +02:00
await reloadContent()
2019-09-28 15:23:25 +02:00
}
2019-10-09 20:10:48 +02:00
async function reloadStat() {
processingIndicator.isActive = true
var stb = $("#stat_table > tbody")
2019-10-09 17:53:10 +02:00
$("#graph_div").empty()
$(stb).empty()
2019-10-09 20:10:48 +02:00
var refstr = $("#sel_ref option:selected").val()
var sdatdic = new Map()
2019-10-01 14:37:26 +02:00
for (const d of window.filt) {
2019-10-09 20:10:48 +02:00
const key = JSON.stringify([d.code, d.method, d.DOI])
if (!(sdatdic.has(key))) {
sdatdic.set(key, new Map())
2019-10-01 14:37:26 +02:00
}
2019-10-09 20:10:48 +02:00
for (const exc of d.excitations) {
const key2 = JSON.stringify([d.molecule, exc.initial, exc.final])
const keydic = sdatdic.get(key)
if (!(keydic.has(key2))) {
keydic.set(key2, [])
2019-10-01 14:37:26 +02:00
}
2019-12-09 14:35:14 +01:00
keydic.get(key2).push(exc.correctedValue)
2019-10-09 20:10:48 +02:00
}
2019-10-01 14:37:26 +02:00
}
2019-10-09 20:10:48 +02:00
var sdic = new Map()
for (const [key, sdat] of sdatdic) {
for (const [key2, exval] of sdat) {
if (!(sdic.has(key))) {
sdic.set(key, [])
2019-10-01 14:37:26 +02:00
}
2019-10-09 20:10:48 +02:00
sdic.get(key).push(exval - ((sdatdic.has(refstr)) ? sdatdic.get(refstr).get(key2) : NaN))
2019-10-01 14:37:26 +02:00
}
}
2019-10-08 11:47:48 +02:00
sdic.delete(refstr)
2019-10-09 20:10:48 +02:00
var graphdat = []
for (const [keystr, vals] of sdic) {
row = $("< tr / > ")
key = JSON.parse(keystr)
2019-10-06 17:53:49 +02:00
key.shift()
Reflect.setPrototypeOf(key[0], method.prototype)
2019-11-02 15:10:57 +01:00
Reflect.setPrototypeOf(key[1], DOI.prototype)
2019-10-09 20:10:48 +02:00
for (const el of key) {
2019-12-29 20:00:13 +01:00
var td = $("< td / > ")
2019-11-02 16:21:11 +01:00
if (trueTypeOf(el) == DOI.name) {
2019-11-02 15:53:53 +01:00
var publi = doiCache.get(el.string)
2019-11-27 18:29:29 +01:00
const sets=await getSets()
if(sets.has(el.toString())){
$(td).append(sets.get(el.toString()))
}
2019-10-09 20:10:48 +02:00
$("< a / > ", {
href: el.url,
target: "_blank"
2019-10-09 17:53:10 +02:00
}).html(publi.format('citation', {
2019-10-09 20:10:48 +02:00
format: 'html',
lang: 'en-US'
2019-10-09 17:53:10 +02:00
})).appendTo(td)
2019-10-01 14:37:26 +02:00
}
2019-10-09 20:10:48 +02:00
else {
2019-10-09 17:53:10 +02:00
$(td).text(el)
2019-10-01 14:37:26 +02:00
}
2019-10-09 17:53:10 +02:00
$(row).append(td)
2019-10-01 14:37:26 +02:00
}
2019-11-21 09:55:21 +01:00
const noNanVals=(vals.every((v)=> Number.isNaN(v)))? vals : (vals.filter((v) => !Number.isNaN(v)))
2019-10-09 20:10:48 +02:00
const avals = noNanVals.map(v => Math.abs(v))
for (const val of [ss.min(noNanVals), ss.max(noNanVals), ss.mean(noNanVals), ss.mean(avals), ss.median(noNanVals), ss.median(avals), ss.rootMeanSquare(noNanVals), ss.variance(noNanVals), ss.standardDeviation(noNanVals)]) {
$("< td / > ").text(noNanPrecision(val, 3)).appendTo(row)
2019-10-01 14:37:26 +02:00
}
2019-10-09 17:53:10 +02:00
$(stb).append(row)
2019-10-04 11:03:30 +02:00
var box = {
2019-10-09 20:10:48 +02:00
x: noNanVals,
amean: ss.mean(avals).toFixed(3),
name: key[0].toString() + " MAD : " + ss.mean(avals).toPrecision(4),
type: 'box',
boxmean: 'sd'
2019-10-04 11:03:30 +02:00
};
graphdat.push(box)
2019-10-01 14:37:26 +02:00
}
2019-10-04 11:03:30 +02:00
var layout = {
2019-10-09 20:10:48 +02:00
paper_bgcolor: 'rgba(0,0,0,0)',
plot_bgcolor: 'rgba(0,0,0,0)',
gap: 0,
legend: {
traceorder: 'reversed',
},
xaxis: {
title: {
text: 'Energy (eV)',
}
},
bgcolor: '#E2E2E2',
bordercolor: '#FFFFFF',
borderwidth: 2,
// autosize: false,
width: 850,
height: 500,
margin: {
l: 0,
r: 10,
b: 15,
t: 20,
pad: 0,
},
2019-10-04 11:03:30 +02:00
}
Plotly.newPlot('graph_div', graphdat, layout);
2019-10-09 20:10:48 +02:00
processingIndicator.isActive = false
2019-10-01 14:37:26 +02:00
}
2019-10-09 20:10:48 +02:00
async function reloadContent() {
2019-11-02 15:53:53 +01:00
doiCache.clear()
2019-10-09 20:10:48 +02:00
processingIndicator.isActive = true
const LatexInline = ['\\(', '\\)']
window.filt = window.dats
$('#form_dat > fieldset > div > select').each(function () {
const prop = $(this).attr("name")
const values = $(this).val()
window.filt = window.filt.filter((d) => {
if (typeof values == "undefined" || values == null) {
return false
2019-09-28 15:23:25 +02:00
}
2019-09-28 16:41:32 +02:00
return values.includes(JSON.stringify(d[prop]))
2019-09-28 15:23:25 +02:00
})
})
2019-10-09 20:10:48 +02:00
var dtb = $("#dat_table > tbody");
2019-10-09 17:53:10 +02:00
dtb.empty()
2019-10-09 20:10:48 +02:00
sel_ref = $("#sel_ref")
2019-11-02 15:53:53 +01:00
await doiCache.addRange(window.filt.map((x)=>x.DOI.string))
2019-12-10 09:11:04 +01:00
for (const el of uniq(window.filt.map(d=>[d.code,d.method,d.DOI])))
2019-12-09 15:12:09 +01:00
{
2019-12-10 09:11:04 +01:00
op=$("< option / > ", {
2019-12-09 14:51:59 +01:00
value: JSON.stringify(el)
2019-12-10 09:11:04 +01:00
}).text(el[1])
if(el[1].name=="TBE"){
$(sel_ref).prepend(op)
}
else
{
$(sel_ref).append(op)
}
2019-12-09 14:51:59 +01:00
}
2019-12-10 09:11:04 +01:00
sel_ref.selectedIndex=0;
2019-10-01 14:37:26 +02:00
for (const d of window.filt) {
2019-10-09 20:10:48 +02:00
var row = $("< tr / > ")
var rowd = []
const els = [d.molecule, d.comment, d.code, d.method, d.DOI]
var tableels = els.slice()
if (d instanceof oneStateDataFileBase) {
tableels.splice(3, 0, d.geometry)
2019-10-07 09:51:53 +02:00
}
2019-10-09 20:10:48 +02:00
else if (d instanceof twoStateDataFileBase) {
tableels.splice(3, 0, [d.GS, d.ES])
2019-10-07 09:51:53 +02:00
}
2019-12-29 20:00:13 +01:00
tdtemp=$("< td / > ")
2019-10-30 12:59:09 +01:00
for (const el of tableels) {
2019-12-29 20:00:13 +01:00
td=$("< td / > ")
2019-11-02 16:21:11 +01:00
if (trueTypeOf(el) == DOI.name) {
2019-11-02 15:53:53 +01:00
var publi = doiCache.get(el.string)
2019-11-27 18:29:29 +01:00
const sets=await getSets()
if(sets.has(el.toString())){
$(td).append(sets.get(el.toString()))
}
2019-10-09 20:10:48 +02:00
$("< a / > ", {
2019-10-09 17:53:10 +02:00
href: el.url,
target: "_blank",
}).html(publi.format('citation', {
2019-10-09 20:10:48 +02:00
format: 'html',
lang: 'en-US'
})).appendTo(td)
2019-09-30 09:20:13 +02:00
}
2019-12-18 17:51:53 +01:00
else if(el==null){
$(td).text(String.empty)
}
else{
2019-10-09 17:53:10 +02:00
$(td).text(el)
2019-09-30 09:20:13 +02:00
}
2019-10-09 17:53:10 +02:00
$(row).append(td)
2019-09-28 15:23:25 +02:00
}
2019-10-30 12:59:09 +01:00
$(tdtemp).clone().append($("< a / > ", {
2019-10-09 20:10:48 +02:00
target: "_blank",
2019-10-09 17:53:10 +02:00
href: await d.sourceFile.getViewerURL()
2019-10-30 12:59:09 +01:00
}).text("Go to file")).appendTo(row)
2019-10-09 17:53:10 +02:00
$(dtb).append(row)
2019-09-29 15:58:34 +02:00
}
2019-10-01 14:37:26 +02:00
await reloadStat()
2019-09-28 15:23:25 +02:00
}
2020-01-09 13:11:20 +01:00
async function submitdat(){
window.onbeforeunload = () => {return '';}
await reloadContent();
}
2019-09-28 15:23:25 +02:00
< / script >
{{< getDataFilesName > }}
2019-10-09 20:10:48 +02:00
< p >
In this page you can compare multiple dataset and have somme statistics to evaluate method or basis accuracy.
For this follow this steps
< ol >
2019-10-17 14:03:06 +02:00
< li > Select a value type (Absorption, fluorescence or \(\Delta \text{ZPE}\))< / li >
2019-10-09 20:10:48 +02:00
< li > You can add custom files if you want< / li >
< li > Choose each parameters (of course you can select multiples values for each)< / li >
< ul >
< li > Molecule< / li >
< li > Method< / li >
2019-10-10 12:17:34 +02:00
< li > Publication< / li >
2019-10-09 20:10:48 +02:00
< / ul >
2019-11-21 08:53:16 +01:00
< li > Select a reference from < strong > already selected data< / strong > (by default the first is already selected)< / li >
2019-10-09 20:10:48 +02:00
< li > Now you can see the list of selected data and some statistics about these data< / li >
< / ol >
< / p >
2020-01-09 13:11:20 +01:00
< form id = "form_dat" action = "javascript:submitdat()" method = "post" >
2019-10-09 20:10:48 +02:00
< fieldset >
2019-09-28 15:23:25 +02:00
< legend > Data type< / legend >
< input type = "radio" id = "abs" value = "abs" name = "datatype" >
< label for = "abs" > Absorption< / label >
< input type = "radio" id = "fluo" value = "fluo" name = "datatype" >
< label for = "fluo" > Fluorescence< / label >
< input type = "radio" id = "zpe" value = "zpe" name = "datatype" >
< label for = "zpe" > \(\Delta \text{ZPE}\)< / label >
2019-10-09 20:10:48 +02:00
< / fieldset >
< fieldset >
< div >
< label for = "customFiles_input" > Add custom data file< / label >
< input type = "file" multiple onchange = "reloadSelect()" id = "customFiles_input" disabled = true > < / input >
< / div >
< / fieldset >
2019-10-10 10:40:34 +02:00
< fieldset class = "table" >
2019-10-09 20:10:48 +02:00
< div >
< label for = "mol_select" > Molecule< / label >
< select multiple id = "mol_select" name = "molecule" > < / select >
< / div >
< div >
< label for = "method_select" > Method< / label >
< select multiple id = "method_select" name = "method" > < / select >
< / div >
< div >
2019-10-10 12:17:34 +02:00
< label for = "DOI_select" > Publication< / label >
2019-10-09 20:10:48 +02:00
< select multiple id = "DOI_select" name = "DOI" > < / select >
< / div >
< / fieldset >
< input type = "submit" disabled = true value = "Load" > < / input >
< / form >
< form id = "form_ref" >
< label for = "sel_ref" > Reference< / label >
< select id = "sel_ref" onchange = "reloadStat()" > < / select >
< / form >
< section >
2019-12-29 20:00:13 +01:00
< table id = "dat_table" class = "datatable" >
2019-09-28 15:23:25 +02:00
< thead >
< th > Molecule< / th >
< th > Comment< / th >
< th > Code< / th >
2019-10-07 09:51:53 +02:00
< th id = "Geom_th" hidden = true > Geometry< / th >
< th id = "GSGeom_th" hidden = true > Ground state geometry< / th >
< th id = "ESGeom_th" hidden = true > Excited state geometry< / th >
2019-09-28 15:23:25 +02:00
< th > Method< / th >
2019-10-10 12:17:34 +02:00
< th > Publication< / th >
2019-10-02 18:19:24 +02:00
< th > File< / th >
2019-09-28 15:23:25 +02:00
< / thead >
2019-10-09 17:53:10 +02:00
< tbody >
2019-09-29 15:58:34 +02:00
< / tbody >
< / table >
2019-10-09 20:10:48 +02:00
< / section >
< section >
2019-12-29 20:00:13 +01:00
< table id = "stat_table" class = "datatable" >
2019-09-29 15:58:34 +02:00
< thead >
2019-10-01 14:37:26 +02:00
< th > Method< / th >
2019-10-10 12:17:34 +02:00
< th > Publication< / th >
2019-09-29 15:58:34 +02:00
< th > Min< / th >
< th > Max< / th >
< th > Mean< / th >
2019-10-01 14:37:26 +02:00
< th > Absolute Mean< / th >
2019-09-29 15:58:34 +02:00
< th > Median< / th >
2019-10-01 14:37:26 +02:00
< th > Absolute Median< / th >
< th > RMS< / th >
2019-09-29 15:58:34 +02:00
< th > Variance< / th >
< th > Standard deviation< / th >
< / thead >
2019-10-09 17:53:10 +02:00
< tbody >
2019-09-28 15:23:25 +02:00
< / tbody >
2019-10-04 11:03:30 +02:00
< div id = "graph_div" > < / div >
2019-09-28 15:23:25 +02:00
< / table >
2019-10-09 20:10:48 +02:00
< / section >
2019-10-07 14:00:15 +02:00
{{< waitModal > }}