@iktos-oss/rdkit-provider
Version:
exports an initialized RDKit instance, with helper functions
1 lines • 8.75 kB
JavaScript
(()=>{"use strict";const r=(r,o,e)=>{globalThis.rdkitWorkerGlobals.jsMolCacheEnabled&&globalThis.rdkitWorkerGlobals.jsMolCache&&globalThis.rdkitWorkerGlobals.jsQMolCache&&("mol"===e&&(globalThis.rdkitWorkerGlobals.jsMolCache[r]=o),"qmol"===e&&(globalThis.rdkitWorkerGlobals.jsQMolCache[r]=o))},o=({nbMols:r,nbQmols:o})=>{const e=globalThis.rdkitWorkerGlobals.jsMolCache?Object.keys(globalThis.rdkitWorkerGlobals.jsMolCache).length:0,l=globalThis.rdkitWorkerGlobals.jsQMolCache?Object.keys(globalThis.rdkitWorkerGlobals.jsQMolCache).length:0,a=globalThis.rdkitWorkerGlobals.maxJsMolsCached,i=l+o>a;e+r>a&&s(),i&&t()},e=o=>{if(globalThis.rdkitWorkerGlobals.jsMolCacheEnabled&&(globalThis.rdkitWorkerGlobals.jsMolCache||globalThis.rdkitWorkerGlobals.jsQMolCache))for(const{structure:e,jsMol:l,molType:a}of o)if(l)try{r(e,l,a)}catch(r){console.error("@iktos-oss/rdkit-provider: failed while storing molecules in cahce",r),console.info("@iktos-oss/rdkit-provider: clearing cache"),"mol"===a?s():t()}},l=(r,o)=>r.map((r=>((r,o)=>{if(!globalThis.rdkitWorkerGlobals.jsMolCacheEnabled||!globalThis.rdkitWorkerGlobals.jsMolCache&&!globalThis.rdkitWorkerGlobals.jsQMolCache)return null;if("mol"===o)return globalThis.rdkitWorkerGlobals.jsMolCache?globalThis.rdkitWorkerGlobals.jsMolCache[r]:null;if("qmol"===o)return globalThis.rdkitWorkerGlobals.jsQMolCache?globalThis.rdkitWorkerGlobals.jsQMolCache[r]:null;throw new Error(`@iktos-oss/rdkit-provider unkown molType=${o} passed to getJSMolFromCache`)})(r,o))),s=()=>{if(globalThis.rdkitWorkerGlobals?.jsMolCache)for(const[r,o]of Object.entries(globalThis.rdkitWorkerGlobals.jsMolCache))try{o.delete(),delete globalThis.rdkitWorkerGlobals.jsMolCache[r]}catch{}},t=()=>{if(globalThis.rdkitWorkerGlobals?.jsQMolCache)for(const[r,o]of Object.entries(globalThis.rdkitWorkerGlobals.jsQMolCache))try{o.delete(),delete globalThis.rdkitWorkerGlobals.jsQMolCache[r]}catch{}},a=()=>{s(),t()},i=(r,s)=>{if(!s)return[];o({nbMols:r.length,nbQmols:0});const t=l(r,"mol").map(((o,e)=>o||((r,o)=>{const e={removeHs:globalThis.rdkitWorkerGlobals.removeHs};return o.get_mol(r,JSON.stringify(e))||(console.error("@iktos-oss/rdkit-provider: failed to get mol for smiles = ",r),null)})(r[e],s)));return e(t.map(((o,e)=>({structure:r[e],jsMol:o,molType:"mol"})))),t},n=(r,o)=>{console.log("called get_molecules");try{return i(r,o)}catch(e){return console.error("@iktos-oss/rdkit-provider: caught error during get_molecules",e),console.info("@iktos-oss/rdkit-provider: clearing cache"),a(),i(r,o)}},c=(r,s)=>{if(!s)return[];o({nbMols:0,nbQmols:r.length});const t=l(r,"qmol");console.log("cachedQMolecules",t);const a=t.map(((o,e)=>o||(console.log("about to call createQMol"),((r,o)=>o.get_qmol(r)||(console.error("@iktos-oss/rdkit-provider: failed to get qmol for structure =",r),null))(r[e],s))));return e(a.map(((o,e)=>({structure:r[e],jsMol:o,molType:"qmol"})))),a},d=(r,o)=>{console.log("called get_query_molecules");try{return c(r,o)}catch(e){return console.error(e),a(),c(r,o)}},u=r=>{if(!globalThis.rdkitWorkerGlobals.jsMolCacheEnabled)for(const o of r)o?.delete()},k=({smiles:r,drawingDetails:o,alignmentDetails:e})=>{const l=n(e?[r,e.molBlock]:[r],globalThis.workerRDKit),[s]=l;if(!s)return null;if(e){const[r,o]=l;if(!o)return null;s.generate_aligned_coords(o,JSON.stringify({useCoordGen:globalThis.rdkitWorkerGlobals.preferCoordgen}))}const t=o?JSON.stringify(o):"",a=s.get_svg_with_highlights(t);return e&&s.set_new_coords(),u(l),a},h=({smarts:r,width:o,height:e})=>{const[l]=d([r],globalThis.workerRDKit);if(!l)return null;const s=l.get_svg(o,e);return u([l]),s};function g({smiles:r,returnFullDetails:o}){const[e]=n([r],globalThis.workerRDKit);if(!e)return null;const l=JSON.parse(e.get_descriptors());return u([e]),o?l:{numAtoms:l.NumHeavyAtoms,numRings:l.NumRings}}const b=({structure:r,useQMol:o=!1})=>p({moleculeString:r,targetNotation:o?"smarts":"smiles",useQMol:o,sourceNotation:void 0}),m=r=>{if(!r)return!1;const[o]=n([r],globalThis.workerRDKit);if(!o)return!1;const e=o.is_valid();return u([o]),e},T=r=>{if(!r)return!1;const[o]=d([r],globalThis.workerRDKit);if(!o)return!1;const e=o.is_valid();return u([o]),e},_=({smiles:r,substructure:o})=>{const[e]=n([r],globalThis.workerRDKit),[l]=d([o],globalThis.workerRDKit);if(!e||!l)return!1;const s=JSON.parse(e.get_substruct_match(l)),t=!!s&&!!Object.keys(s).length;return u([e,l]),t},f=r=>{if(!r.includes("M END"))return!1;const[o]=n([r],globalThis.workerRDKit);if(!o)return!1;try{return o.is_valid()}finally{u([o])}},p=({moleculeString:r,targetNotation:o,sourceNotation:e,useQMol:l})=>{const s=!!l||void 0===l&&"smarts"===e;if(null!=e){if(e===o)throw new Error("@iktos-oss/rdkit-provider: source and target notations must differ");if(!E(r,e))throw new Error("@iktos-oss/rdkit-provider: molecule string not valid")}const[t]=s?d([r],globalThis.workerRDKit):n([r],globalThis.workerRDKit);if(!t)return null;try{return t[`get_${o}`]()}catch(r){throw console.error(r),new Error("@iktos-oss/rdkit-provider: target notation not implemented")}finally{u([t])}},y=(r,o)=>{const[e]=n([r],globalThis.workerRDKit);if(!e)return null;try{return void 0!==o?e.get_new_coords(o):e.get_new_coords()}finally{u([e])}},M=r=>{const[o]=n([r],globalThis.workerRDKit);if(!o)return null;try{const r=o.remove_hs();return y(r,!1)}finally{u([o])}},C=r=>{const[o]=n([r],globalThis.workerRDKit);if(!o)return null;try{let r=o.add_hs();return r=y(r,!1),r}finally{u([o])}},w=r=>{const[o]=n([r],globalThis.workerRDKit);if(!o)throw new Error("@iktos-oss/rdkit-provider: mol is null");try{const r=o.get_stereo_tags(),{CIP_atoms:e,CIP_bonds:l}=JSON.parse(r);return{CIP_atoms:e,CIP_bonds:l}}catch(r){throw console.error(r),new Error("@iktos-oss/rdkit-provider: could not get stereo tags")}finally{u([o])}},E=(r,o)=>{switch(o){case"molblock":return f(r);case"smiles":return m(r);case"smarts":return T(r);default:throw new Error(`@iktos-oss/rdkit-provider: validate ${o} not implemented`)}};addEventListener("message",(async({data:r})=>{let o;switch(r.actionType){case"INIT_RDKIT_MODULE":await(async({rdkitPath:r,preferCoordgen:o,removeHs:e,cache:l={}})=>{if((({cache:r,preferCoordgen:o,removeHs:e})=>{const{enableJsMolCaching:l,maxJsMolsCached:s}=r;globalThis.rdkitWorkerGlobals={jsMolCacheEnabled:!!l,jsMolCache:l?{}:null,jsQMolCache:l?{}:null,maxJsMolsCached:s??150,preferCoordgen:o,removeHs:e}})({cache:l,preferCoordgen:o,removeHs:e}),globalThis.workerRDKit)return;const s=new URL(r||"/RDKit_minimal.js",globalThis.origin);importScripts(s),globalThis.initRDKitModule&&(globalThis.workerRDKit=await globalThis.initRDKitModule(),globalThis.workerRDKit.prefer_coordgen(o))})(r.payload);break;case"GET_MOLECULE_DETAILS":o=g({smiles:r.payload.smiles,returnFullDetails:!0});break;case"DEPRECATED_GET_MOLECULE_DETAILS":console.warn("[DEPRECATED] Using deprecated molecule details retrieval. Please update to the full details API by passing returnFullDetails=true, careful numAtom is now NumHeavyAtom and not NumAtom."),o=g({smiles:r.payload.smiles,returnFullDetails:!1});break;case"GET_CANONICAL_FORM_FOR_STRUCTURE":o={canonicalForm:b(r.payload)};break;case"IS_CHIRAL":o=(r=>{const[o]=n([r],globalThis.workerRDKit);if(!o)throw new Error("@iktos-oss/rdkit-provider: Failed to instanciate molecule");try{return o.get_smiles(JSON.stringify({doIsomericSmiles:!1}))!==o.get_smiles(JSON.stringify({doIsomericSmiles:!0}))}finally{u([o])}})(r.payload.smiles);break;case"GET_MORGAN_FP":o=(({smiles:r,options:o})=>{const[e]=n([r],globalThis.workerRDKit);if(!e)throw new Error("@iktos-oss/rdkit-provider: Failed to instanciate molecule");try{return o?e.get_morgan_fp(JSON.stringify(o)):e.get_morgan_fp()}finally{u([e])}})(r.payload);break;case"GET_SVG":o={svg:k(r.payload)};break;case"GET_SVG_FROM_SMARTS":o={svg:h(r.payload)};break;case"IS_VALID_SMILES":o={isValid:m(r.payload.smiles)};break;case"IS_VALID_SMARTS":o={isValid:T(r.payload.smarts)};break;case"HAS_MATCHING_SUBSTRUCTURE":o={matching:_(r.payload)};break;case"GET_SUBSTRUCTURE_MATCH":o=(({structure:r,substructure:o})=>{const[e]=n([r],globalThis.workerRDKit),[l]=d([o],globalThis.workerRDKit);if(!e||!l)return null;const{atoms:s,bonds:t}=JSON.parse(e.get_substruct_match(l));return u([e,l]),{matchingAtoms:s,matchingBonds:t}})(r.payload);break;case"IS_VALID_MOLBLOCK":o={isValid:f(r.payload.mdl)};break;case"CONVERT_MOL_NOTATION":o={structure:p(r.payload)};break;case"ADD_HS":o={mdl:C(r.payload.structure)};break;case"REMOVE_HS":o={mdl:M(r.payload.structure)};break;case"GET_NEW_COORDS":o={mdl:y(r.payload.structure,r.payload.useCoordGen)};break;case"GET_STEREO_TAGS":o={...w(r.payload.structure)};break;case"TERMINATE":a(),self.close();break;default:return}var e;postMessage({actionType:(e=r.actionType,e+"_LOCAL_RESPONSE"),payload:o,key:r.key})}))})();