util.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import * as util from 'util';
  7. import * as path from 'path';
  8. import * as fs from 'fs';
  9. import * as zlib from 'zlib';
  10. import fetch from 'node-fetch';
  11. require('util.promisify').shim();
  12. const readFile = util.promisify(fs.readFile);
  13. const writeFile = util.promisify(fs.writeFile);
  14. import { Progress } from '../../mol-task';
  15. import { Database } from '../../mol-data/db';
  16. import { CIF } from '../../mol-io/reader/cif';
  17. import { CifWriter } from '../../mol-io/writer/cif';
  18. import { CCD_Schema } from '../../mol-io/reader/cif/schema/ccd';
  19. export async function ensureAvailable(path: string, url: string, forceDownload = false) {
  20. if (forceDownload || !fs.existsSync(path)) {
  21. console.log(`downloading ${url}...`);
  22. const data = await fetch(url);
  23. if (!fs.existsSync(DATA_DIR)) {
  24. fs.mkdirSync(DATA_DIR);
  25. }
  26. if (url.endsWith('.gz')) {
  27. await writeFile(path, zlib.gunzipSync(await data.buffer()));
  28. } else {
  29. await writeFile(path, await data.text());
  30. }
  31. console.log(`done downloading ${url}`);
  32. }
  33. }
  34. export async function ensureDataAvailable(options: DataOptions) {
  35. await ensureAvailable(CCD_PATH, options.ccdUrl || CCD_URL, !!options.ccdUrl || options.forceDownload);
  36. await ensureAvailable(PVCD_PATH, options.pvcdUrl || PVCD_URL, !!options.pvcdUrl || options.forceDownload);
  37. }
  38. export async function readFileAsCollection<S extends Database.Schema>(path: string, schema: S) {
  39. const parsed = await parseCif(await readFile(path, 'utf8'));
  40. return CIF.toDatabaseCollection(schema, parsed.result);
  41. }
  42. export async function readCCD() {
  43. return readFileAsCollection(CCD_PATH, CCD_Schema);
  44. }
  45. export async function readPVCD() {
  46. return readFileAsCollection(PVCD_PATH, CCD_Schema);
  47. }
  48. async function parseCif(data: string | Uint8Array) {
  49. const comp = CIF.parse(data);
  50. console.time('parse cif');
  51. const parsed = await comp.run(p => console.log(Progress.format(p)), 250);
  52. console.timeEnd('parse cif');
  53. if (parsed.isError) throw parsed;
  54. return parsed;
  55. }
  56. export function getEncodedCif(name: string, database: Database<Database.Schema>, binary = false) {
  57. const encoder = CifWriter.createEncoder({ binary, encoderName: 'mol*' });
  58. CifWriter.Encoder.writeDatabase(encoder, name, database);
  59. return encoder.getData();
  60. }
  61. export type DataOptions = {
  62. ccdUrl?: string,
  63. pvcdUrl?: string,
  64. forceDownload?: boolean
  65. }
  66. export const DefaultDataOptions: DataOptions = {
  67. forceDownload: false
  68. };
  69. const DATA_DIR = path.join(__dirname, '..', '..', '..', '..', 'build/data');
  70. const CCD_PATH = path.join(DATA_DIR, 'components.cif');
  71. const PVCD_PATH = path.join(DATA_DIR, 'aa-variants-v1.cif');
  72. const CCD_URL = 'http://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif';
  73. const PVCD_URL = 'http://ftp.wwpdb.org/pub/pdb/data/monomers/aa-variants-v1.cif';