diff --git a/src/mol-io/reader/sdf/parser.ts b/src/mol-io/reader/sdf/parser.ts index cced43dd6320dde488417cc009448ea24605b77c..1db788b4247be4672b377163d319550cc35b20ce 100644 --- a/src/mol-io/reader/sdf/parser.ts +++ b/src/mol-io/reader/sdf/parser.ts @@ -13,14 +13,17 @@ import { Tokenizer, TokenBuilder } from '../common/text/tokenizer'; import { TokenColumnProvider as TokenColumn } from '../common/text/column/token'; /** http://c4.cabrillo.edu/404/ctfile.pdf - page 41 */ + +export interface SdfFileCompound { + readonly molFile: MolFile, + readonly dataItems: { + readonly dataHeader: Column<string>, + readonly data: Column<string> + } +} + export interface SdfFile { - readonly compounds: { - readonly molFile: MolFile, - readonly dataItems: { - readonly dataHeader: Column<string>, - readonly data: Column<string> - } - }[] + readonly compounds: SdfFileCompound[] } const delimiter = '$$$$'; diff --git a/src/mol-model-formats/structure/mol.ts b/src/mol-model-formats/structure/mol.ts index fb66c34e8e2e80da8dce161d42c7f768e10707ad..b6847e852adbf7b8faf3e2fed75ffd21f4c37a86 100644 --- a/src/mol-model-formats/structure/mol.ts +++ b/src/mol-model-formats/structure/mol.ts @@ -17,7 +17,7 @@ import { ModelFormat } from '../format'; import { IndexPairBonds } from './property/bonds/index-pair'; import { Trajectory } from '../../mol-model/structure'; -async function getModels(mol: MolFile, ctx: RuntimeContext) { +export async function getMolModels(mol: MolFile, format: ModelFormat<any> | undefined, ctx: RuntimeContext) { const { atoms, bonds } = mol; const MOL = Column.ofConst('MOL', mol.atoms.count, Column.Schema.str); @@ -61,7 +61,7 @@ async function getModels(mol: MolFile, ctx: RuntimeContext) { atom_site }); - const models = await createModels(basics, MolFormat.create(mol), ctx); + const models = await createModels(basics, format ?? MolFormat.create(mol), ctx); if (models.frameCount > 0) { const indexA = Column.ofIntArray(Column.mapToArray(bonds.atomIdxA, x => x - 1, Int32Array)); @@ -91,5 +91,5 @@ namespace MolFormat { } export function trajectoryFromMol(mol: MolFile): Task<Trajectory> { - return Task.create('Parse MOL', ctx => getModels(mol, ctx)); + return Task.create('Parse MOL', ctx => getMolModels(mol, void 0, ctx)); } diff --git a/src/mol-model-formats/structure/sdf.ts b/src/mol-model-formats/structure/sdf.ts new file mode 100644 index 0000000000000000000000000000000000000000..77f9b6bf8176d6ba14331503f7d868bd8c4f0ff0 --- /dev/null +++ b/src/mol-model-formats/structure/sdf.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author David Sehnal <david.sehnal@gmail.com> + */ + +import { SdfFileCompound } from '../../mol-io/reader/sdf/parser'; +import { Trajectory } from '../../mol-model/structure'; +import { Task } from '../../mol-task'; +import { ModelFormat } from '../format'; +import { getMolModels } from './mol'; + +export { SdfFormat }; + +type SdfFormat = ModelFormat<SdfFileCompound> + +namespace SdfFormat { + export function is(x?: ModelFormat): x is SdfFormat { + return x?.kind === 'sdf'; + } + + export function create(mol: SdfFileCompound): SdfFormat { + return { kind: 'sdf', name: mol.molFile.title, data: mol }; + } +} + +export function trajectoryFromSdf(mol: SdfFileCompound): Task<Trajectory> { + return Task.create('Parse SDF', ctx => getMolModels(mol.molFile, SdfFormat.create(mol), ctx)); +} diff --git a/src/mol-plugin-state/transforms/model.ts b/src/mol-plugin-state/transforms/model.ts index 68e9dd9676e75cb59a669105af0dd736ce8fe02c..1d5a79d4fa4e0dc71a96052f1b4fafab49ad1ecb 100644 --- a/src/mol-plugin-state/transforms/model.ts +++ b/src/mol-plugin-state/transforms/model.ts @@ -40,6 +40,7 @@ import { coordinatesFromXtc } from '../../mol-model-formats/structure/xtc'; import { parseXyz } from '../../mol-io/reader/xyz/parser'; import { trajectoryFromXyz } from '../../mol-model-formats/structure/xyz'; import { parseSdf } from '../../mol-io/reader/sdf/parser'; +import { trajectoryFromSdf } from '../../mol-model-formats/structure/sdf'; export { CoordinatesFromDcd }; export { CoordinatesFromXtc }; @@ -308,8 +309,8 @@ const TrajectoryFromSDF = PluginStateTransform.BuiltIn({ const models: Model[] = []; - for (const { molFile } of parsed.result.compounds) { - const traj = await trajectoryFromMol(molFile).runInContext(ctx); + for (const compound of parsed.result.compounds) { + const traj = await trajectoryFromSdf(compound).runInContext(ctx); for (let i = 0; i < traj.frameCount; i++) { models.push(await Task.resolveInContext(traj.getFrameAtIndex(i), ctx)); }