From 85ab5b996882db92cfa47a5a77ac01c18bb72d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20V=C3=A9ril?= Date: Mon, 28 Sep 2020 15:39:46 +0200 Subject: [PATCH] Change geometries handling --- static/js/GeometriesLoader.js | 16 ++++++++++ static/js/Geometry.js | 35 +++++++++++++++++++++ static/js/GeometryParseMetadataExtension.js | 20 ++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 static/js/GeometriesLoader.js create mode 100644 static/js/Geometry.js create mode 100644 static/js/GeometryParseMetadataExtension.js 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