master.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import * as fs from 'fs'
  7. import * as path from 'path'
  8. import * as argparse from 'argparse'
  9. import { runMaster, PreprocessEntry } from './parallel';
  10. import { ModelPropertyProviderConfig } from '../property-provider';
  11. function description() {
  12. const exampleCfg = {
  13. numProcesses: 1,
  14. customProperties: {
  15. sources: [
  16. 'wwpdb'
  17. ],
  18. params: {
  19. wwPDB: {
  20. chemCompBondTablePath: './build/data/ccb.bcif'
  21. }
  22. }
  23. }
  24. }
  25. return `Preprocess CIF files to include custom properties and convert them to BinaryCIF format.\n\nExample cfg.json: ${JSON.stringify(exampleCfg, null, 2)}`
  26. }
  27. const cmdParser = new argparse.ArgumentParser({
  28. addHelp: true,
  29. description: description()
  30. });
  31. cmdParser.addArgument(['--input', '-i'], { help: 'Input filename', required: false });
  32. cmdParser.addArgument(['--outCIF', '-oc'], { help: 'Output CIF filename', required: false });
  33. cmdParser.addArgument(['--outBCIF', '-ob'], { help: 'Output BinaryCIF filename', required: false });
  34. // TODO: add back? cmdParser.addArgument(['--bulk', '-b'], { help: 'Bulk JSON ({ numProcesses?: number, entries: { source: string, cif?: string, bcif?: string }[] })', required: false });
  35. cmdParser.addArgument(['--cfg', '-c'], { help: 'Config file path', required: false });
  36. cmdParser.addArgument(['--folderIn', '-fin'], { help: 'Convert folder', required: false });
  37. cmdParser.addArgument(['--folderOutCIF', '-foc'], { help: 'Convert folder text output', required: false });
  38. cmdParser.addArgument(['--folderOutBCIF', '-fob'], { help: 'Convert folder binary output', required: false });
  39. cmdParser.addArgument(['--folderNumProcesses', '-fp'], { help: 'Convert folder num processes', required: false });
  40. interface CmdArgs {
  41. // bulk?: string,
  42. help?: any,
  43. cfg?: string,
  44. input?: string,
  45. outCIF?: string,
  46. outBCIF?: string,
  47. folderIn?: string,
  48. folderOutCIF?: string,
  49. folderOutBCIF?: string,
  50. folderNumProcesses?: string
  51. }
  52. export interface PreprocessConfig {
  53. numProcesses?: number,
  54. customProperties?: ModelPropertyProviderConfig | string
  55. }
  56. const cmdArgs = cmdParser.parseArgs() as CmdArgs;
  57. if (Object.keys(cmdArgs).filter(k => (cmdArgs as any)[k] !== null).length === 0 || typeof cmdArgs.help !== 'undefined') {
  58. cmdParser.printHelp();
  59. process.exit(0);
  60. }
  61. let entries: PreprocessEntry[] = []
  62. let config: PreprocessConfig = { numProcesses: cmdArgs.folderIn ? +(cmdArgs.folderNumProcesses || 1) : 1, customProperties: void 0 }
  63. if (cmdArgs.input) entries.push({ source: cmdArgs.input, cif: cmdArgs.outCIF, bcif: cmdArgs.outBCIF });
  64. // else if (cmdArgs.bulk) runBulk(cmdArgs.bulk);
  65. else if (cmdArgs.folderIn) findEntries();
  66. if (cmdArgs.cfg) {
  67. config = JSON.parse(fs.readFileSync(cmdArgs.cfg, 'utf8')) as PreprocessConfig;
  68. }
  69. runMaster(config, entries);
  70. function findEntries() {
  71. const files = fs.readdirSync(cmdArgs.folderIn!);
  72. const cifTest = /\.cif$/;
  73. for (const f of files) {
  74. if (!cifTest.test(f)) continue;
  75. entries.push({
  76. source: path.join(cmdArgs.folderIn!, f),
  77. cif: cmdArgs.folderOutCIF ? path.join(cmdArgs.folderOutCIF!, f) : void 0,
  78. bcif: cmdArgs.folderOutBCIF ? path.join(cmdArgs.folderOutBCIF!, path.parse(f).name + '.bcif') : void 0,
  79. });
  80. }
  81. }
  82. // example:
  83. // node build\node_modules\servers\model\preprocess -i e:\test\Quick\1cbs_updated.cif -oc e:\test\mol-star\model\1cbs.cif -ob e:\test\mol-star\model\1cbs.bcif