2019-08-28 11:59:18 +02:00
|
|
|
class code {
|
|
|
|
constructor(name,version){
|
2019-09-03 15:36:32 +02:00
|
|
|
this.name=name;
|
|
|
|
this.version=version;
|
|
|
|
};
|
|
|
|
toString() {
|
|
|
|
var str=this.name;
|
|
|
|
if (this.version) {
|
|
|
|
str=str+' ('+this.version+')';
|
|
|
|
}
|
|
|
|
return str;
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
2019-09-19 15:05:07 +02:00
|
|
|
static fromString(str) {
|
|
|
|
var vals=str.split(",")
|
|
|
|
if(vals.length>=2){
|
|
|
|
return new code(vals[0],vals[1]);
|
|
|
|
} else {
|
|
|
|
return new code(vals[0],null);
|
|
|
|
}
|
|
|
|
}
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
2019-09-17 17:19:00 +02:00
|
|
|
class method {
|
|
|
|
constructor(name,basis){
|
2019-09-03 15:36:32 +02:00
|
|
|
this.name=name;
|
2019-09-17 17:19:00 +02:00
|
|
|
this.basis=basis;
|
2019-09-03 15:36:32 +02:00
|
|
|
}
|
2019-09-19 15:05:07 +02:00
|
|
|
static fromString(str) {
|
2019-09-26 09:32:03 +02:00
|
|
|
var vals=str.split(",")
|
|
|
|
if(vals.length==2){
|
|
|
|
return new method(vals[0],vals[1]);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
return new method(vals[0],null)
|
|
|
|
}
|
2019-09-19 15:05:07 +02:00
|
|
|
}
|
2019-09-03 15:36:32 +02:00
|
|
|
toString() {
|
|
|
|
var str=this.name;
|
2019-09-17 17:19:00 +02:00
|
|
|
if (this.name) {
|
|
|
|
str=str+'/'+this.basis;
|
2019-09-03 15:36:32 +02:00
|
|
|
}
|
|
|
|
return str;
|
2019-08-22 10:34:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-28 11:59:18 +02:00
|
|
|
class state{
|
2019-09-19 15:05:07 +02:00
|
|
|
constructor(number,multiplicity,symetry){
|
2019-08-28 11:59:18 +02:00
|
|
|
this.number=number;
|
|
|
|
this.multiplicity=multiplicity;
|
|
|
|
this.symetry=symetry;
|
2019-09-03 15:36:32 +02:00
|
|
|
};
|
|
|
|
toString() {
|
|
|
|
var str=this.number+ ' ^'+this.multiplicity+this.symetry;
|
|
|
|
return str;
|
|
|
|
};
|
|
|
|
toLaTeX() {
|
2019-09-03 15:38:17 +02:00
|
|
|
var tex= String.raw`${this.number}\:\vphantom{\mathrm{${this.symetry.charAt(0)}}}^{${this.multiplicity}}\mathrm{${this.symetry}}`;
|
2019-09-03 15:36:32 +02:00
|
|
|
return tex;
|
|
|
|
};
|
2019-08-22 10:34:07 +02:00
|
|
|
}
|
2019-08-28 11:59:18 +02:00
|
|
|
class doi{
|
|
|
|
constructor(doistring){
|
|
|
|
this.string=doistring
|
2019-09-03 15:36:32 +02:00
|
|
|
};
|
|
|
|
toString() {
|
|
|
|
return this.string;
|
|
|
|
};
|
2019-08-28 11:59:18 +02:00
|
|
|
get url() {
|
2019-09-03 15:36:32 +02:00
|
|
|
return 'https://doi.org/'+this.string;
|
|
|
|
};
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
2019-09-26 09:32:03 +02:00
|
|
|
|
|
|
|
class excitationBase{
|
|
|
|
constructor(initial,final){
|
|
|
|
this.initial=initial;
|
|
|
|
this.final=final
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class excitationValue extends excitationBase{
|
|
|
|
constructor(initial,final,value){
|
|
|
|
super(initial,final)
|
|
|
|
this.value=value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class excitation extends excitationBase{
|
|
|
|
constructor(initial,final,Eabs,Efluo,EZPE){
|
|
|
|
super(initial,final)
|
|
|
|
this.Eabs=Eabs
|
|
|
|
this.Efluo=Efluo
|
|
|
|
this.EZPE=EZPE
|
2019-09-19 15:05:07 +02:00
|
|
|
}
|
2019-09-19 18:54:23 +02:00
|
|
|
get Eadia() {
|
|
|
|
return (this.Eabs+this.Efluo)/2
|
|
|
|
}
|
2019-09-19 15:05:07 +02:00
|
|
|
get Ezz() {
|
2019-09-20 10:41:36 +02:00
|
|
|
return this.Eadia-this.EZPE
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
2019-09-03 15:36:32 +02:00
|
|
|
toString() {
|
2019-09-26 15:08:30 +02:00
|
|
|
return this.start+ ', ' + this.end +', '+ noNanPrecision(this.Eabs,3);
|
2019-09-03 15:36:32 +02:00
|
|
|
}
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
|
|
|
|
2019-09-26 09:32:03 +02:00
|
|
|
class dataFileBase {
|
2019-09-19 15:05:07 +02:00
|
|
|
constructor(){
|
2019-09-26 09:32:03 +02:00
|
|
|
this.molecule=''
|
|
|
|
this.comment=null
|
|
|
|
this.code=null
|
|
|
|
this.method=null
|
|
|
|
this.excitations=[]
|
|
|
|
this.DOI=null
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
2019-09-05 11:31:38 +02:00
|
|
|
static async loadAsync(file) {
|
2019-09-26 09:32:03 +02:00
|
|
|
return this.loadString(await getTextFromFileAsync(getFullDataPath(file)));
|
|
|
|
}
|
|
|
|
static readmetaPair(key, value,dat){
|
|
|
|
switch(key) {
|
|
|
|
case "molecule":
|
|
|
|
dat.molecule=value
|
|
|
|
break;
|
|
|
|
case "comment":
|
|
|
|
dat.comment=value
|
|
|
|
break;
|
|
|
|
case "code":
|
|
|
|
dat.code=code.fromString(value)
|
|
|
|
break;
|
|
|
|
case "method":
|
|
|
|
dat.method=method.fromString(value)
|
|
|
|
break;
|
|
|
|
case "doi":
|
|
|
|
dat.DOI=new doi(value);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
}
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
2019-09-05 10:32:46 +02:00
|
|
|
static loadString(text) {
|
2019-08-28 11:59:18 +02:00
|
|
|
// for each line with metadata
|
|
|
|
var ismetaArea=true;
|
|
|
|
//metadata RegExp (start with #; maybe somme spaces; : ; maybe somme space; datas)
|
2019-09-19 15:05:07 +02:00
|
|
|
var meta=/^#\s*([A-Za-z_]+)\s*:\s*(.*)$/;
|
2019-09-26 09:32:03 +02:00
|
|
|
var classname=this.name
|
|
|
|
var dat=eval(String.raw`new ${this.name}()`)
|
2019-08-28 11:59:18 +02:00
|
|
|
function readmeta(line){
|
|
|
|
// get key value
|
2019-09-26 09:32:03 +02:00
|
|
|
var match=line.match(meta)
|
2019-08-28 11:59:18 +02:00
|
|
|
// normalize key to lower
|
2019-09-26 09:32:03 +02:00
|
|
|
var key=match[1].toLowerCase()
|
2019-08-28 11:59:18 +02:00
|
|
|
//if data has value
|
|
|
|
if(match.length==3 && match[2]) {
|
2019-09-26 09:32:03 +02:00
|
|
|
var val=match[2]
|
|
|
|
eval(String.raw`${classname}.readmetaPair(key,val,dat)`)
|
2019-08-28 11:59:18 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
function readrow(line){
|
2019-09-19 15:05:07 +02:00
|
|
|
var vals=line.split(/\s+/);
|
|
|
|
while (vals.length<8){
|
|
|
|
vals.push(null);
|
|
|
|
}
|
2019-09-26 09:32:03 +02:00
|
|
|
|
2019-09-19 15:05:07 +02:00
|
|
|
var start=new state(parseInt(vals[0],10),parseInt(vals[1],10),vals[2]);
|
|
|
|
var end=new state(parseInt(vals[3],10),vals[4],vals[5]);
|
2019-09-26 09:32:03 +02:00
|
|
|
var ex= new excitationValue(start,end,parseFloat(vals[6],10));
|
2019-08-28 11:59:18 +02:00
|
|
|
dat.excitations.push(ex);
|
|
|
|
};
|
|
|
|
|
|
|
|
text.split("\n").forEach(function(line) {
|
|
|
|
//if it's not empty line
|
|
|
|
line=line.trim();
|
|
|
|
if (line){
|
|
|
|
//if # may be metadata or comment
|
|
|
|
if (line.charAt(0)=="#") {
|
|
|
|
//if it's metadata
|
|
|
|
if(ismetaArea && meta.test(line)) {
|
|
|
|
readmeta(line);
|
|
|
|
}
|
|
|
|
} else { //else its row
|
|
|
|
ismetaArea=false;
|
|
|
|
readrow(line);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return dat
|
|
|
|
}
|
2019-08-22 10:34:07 +02:00
|
|
|
}
|
2019-09-26 09:32:03 +02:00
|
|
|
|
|
|
|
class oneStateDataFile extends dataFileBase {
|
|
|
|
constructor(){
|
|
|
|
super()
|
|
|
|
this.geometry=null
|
|
|
|
}
|
|
|
|
static readmetaPair(key,value,dat)
|
|
|
|
{
|
|
|
|
if(key=="geom")
|
|
|
|
{
|
|
|
|
dat.geometry=method.fromString(value)
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
dataFileBase.readmetaPair(key,value,dat)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class AbsDataFile extends oneStateDataFile {
|
|
|
|
|
|
|
|
}
|
|
|
|
class FluoDataFile extends oneStateDataFile {
|
|
|
|
|
|
|
|
}
|
|
|
|
class twoStateDataFileBase extends dataFileBase{
|
|
|
|
constructor(){
|
|
|
|
super()
|
|
|
|
this.GS=null
|
|
|
|
this.ES=null
|
|
|
|
}
|
|
|
|
static readmetaPair(key,value,dat){
|
|
|
|
switch(key) {
|
|
|
|
case "gs":
|
|
|
|
dat.GS=method.fromString(value)
|
|
|
|
break;
|
|
|
|
case "es":
|
|
|
|
dat.ES=method.fromString(value)
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
dataFileBase.readmetaPair(key,value,dat)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class ZPEDataFile extends twoStateDataFileBase {
|
|
|
|
|
|
|
|
}
|
|
|
|
class CombinedData{
|
|
|
|
constructor(){
|
|
|
|
this.Abs=null
|
|
|
|
this.Fluo=null
|
|
|
|
this.ZPE=null
|
|
|
|
}
|
|
|
|
get excitations() {
|
|
|
|
var exs=[]
|
|
|
|
var dic=new Map()
|
|
|
|
if(this.Abs!=null){
|
|
|
|
this.Abs.excitations.forEach((el)=>{
|
|
|
|
var key=JSON.stringify([el.initial,el.final])
|
|
|
|
if(!dic.has(key)){
|
|
|
|
dic.set(key,{})
|
|
|
|
}
|
|
|
|
dic.get(key)["abs"]=el.value
|
|
|
|
})
|
|
|
|
}
|
|
|
|
if(this.Fluo!=null){
|
|
|
|
this.Fluo.excitations.forEach((el)=>{
|
|
|
|
var key=JSON.stringify([el.initial,el.final])
|
|
|
|
if(!dic.has(key)){
|
|
|
|
dic.set(key,{})
|
|
|
|
}
|
|
|
|
dic.get(key)["fluo"]=el.value
|
|
|
|
})
|
|
|
|
}
|
|
|
|
if(this.ZPE!=null){
|
|
|
|
this.ZPE.excitations.forEach((el)=>{
|
|
|
|
var key=JSON.stringify([el.initial,el.final])
|
|
|
|
if(!dic.has(key)){
|
|
|
|
dic.set(key,{})
|
|
|
|
}
|
|
|
|
dic.get(key)["ZPE"]=el.value
|
|
|
|
})
|
|
|
|
}
|
|
|
|
dic.forEach((value,key)=>{
|
|
|
|
var eabs=NaN
|
|
|
|
var efluo=NaN
|
|
|
|
var eZPE=NaN
|
|
|
|
var mykey=JSON.parse(key)
|
|
|
|
mykey.forEach(el=>{
|
|
|
|
Reflect.setPrototypeOf(el,state.prototype)
|
|
|
|
})
|
|
|
|
if("abs" in value){
|
|
|
|
eabs=value["abs"]
|
|
|
|
}
|
|
|
|
if("fluo" in value){
|
|
|
|
efluo=value["fluo"]
|
|
|
|
}
|
|
|
|
if("ZPE" in value){
|
|
|
|
eZPE=value["ZPE"]
|
|
|
|
}
|
|
|
|
exs.push(new excitation(mykey[0],mykey[1],eabs,efluo,eZPE))
|
|
|
|
})
|
|
|
|
return exs
|
|
|
|
};
|
|
|
|
}
|