index.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import CIF from 'mol-io/reader/cif'
  7. import { Run, Progress } from 'mol-task'
  8. import { Model } from 'mol-model/structure'
  9. import { VolumeData, parseDensityServerData } from 'mol-model/volume'
  10. import { DensityServer_Data_Database } from 'mol-io/reader/cif/schema/density-server';
  11. export function log(progress: Progress) {
  12. const p = progress.root.progress
  13. console.log(`${p.message} ${(p.current/p.max*100).toFixed(2)}%`)
  14. }
  15. export async function downloadCif(url: string, isBinary: boolean) {
  16. const data = await fetch(url);
  17. return parseCif(isBinary ? new Uint8Array(await data.arrayBuffer()) : await data.text());
  18. }
  19. export async function parseCif(data: string|Uint8Array) {
  20. const comp = CIF.parse(data)
  21. const parsed = await Run(comp, log, 500);
  22. if (parsed.isError) throw parsed;
  23. return parsed.result
  24. }
  25. export async function getModelFromPdbId(pdbid: string) {
  26. const cif = await downloadCif(`https://files.rcsb.org/download/${pdbid}.cif`, false)
  27. return Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) })
  28. }
  29. const readFileAsText = (file: File) => {
  30. const fileReader = new FileReader()
  31. return new Promise<string>((resolve, reject) => {
  32. fileReader.onerror = () => {
  33. fileReader.abort()
  34. reject(new DOMException('Error parsing input file.'))
  35. }
  36. fileReader.onload = () => resolve(fileReader.result)
  37. fileReader.readAsText(file)
  38. })
  39. }
  40. export async function getModelFromFile(file: File) {
  41. const cif = await parseCif(await readFileAsText(file))
  42. return Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) })
  43. }
  44. export type Volume = { source: DensityServer_Data_Database, volume: VolumeData }
  45. export async function getVolumeFromEmdId(emdid: string): Promise<Volume> {
  46. const cif = await downloadCif(`https://webchem.ncbr.muni.cz/DensityServer/em/emd-${emdid}/cell?detail=4`, true)
  47. const data = CIF.schema.densityServer(cif.blocks[1])
  48. return { source: data, volume: await Run(parseDensityServerData(data)) }
  49. }