molstar
Version:
A comprehensive macromolecular library.
79 lines (78 loc) • 2.87 kB
JavaScript
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
import fetch from 'node-fetch';
import * as fs from 'fs';
import * as path from 'path';
import * as argparse from 'argparse';
import { makeDir } from '../../../mol-util/make-dir';
import { now } from '../../../mol-util/now';
import { PerformanceMonitor } from '../../../mol-util/performance-monitor';
const cmdParser = new argparse.ArgumentParser({
add_help: true,
description: 'Download JSON data from PDBe API'
});
cmdParser.add_argument('--in', { help: 'Input folder', required: true });
cmdParser.add_argument('--out', { help: 'Output folder', required: true });
const cmdArgs = cmdParser.parse_args();
function getPDBid(name) {
let idx = name.indexOf('_');
if (idx < 0)
idx = name.indexOf('.');
return name.substr(0, idx).toLowerCase();
}
function findEntries() {
const files = fs.readdirSync(cmdArgs.in);
const cifTest = /\.cif$/;
const groups = new Map();
const keys = [];
for (const f of files) {
if (!cifTest.test(f))
continue;
const id = getPDBid(f);
const groupId = `${id[1]}${id[2]}`;
if (groups.has(groupId))
groups.get(groupId).push(id);
else {
keys.push(groupId);
groups.set(groupId, [id]);
}
}
const ret = [];
for (const key of keys) {
ret.push({ key, entries: groups.get(key) });
}
return ret;
}
async function process() {
const entries = findEntries();
makeDir(cmdArgs.out);
const started = now();
let prog = 0;
for (const e of entries) {
const ts = now();
console.log(`${prog}/${entries.length} ${e.entries.length} entries.`);
const data = Object.create(null);
for (const ee of e.entries) {
const query = await fetch(`https://www.ebi.ac.uk/pdbe/api/validation/residuewise_outlier_summary/entry/${ee}`);
try {
if (query.status === 200)
data[ee] = (await query.json())[ee] || {};
else
console.error(ee, query.status);
}
catch (e) {
console.error(ee, '' + e);
}
}
// const query = await fetch(`https://www.ebi.ac.uk/pdbe/api/validation/residuewise_outlier_summary/entry`, { method: 'POST', body });
// console.log(query.status);
// const data = await query.text();
fs.writeFileSync(path.join(cmdArgs.out, e.key + '.json'), JSON.stringify(data));
const time = now() - started;
console.log(`${++prog}/${entries.length} in ${PerformanceMonitor.format(time)} (last ${PerformanceMonitor.format(now() - ts)}, avg ${PerformanceMonitor.format(time / prog)})`);
}
}
process();