Skip to content
Snippets Groups Projects
Commit bf81b902 authored by Alexander Rose's avatar Alexander Rose
Browse files

chemCompBond creation improvements and prop

parent b636cdf9
No related branches found
No related tags found
No related merge requests found
...@@ -95,7 +95,7 @@ Install CIFTools `npm install ciftools -g` ...@@ -95,7 +95,7 @@ Install CIFTools `npm install ciftools -g`
### Other scripts ### Other scripts
**Create chem comp bond table** **Create chem comp bond table**
export NODE_PATH="lib"; node --max-old-space-size=8192 build/src/apps/chem-comp-bond/create-table.js build/data/ccb.bcif -b export NODE_PATH="lib"; node --max-old-space-size=4096 lib/apps/chem-comp-bond/create-table.js build/data/ccb.bcif -b
**Test model server** **Test model server**
......
/** /**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
* *
* @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Alexander Rose <alexander.rose@weirdbyte.de>
*/ */
...@@ -15,12 +15,13 @@ const readFile = util.promisify(fs.readFile) ...@@ -15,12 +15,13 @@ const readFile = util.promisify(fs.readFile)
const writeFile = util.promisify(fs.writeFile) const writeFile = util.promisify(fs.writeFile)
import { Progress } from '../../mol-task' import { Progress } from '../../mol-task'
import { Database, Table, DatabaseCollection, Column } from '../../mol-data/db' import { Database, Table, DatabaseCollection } from '../../mol-data/db'
import { CIF } from '../../mol-io/reader/cif' import { CIF } from '../../mol-io/reader/cif'
import { CifWriter } from '../../mol-io/writer/cif' import { CifWriter } from '../../mol-io/writer/cif'
import { CCD_Schema } from '../../mol-io/reader/cif/schema/ccd' import { CCD_Schema } from '../../mol-io/reader/cif/schema/ccd'
import { SetUtils } from '../../mol-util/set' import { SetUtils } from '../../mol-util/set'
import { DefaultMap } from '../../mol-util/map' import { DefaultMap } from '../../mol-util/map'
import { mmCIF_chemCompBond_schema } from '../../mol-io/reader/cif/schema/mmcif-extras';
export async function ensureAvailable(path: string, url: string) { export async function ensureAvailable(path: string, url: string) {
if (FORCE_DOWNLOAD || !fs.existsSync(path)) { if (FORCE_DOWNLOAD || !fs.existsSync(path)) {
...@@ -74,16 +75,6 @@ export function getEncodedCif(name: string, database: Database<Database.Schema>, ...@@ -74,16 +75,6 @@ export function getEncodedCif(name: string, database: Database<Database.Schema>,
type CCB = Table<CCD_Schema['chem_comp_bond']> type CCB = Table<CCD_Schema['chem_comp_bond']>
type CCA = Table<CCD_Schema['chem_comp_atom']> type CCA = Table<CCD_Schema['chem_comp_atom']>
const ChemCompBond_Schema = {
comp_id: CCD_Schema['chem_comp_bond'].comp_id,
atom_id_1: CCD_Schema['chem_comp_bond'].atom_id_1,
atom_id_2: CCD_Schema['chem_comp_bond'].atom_id_2,
value_order: CCD_Schema['chem_comp_bond'].value_order,
pdbx_aromatic_flag: CCD_Schema['chem_comp_bond'].pdbx_aromatic_flag,
pdbx_stereo_config: CCD_Schema['chem_comp_bond'].pdbx_stereo_config,
molstar_protonation_variant: Column.Schema.Str()
}
function ccbKey(compId: string, atomId1: string, atomId2: string) { function ccbKey(compId: string, atomId1: string, atomId2: string) {
return atomId1 < atomId2 ? `${compId}:${atomId1}-${atomId2}` : `${compId}:${atomId2}-${atomId1}` return atomId1 < atomId2 ? `${compId}:${atomId1}-${atomId2}` : `${compId}:${atomId2}-${atomId1}`
} }
...@@ -202,14 +193,14 @@ async function createBonds() { ...@@ -202,14 +193,14 @@ async function createBonds() {
} }
} }
const bondTable = Table.ofArrays(ChemCompBond_Schema, { const bondTable = Table.ofArrays(mmCIF_chemCompBond_schema, {
comp_id, atom_id_1, atom_id_2, value_order, comp_id, atom_id_1, atom_id_2, value_order,
pdbx_aromatic_flag, pdbx_stereo_config, molstar_protonation_variant pdbx_aromatic_flag, pdbx_stereo_config, molstar_protonation_variant
}) })
const bondDatabase = Database.ofTables( const bondDatabase = Database.ofTables(
TABLE_NAME, TABLE_NAME,
{ chem_comp_bond: ChemCompBond_Schema }, { chem_comp_bond: mmCIF_chemCompBond_schema },
{ chem_comp_bond: bondTable } { chem_comp_bond: bondTable }
) )
...@@ -220,12 +211,15 @@ async function run(out: string, binary = false) { ...@@ -220,12 +211,15 @@ async function run(out: string, binary = false) {
const bonds = await createBonds() const bonds = await createBonds()
const cif = getEncodedCif(TABLE_NAME, bonds, binary) const cif = getEncodedCif(TABLE_NAME, bonds, binary)
if (!fs.existsSync(path.dirname(out))) {
fs.mkdirSync(path.dirname(out));
}
writeFile(out, cif) writeFile(out, cif)
} }
const TABLE_NAME = 'CHEM_COMP_BONDS' const TABLE_NAME = 'CHEM_COMP_BONDS'
const DATA_DIR = path.join(__dirname, '..', '..', '..', 'data') const DATA_DIR = path.join(__dirname, '..', '..', '..', 'build/data')
const CCD_PATH = path.join(DATA_DIR, 'components.cif') const CCD_PATH = path.join(DATA_DIR, 'components.cif')
const PVCD_PATH = path.join(DATA_DIR, 'aa-variants-v1.cif') const PVCD_PATH = path.join(DATA_DIR, 'aa-variants-v1.cif')
const CCD_URL = 'http://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif' const CCD_URL = 'http://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif'
......
/** /**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
* *
* @author David Sehnal <david.sehnal@gmail.com> * @author David Sehnal <david.sehnal@gmail.com>
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/ */
import { mmCIF_Schema } from './mmcif'; import { mmCIF_Schema } from './mmcif';
import { Column } from '../../../../mol-data/db';
export const mmCIF_residueId_schema = { export const mmCIF_residueId_schema = {
label_comp_id: mmCIF_Schema.atom_site.label_comp_id, label_comp_id: mmCIF_Schema.atom_site.label_comp_id,
...@@ -15,4 +17,10 @@ export const mmCIF_residueId_schema = { ...@@ -15,4 +17,10 @@ export const mmCIF_residueId_schema = {
auth_comp_id: mmCIF_Schema.atom_site.auth_atom_id, auth_comp_id: mmCIF_Schema.atom_site.auth_atom_id,
auth_seq_id: mmCIF_Schema.atom_site.auth_seq_id, auth_seq_id: mmCIF_Schema.atom_site.auth_seq_id,
auth_asym_id: mmCIF_Schema.atom_site.auth_asym_id auth_asym_id: mmCIF_Schema.atom_site.auth_asym_id
}
export const mmCIF_chemCompBond_schema = {
...mmCIF_Schema.chem_comp_bond,
/** Indicates if the bond entry was taken from the protonation variant dictionary */
molstar_protonation_variant: Column.Schema.Str()
} }
\ No newline at end of file
/**
* Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Column, Table } from '../../mol-data/db';
import { toTable } from '../../mol-io/reader/cif/schema';
import { Model, CustomPropertyDescriptor } from '../../mol-model/structure';
import { mmCIF_chemCompBond_schema } from '../../mol-io/reader/cif/schema/mmcif-extras';
import { CifWriter } from '../../mol-io/writer/cif';
export namespace ChemCompBond {
export type Property = Table<Schema['chem_comp_bond']>
export function getFromModel(model: Model): Property {
if (model.sourceData.kind !== 'mmCIF') return Table.ofUndefinedColumns(Schema.chem_comp_bond, 0);
const { chem_comp_bond } = model.sourceData.data
return Table.ofColumns(Schema.chem_comp_bond, {
...chem_comp_bond,
molstar_protonation_variant: Column.Undefined(chem_comp_bond._rowCount, Column.Schema.Str())
});
}
export function get(model: Model): Property {
return model._staticPropertyData.__ChemCompBond__ || getFromModel(model);
}
function set(model: Model, prop: Property) {
(model._staticPropertyData.__ChemCompBond__ as Property) = prop;
}
export const Schema = { chem_comp_bond: mmCIF_chemCompBond_schema };
export type Schema = typeof Schema
export const Descriptor = CustomPropertyDescriptor({
isStatic: true,
name: 'chem_comp_bond',
cifExport: {
prefix: '',
context(ctx): Property { return get(ctx.firstModel); },
categories: [{
name: 'chem_comp_bond',
instance(ctx: Property) {
return CifWriter.Category.ofTable(ctx);
}
}]
}
});
function fromCifData(model: Model): Table<Schema['chem_comp_bond']> | undefined {
if (model.sourceData.kind !== 'mmCIF') return void 0;
const cat = model.sourceData.frame.categories.chem_comp_bond;
if (!cat) return void 0;
return toTable(Schema.chem_comp_bond, cat);
}
export async function attachFromCifOrTable(model: Model, params: {
// optional Table source
wwPDB_apiSourceTable?: (model: Model) => Promise<Table<Schema['chem_comp_bond']>>
}) {
if (model.customProperties.has(Descriptor)) return true;
let chemCompBond: Table<Schema['chem_comp_bond']> | undefined = fromCifData(model);
if (chemCompBond === void 0 && params.wwPDB_apiSourceTable) {
const data = await params.wwPDB_apiSourceTable(model);
if (!data) return false;
chemCompBond = chemCompBondFromTable(model, data);
} else {
return false;
}
if (!chemCompBond) return false;
model.customProperties.add(Descriptor);
set(model, chemCompBond);
return true;
}
}
function chemCompBondFromTable(model: Model, table: Table<ChemCompBond.Schema['chem_comp_bond']>): Table<ChemCompBond.Schema['chem_comp_bond']> {
return Table.pick(table, ChemCompBond.Schema.chem_comp_bond, (i: number) => {
return model.properties.chemicalComponentMap.has(table.comp_id.value(i))
})
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment