diff --git a/static/js/GeometriesLoader.js b/static/js/GeometriesLoader.js new file mode 100644 index 00000000..2df41181 --- /dev/null +++ b/static/js/GeometriesLoader.js @@ -0,0 +1,16 @@ +class GeometriesLoader{ + static async loadForAsync(array){ + var xyzs=[] + for (const item of array) { + const mymol=mhchemCE.extract(item.molecule).toLowerCase().replace(" ","_") + const myset=item.set.split("#").join("") + try { + const mol=await Geometry.loadXYZAsync(`/${myset}/${mymol}.xyz`) + xyzs.push(mol) + } catch (error) { + console.error("Geometry not found",item) + } + } + return xyzs.flat() + } +} \ No newline at end of file diff --git a/static/js/Geometry.js b/static/js/Geometry.js new file mode 100644 index 00000000..a872de5d --- /dev/null +++ b/static/js/Geometry.js @@ -0,0 +1,35 @@ +class Geometry { + constructor(molecule, comment) { + this.molecule = molecule + this.comment = comment + } + static async loadXYZAsync(file) { + switch (trueTypeOf(file)) { + case String.name: + file = getFullDataPath("/structures/"+file) + var str = await getTextFromFileUrlAsync(file) + break; + case File.name: + var str = await getTextFromUploadedFileAsync(file) + break + } + var xyz = this.loadXYZString(str); + xyz.sourceFile = new websiteFile(file) + return xyz + } + static loadXYZString(text) { + var lines = text.split("\n") + var indexes = lines.findAllIndexes((line) => { + return line.match(/^\d+$/) + }) + indexes.push(lines.length) + var geoms = [] + for (let i = 0; i < indexes.length - 1; i++) { + const mollines = lines.slice(indexes[i], indexes[i + 1]) + const comment = mollines[1] + const molecule = ChemDoodle.readXYZ(mollines.join("\n")) + geoms.push(new Geometry(molecule, comment)) + } + return geoms + } +} \ No newline at end of file diff --git a/static/js/GeometryParseMetadataExtension.js b/static/js/GeometryParseMetadataExtension.js new file mode 100644 index 00000000..6856f196 --- /dev/null +++ b/static/js/GeometryParseMetadataExtension.js @@ -0,0 +1,20 @@ +if (!Geometry.prototype.parseMetadata) { + Geometry.prototype.parseMetadata = function () { + const Ametadata = this.comment.split(",") + const molecule = Ametadata[0] + const stateRegExp = /^\^(\d+)(.+)$/ + const m = Ametadata[1].match(stateRegExp) + const mul = m[1] + const sym = m[2] + var meth = null + if (Ametadata.length>2) { + meth = new method(Ametadata[2],Ametadata[3]) + } + return { + molecule:molecule, + multiplicity:mul, + symmetry:sym, + method:meth + } + } +} \ No newline at end of file