Skip to content
Snippets Groups Projects
Unverified Commit cbcd6b99 authored by Alexander Rose's avatar Alexander Rose Committed by GitHub
Browse files

Merge pull request #107 from molstar/remove-3dg

remove 3dg in favor of g3d (#93)
parents cd872b47 ee5c098a
No related branches found
No related tags found
No related merge requests found
/**
* Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { ReaderResult as Result } from '../result';
import { Task } from '../../../mol-task';
import { parseCsv } from '../csv/parser';
import { Column, Table } from '../../../mol-data/db';
import { toTable } from '../cif/schema';
import Schema = Column.Schema
import { CsvTable } from '../csv/data-model';
export const Schema3DG = {
/** Chromosome name */
chromosome: Schema.str,
/** Base position */
position: Schema.int,
/** X coordinate */
x: Schema.float,
/** Y coordinate */
y: Schema.float,
/** Z coordinate */
z: Schema.float,
};
export type Schema3DG = typeof Schema3DG
export interface File3DG {
table: Table<Schema3DG>
}
const FieldNames = [ 'chromosome', 'position', 'x', 'y', 'z' ];
function categoryFromTable(name: string, table: CsvTable) {
return {
name,
rowCount: table.rowCount,
fieldNames: FieldNames,
getField: (name: string) => {
return table.getColumn(FieldNames.indexOf(name).toString());
}
};
}
export function parse3DG(data: string) {
return Task.create<Result<File3DG>>('Parse 3DG', async ctx => {
const opts = { quote: '', comment: '#', delimiter: '\t', noColumnNames: true };
const csvFile = await parseCsv(data, opts).runInContext(ctx);
if (csvFile.isError) return Result.error(csvFile.message, csvFile.line);
const category = categoryFromTable('3dg', csvFile.result.table);
const table = toTable(Schema3DG, category);
return Result.success({ table });
});
}
\ 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 { parse3DG } from '../3dg/parser';
const basic3dgString = `1(mat) 1420000 0.791377837067 10.9947291355 -13.1882897693
1(mat) 1440000 -0.268241283699 10.5200875887 -13.0896257278
1(mat) 1460000 -1.3853075236 10.5513787498 -13.1440142173
1(mat) 1480000 -1.55984101733 11.4340829129 -13.6026301209
1(mat) 1500000 -0.770991778399 11.4758488546 -14.5881137222
1(mat) 1520000 -0.0848245107875 12.2624690808 -14.354289628
1(mat) 1540000 -0.458643807046 12.5985791771 -13.4701149287
1(mat) 1560000 -0.810322906201 12.2461643989 -12.3172933413
1(mat) 1580000 -2.08211172035 12.8886838656 -12.8742007778
1(mat) 1600000 -3.52093948201 13.1850935438 -12.4118684428`;
describe('3dg reader', () => {
it('basic', async () => {
const parsed = await parse3DG(basic3dgString).run();
expect(parsed.isError).toBe(false);
if (parsed.isError) return;
const { chromosome, position, x, y, z } = parsed.result.table;
expect(chromosome.value(0)).toBe('1(mat)');
expect(position.value(1)).toBe(1440000);
expect(x.value(5)).toBe(-0.0848245107875);
expect(y.value(5)).toBe(12.2624690808);
expect(z.value(5)).toBe(-14.354289628);
});
});
\ No newline at end of file
/**
* Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Task } from '../../mol-task';
import { ModelFormat } from '../format';
import { Column, Table } from '../../mol-data/db';
import { EntityBuilder } from './common/entity';
import { File3DG } from '../../mol-io/reader/3dg/parser';
import { fillSerial } from '../../mol-util/array';
import { MoleculeType } from '../../mol-model/structure/model/types';
import { BasicSchema, createBasic } from './basic/schema';
import { createModels } from './basic/parser';
import { Trajectory } from '../../mol-model/structure';
function getBasic(table: File3DG['table']) {
const entityIds = new Array<string>(table._rowCount);
const entityBuilder = new EntityBuilder();
const seqIdStarts = table.position.toArray({ array: Uint32Array });
const seqIdEnds = new Uint32Array(table._rowCount);
const stride = seqIdStarts[1] - seqIdStarts[0];
const objectRadius = stride / 3500;
for (let i = 0, il = table._rowCount; i < il; ++i) {
const chr = table.chromosome.value(i);
const entityId = entityBuilder.getEntityId(chr, MoleculeType.DNA, chr);
entityIds[i] = entityId;
seqIdEnds[i] = seqIdStarts[i] + stride - 1;
}
const ihm_sphere_obj_site = Table.ofPartialColumns(BasicSchema.ihm_sphere_obj_site, {
id: Column.ofIntArray(fillSerial(new Uint32Array(table._rowCount))),
entity_id: Column.ofStringArray(entityIds),
seq_id_begin: Column.ofIntArray(seqIdStarts),
seq_id_end: Column.ofIntArray(seqIdEnds),
asym_id: table.chromosome,
Cartn_x: Column.ofFloatArray(Column.mapToArray(table.x, x => x * 10, Float32Array)),
Cartn_y: Column.ofFloatArray(Column.mapToArray(table.y, y => y * 10, Float32Array)),
Cartn_z: Column.ofFloatArray(Column.mapToArray(table.z, z => z * 10, Float32Array)),
object_radius: Column.ofConst(objectRadius, table._rowCount, Column.Schema.float),
rmsf: Column.ofConst(0, table._rowCount, Column.Schema.float),
model_id: Column.ofConst(1, table._rowCount, Column.Schema.int),
}, table._rowCount);
return createBasic({
entity: entityBuilder.getEntityTable(),
ihm_model_list: Table.ofPartialColumns(BasicSchema.ihm_model_list, {
model_id: Column.ofIntArray([1]),
model_name: Column.ofStringArray(['3DG Model']),
}, 1),
ihm_sphere_obj_site
});
}
//
export { Format3dg };
type Format3dg = ModelFormat<File3DG>
namespace Format3dg {
export function is(x: ModelFormat): x is Format3dg {
return x.kind === '3dg';
}
export function from3dg(file3dg: File3DG): Format3dg {
return { kind: '3dg', name: '3DG', data: file3dg };
}
}
export function trajectoryFrom3DG(file3dg: File3DG): Task<Trajectory> {
return Task.create('Parse 3DG', async ctx => {
const format = Format3dg.from3dg(file3dg);
const basic = getBasic(file3dg.table);
return createModels(basic, format, ctx);
});
}
......@@ -113,15 +113,6 @@ export const GroProvider: TrajectoryFormatProvider = {
visuals: defaultVisuals
};
export const Provider3dg: TrajectoryFormatProvider = {
label: '3DG',
description: '3DG',
category: TrajectoryFormatCategory,
stringExtensions: ['3dg'],
parse: directTrajectory(StateTransforms.Model.TrajectoryFrom3DG),
visuals: defaultVisuals
};
export const MolProvider: TrajectoryFormatProvider = {
label: 'MOL/SDF',
description: 'MOL/SDF',
......@@ -146,7 +137,6 @@ export const BuiltInTrajectoryFormats = [
['pdb', PdbProvider] as const,
['pdbqt', PdbqtProvider] as const,
['gro', GroProvider] as const,
['3dg', Provider3dg] as const,
['mol', MolProvider] as const,
['mol2', Mol2Provider] as const,
] as const;
......
......@@ -5,7 +5,6 @@
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { File3DG } from '../mol-io/reader/3dg/parser';
import { Ccp4File } from '../mol-io/reader/ccp4/schema';
import { CifFile } from '../mol-io/reader/cif';
import { DcdFile } from '../mol-io/reader/dcd/parser';
......@@ -83,7 +82,6 @@ export namespace PluginStateObject {
{ kind: 'cif', data: CifFile } |
{ kind: 'pdb', data: CifFile } |
{ kind: 'gro', data: CifFile } |
{ kind: '3dg', data: File3DG } |
{ kind: 'dcd', data: DcdFile } |
{ kind: 'ccp4', data: Ccp4File } |
{ kind: 'dsn6', data: Dsn6File } |
......
......@@ -5,13 +5,11 @@
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { parse3DG } from '../../mol-io/reader/3dg/parser';
import { parseDcd } from '../../mol-io/reader/dcd/parser';
import { parseGRO } from '../../mol-io/reader/gro/parser';
import { parsePDB } from '../../mol-io/reader/pdb/parser';
import { Mat4, Vec3 } from '../../mol-math/linear-algebra';
import { shapeFromPly } from '../../mol-model-formats/shape/ply';
import { trajectoryFrom3DG } from '../../mol-model-formats/structure/3dg';
import { coordinatesFromDcd } from '../../mol-model-formats/structure/dcd';
import { trajectoryFromGRO } from '../../mol-model-formats/structure/gro';
import { trajectoryFromMmCIF } from '../../mol-model-formats/structure/mmcif';
......@@ -52,7 +50,6 @@ export { TrajectoryFromMOL };
export { TrajectoryFromMOL2 };
export { TrajectoryFromCube };
export { TrajectoryFromCifCore };
export { TrajectoryFrom3DG };
export { ModelFromTrajectory };
export { StructureFromTrajectory };
export { StructureFromModel };
......@@ -339,24 +336,6 @@ const TrajectoryFromCifCore = PluginStateTransform.BuiltIn({
}
});
type TrajectoryFrom3DG = typeof TrajectoryFrom3DG
const TrajectoryFrom3DG = PluginStateTransform.BuiltIn({
name: 'trajectory-from-3dg',
display: { name: 'Parse 3DG', description: 'Parse 3DG string and create trajectory.' },
from: [SO.Data.String],
to: SO.Molecule.Trajectory
})({
apply({ a }) {
return Task.create('Parse 3DG', async ctx => {
const parsed = await parse3DG(a.data).runInContext(ctx);
if (parsed.isError) throw new Error(parsed.message);
const models = await trajectoryFrom3DG(parsed.result).runInContext(ctx);
const props = trajectoryProps(models);
return new SO.Molecule.Trajectory(models, props);
});
}
});
const plus1 = (v: number) => v + 1, minus1 = (v: number) => v - 1;
type ModelFromTrajectory = typeof ModelFromTrajectory
const ModelFromTrajectory = PluginStateTransform.BuiltIn({
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment