From 5007f5fb723e72dec3b1768b0d8470e01981f898 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sun, 26 Apr 2020 13:05:39 -0700 Subject: [PATCH] added VolumeData.sourceData: ModelFormat --- .../{structure => }/format.ts | 0 src/mol-model-formats/structure/3dg.ts | 2 +- .../structure/basic/atomic.ts | 2 +- .../structure/basic/parser.ts | 2 +- src/mol-model-formats/structure/cif-core.ts | 2 +- .../structure/common/property.ts | 2 +- src/mol-model-formats/structure/cube.ts | 2 +- src/mol-model-formats/structure/gro.ts | 2 +- src/mol-model-formats/structure/mmcif.ts | 2 +- src/mol-model-formats/structure/mol.ts | 2 +- src/mol-model-formats/structure/psf.ts | 2 +- src/mol-model-formats/volume/ccp4.ts | 20 ++++++++++++++++- src/mol-model-formats/volume/cube.ts | 20 ++++++++++++++++- .../volume/density-server.ts | 22 ++++++++++++++++--- src/mol-model-formats/volume/dsn6.ts | 22 ++++++++++++++++--- src/mol-model-formats/volume/dx.ts | 20 ++++++++++++++++- src/mol-model/structure/model/model.ts | 2 +- src/mol-model/structure/topology/topology.ts | 2 +- src/mol-model/volume/data.ts | 5 ++++- 19 files changed, 111 insertions(+), 22 deletions(-) rename src/mol-model-formats/{structure => }/format.ts (100%) diff --git a/src/mol-model-formats/structure/format.ts b/src/mol-model-formats/format.ts similarity index 100% rename from src/mol-model-formats/structure/format.ts rename to src/mol-model-formats/format.ts diff --git a/src/mol-model-formats/structure/3dg.ts b/src/mol-model-formats/structure/3dg.ts index ca82890bf..0e829bdaf 100644 --- a/src/mol-model-formats/structure/3dg.ts +++ b/src/mol-model-formats/structure/3dg.ts @@ -6,7 +6,7 @@ import { Model } from '../../mol-model/structure/model'; import { Task } from '../../mol-task'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { Column, Table } from '../../mol-data/db'; import { EntityBuilder } from './common/entity'; import { File3DG } from '../../mol-io/reader/3dg/parser'; diff --git a/src/mol-model-formats/structure/basic/atomic.ts b/src/mol-model-formats/structure/basic/atomic.ts index d6dcc438d..de9c772db 100644 --- a/src/mol-model-formats/structure/basic/atomic.ts +++ b/src/mol-model-formats/structure/basic/atomic.ts @@ -16,7 +16,7 @@ import { ElementSymbol } from '../../../mol-model/structure/model/types'; import { Entities } from '../../../mol-model/structure/model/properties/common'; import { getAtomicDerivedData } from '../../../mol-model/structure/model/properties/utils/atomic-derived'; import { AtomSite } from './schema'; -import { ModelFormat } from '../format'; +import { ModelFormat } from '../../format'; import { SymmetryOperator } from '../../../mol-math/geometry'; import { MmcifFormat } from '../mmcif'; import { AtomSiteOperatorMappingSchema } from '../../../mol-model/structure/export/categories/atom_site_operator_mapping'; diff --git a/src/mol-model-formats/structure/basic/parser.ts b/src/mol-model-formats/structure/basic/parser.ts index 10273c258..bf7129e2a 100644 --- a/src/mol-model-formats/structure/basic/parser.ts +++ b/src/mol-model-formats/structure/basic/parser.ts @@ -15,7 +15,7 @@ import { getAtomicHierarchyAndConformation } from './atomic'; import { getCoarse, EmptyCoarse, CoarseData } from './coarse'; import { getSequence } from './sequence'; import { sortAtomSite } from './sort'; -import { ModelFormat } from '../format'; +import { ModelFormat } from '../../format'; import { getAtomicRanges } from '../../../mol-model/structure/model/properties/utils/atomic-ranges'; import { AtomSite, BasicData } from './schema'; import { getProperties } from './properties'; diff --git a/src/mol-model-formats/structure/cif-core.ts b/src/mol-model-formats/structure/cif-core.ts index 00d95f6f9..542489d1e 100644 --- a/src/mol-model-formats/structure/cif-core.ts +++ b/src/mol-model-formats/structure/cif-core.ts @@ -12,7 +12,7 @@ import { createModels } from './basic/parser'; import { BasicSchema, createBasic } from './basic/schema'; import { ComponentBuilder } from './common/component'; import { EntityBuilder } from './common/entity'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { CifCore_Database } from '../../mol-io/reader/cif/schema/cif-core'; import { CifFrame, CIF } from '../../mol-io/reader/cif'; import { Spacegroup, SpacegroupCell } from '../../mol-math/geometry'; diff --git a/src/mol-model-formats/structure/common/property.ts b/src/mol-model-formats/structure/common/property.ts index c5f6b277e..cbc1718f8 100644 --- a/src/mol-model-formats/structure/common/property.ts +++ b/src/mol-model-formats/structure/common/property.ts @@ -5,7 +5,7 @@ */ import { CustomPropertyDescriptor, Model } from '../../../mol-model/structure'; -import { ModelFormat } from '../format'; +import { ModelFormat } from '../../format'; class FormatRegistry<T> { private map = new Map<ModelFormat['kind'], (model: Model) => T | undefined>() diff --git a/src/mol-model-formats/structure/cube.ts b/src/mol-model-formats/structure/cube.ts index 1ab1a2829..3b72a034b 100644 --- a/src/mol-model-formats/structure/cube.ts +++ b/src/mol-model-formats/structure/cube.ts @@ -12,7 +12,7 @@ import { createModels } from './basic/parser'; import { BasicSchema, createBasic } from './basic/schema'; import { ComponentBuilder } from './common/component'; import { EntityBuilder } from './common/entity'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { CubeFile } from '../../mol-io/reader/cube/parser'; async function getModels(cube: CubeFile, ctx: RuntimeContext): Promise<Model[]> { diff --git a/src/mol-model-formats/structure/gro.ts b/src/mol-model-formats/structure/gro.ts index 88d699041..06093e2e1 100644 --- a/src/mol-model-formats/structure/gro.ts +++ b/src/mol-model-formats/structure/gro.ts @@ -6,7 +6,7 @@ import { Model } from '../../mol-model/structure/model'; import { Task } from '../../mol-task'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { GroFile, GroAtoms } from '../../mol-io/reader/gro/schema'; import { Column, Table } from '../../mol-data/db'; import { guessElementSymbolString } from './util'; diff --git a/src/mol-model-formats/structure/mmcif.ts b/src/mol-model-formats/structure/mmcif.ts index d71656526..7f3a337c7 100644 --- a/src/mol-model-formats/structure/mmcif.ts +++ b/src/mol-model-formats/structure/mmcif.ts @@ -7,7 +7,7 @@ import { Model } from '../../mol-model/structure/model/model'; import { Task } from '../../mol-task'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { CifFrame, CIF } from '../../mol-io/reader/cif'; import { mmCIF_Database } from '../../mol-io/reader/cif/schema/mmcif'; import { createModels } from './basic/parser'; diff --git a/src/mol-model-formats/structure/mol.ts b/src/mol-model-formats/structure/mol.ts index c23612ee9..dbfc11390 100644 --- a/src/mol-model-formats/structure/mol.ts +++ b/src/mol-model-formats/structure/mol.ts @@ -14,7 +14,7 @@ import { createModels } from './basic/parser'; import { BasicSchema, createBasic } from './basic/schema'; import { ComponentBuilder } from './common/component'; import { EntityBuilder } from './common/entity'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { IndexPairBonds } from './property/bonds/index-pair'; async function getModels(mol: MolFile, ctx: RuntimeContext): Promise<Model[]> { diff --git a/src/mol-model-formats/structure/psf.ts b/src/mol-model-formats/structure/psf.ts index 73383d745..08446d212 100644 --- a/src/mol-model-formats/structure/psf.ts +++ b/src/mol-model-formats/structure/psf.ts @@ -12,7 +12,7 @@ import { guessElementSymbolString } from './util'; import { MoleculeType, getMoleculeType } from '../../mol-model/structure/model/types'; import { getChainId } from './common/util'; import { Task } from '../../mol-task'; -import { ModelFormat } from './format'; +import { ModelFormat } from '../format'; import { Topology } from '../../mol-model/structure/topology/topology'; import { createBasic, BasicSchema } from './basic/schema'; diff --git a/src/mol-model-formats/volume/ccp4.ts b/src/mol-model-formats/volume/ccp4.ts index a9e5e703f..8ccf5ad7a 100644 --- a/src/mol-model-formats/volume/ccp4.ts +++ b/src/mol-model-formats/volume/ccp4.ts @@ -13,6 +13,7 @@ import { degToRad } from '../../mol-math/misc'; import { getCcp4ValueType } from '../../mol-io/reader/ccp4/parser'; import { TypedArrayValueType } from '../../mol-io/common/typed-array'; import { arrayMin, arrayRms, arrayMean, arrayMax } from '../../mol-util/array'; +import { ModelFormat } from '../format'; /** When available (e.g. in MRC files) use ORIGIN records instead of N[CRS]START */ export function getCcp4Origin(header: Ccp4Header): Vec3 { @@ -75,7 +76,24 @@ export function volumeFromCcp4(source: Ccp4File, params?: { voxelSize?: Vec3, of max: isNaN(header.AMAX) ? arrayMax(values) : header.AMAX, mean: isNaN(header.AMEAN) ? arrayMean(values) : header.AMEAN, sigma: (isNaN(header.ARMS) || header.ARMS === 0) ? arrayRms(values) : header.ARMS - } + }, + sourceData: Ccp4Format.create(source) }; }); +} + +// + +export { Ccp4Format }; + +type Ccp4Format = ModelFormat<Ccp4File> + +namespace Ccp4Format { + export function is(x: ModelFormat): x is Ccp4Format { + return x.kind === 'ccp4'; + } + + export function create(ccp4: Ccp4File): Ccp4Format { + return { kind: 'ccp4', name: ccp4.name, data: ccp4 }; + } } \ No newline at end of file diff --git a/src/mol-model-formats/volume/cube.ts b/src/mol-model-formats/volume/cube.ts index 8ed1613f9..416944d77 100644 --- a/src/mol-model-formats/volume/cube.ts +++ b/src/mol-model-formats/volume/cube.ts @@ -9,6 +9,7 @@ import { Mat4, Tensor } from '../../mol-math/linear-algebra'; import { VolumeData } from '../../mol-model/volume/data'; import { Task } from '../../mol-task'; import { arrayMax, arrayMean, arrayMin, arrayRms } from '../../mol-util/array'; +import { ModelFormat } from '../format'; export function volumeFromCube(source: CubeFile, params?: { dataIndex?: number, label?: string }): Task<VolumeData> { return Task.create<VolumeData>('Create Volume Data', async () => { @@ -51,7 +52,24 @@ export function volumeFromCube(source: CubeFile, params?: { dataIndex?: number, max: arrayMax(values), mean: arrayMean(values), sigma: arrayRms(values) - } + }, + sourceData: CubeFormat.create(source) }; }); +} + +// + +export { CubeFormat }; + +type CubeFormat = ModelFormat<CubeFile> + +namespace CubeFormat { + export function is(x: ModelFormat): x is CubeFormat { + return x.kind === 'cube'; + } + + export function create(cube: CubeFile): CubeFormat { + return { kind: 'cube', name: cube.name, data: cube }; + } } \ No newline at end of file diff --git a/src/mol-model-formats/volume/density-server.ts b/src/mol-model-formats/volume/density-server.ts index 57c43fa92..bb35f0140 100644 --- a/src/mol-model-formats/volume/density-server.ts +++ b/src/mol-model-formats/volume/density-server.ts @@ -9,8 +9,9 @@ import { VolumeData } from '../../mol-model/volume/data'; import { Task } from '../../mol-task'; import { SpacegroupCell, Box3D } from '../../mol-math/geometry'; import { Tensor, Vec3 } from '../../mol-math/linear-algebra'; +import { ModelFormat } from '../format'; -function volumeFromDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> { +export function volumeFromDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> { return Task.create<VolumeData>('Create Volume Data', async ctx => { const { volume_data_3d_info: info, volume_data_3d: values } = source; const cell = SpacegroupCell.create( @@ -41,9 +42,24 @@ function volumeFromDensityServerData(source: DensityServer_Data_Database): Task< max: info.max_sampled.value(0), mean: info.mean_sampled.value(0), sigma: info.sigma_sampled.value(0) - } + }, + sourceData: DscifFormat.create(source) }; }); } -export { volumeFromDensityServerData }; \ No newline at end of file +// + +export { DscifFormat }; + +type DscifFormat = ModelFormat<DensityServer_Data_Database> + +namespace DscifFormat { + export function is(x: ModelFormat): x is DscifFormat { + return x.kind === 'dscif'; + } + + export function create(dscif: DensityServer_Data_Database): DscifFormat { + return { kind: 'dscif', name: dscif._name, data: dscif }; + } +} \ No newline at end of file diff --git a/src/mol-model-formats/volume/dsn6.ts b/src/mol-model-formats/volume/dsn6.ts index 42b3fe632..f6ef76cd6 100644 --- a/src/mol-model-formats/volume/dsn6.ts +++ b/src/mol-model-formats/volume/dsn6.ts @@ -11,8 +11,9 @@ import { Tensor, Vec3 } from '../../mol-math/linear-algebra'; import { degToRad } from '../../mol-math/misc'; import { Dsn6File } from '../../mol-io/reader/dsn6/schema'; import { arrayMin, arrayMax, arrayMean, arrayRms } from '../../mol-util/array'; +import { ModelFormat } from '../format'; -function volumeFromDsn6(source: Dsn6File, params?: { voxelSize?: Vec3, label?: string }): Task<VolumeData> { +export function volumeFromDsn6(source: Dsn6File, params?: { voxelSize?: Vec3, label?: string }): Task<VolumeData> { return Task.create<VolumeData>('Create Volume Data', async ctx => { const { header, values } = source; const size = Vec3.create(header.xlen, header.ylen, header.zlen); @@ -40,9 +41,24 @@ function volumeFromDsn6(source: Dsn6File, params?: { voxelSize?: Vec3, label?: s max: arrayMax(values), mean: arrayMean(values), sigma: header.sigma !== undefined ? header.sigma : arrayRms(values) - } + }, + sourceData: Dsn6Format.create(source) }; }); } -export { volumeFromDsn6 }; \ No newline at end of file +// + +export { Dsn6Format }; + +type Dsn6Format = ModelFormat<Dsn6File> + +namespace Dsn6Format { + export function is(x: ModelFormat): x is Dsn6Format { + return x.kind === 'dsn6'; + } + + export function create(dsn6: Dsn6File): Dsn6Format { + return { kind: 'dsn6', name: dsn6.name, data: dsn6 }; + } +} \ No newline at end of file diff --git a/src/mol-model-formats/volume/dx.ts b/src/mol-model-formats/volume/dx.ts index 79afcf071..2ec9007ca 100644 --- a/src/mol-model-formats/volume/dx.ts +++ b/src/mol-model-formats/volume/dx.ts @@ -9,6 +9,7 @@ import { Mat4, Tensor } from '../../mol-math/linear-algebra'; import { VolumeData } from '../../mol-model/volume/data'; import { Task } from '../../mol-task'; import { arrayMax, arrayMean, arrayMin, arrayRms } from '../../mol-util/array'; +import { ModelFormat } from '../format'; export function volumeFromDx(source: DxFile, params?: { label?: string }): Task<VolumeData> { return Task.create<VolumeData>('Create Volume Data', async () => { @@ -28,7 +29,24 @@ export function volumeFromDx(source: DxFile, params?: { label?: string }): Task< max: arrayMax(values), mean: arrayMean(values), sigma: arrayRms(values) - } + }, + sourceData: DxFormat.create(source) }; }); +} + +// + +export { DxFormat }; + +type DxFormat = ModelFormat<DxFile> + +namespace DxFormat { + export function is(x: ModelFormat): x is DxFormat { + return x.kind === 'dx'; + } + + export function create(dx: DxFile): DxFormat { + return { kind: 'dx', name: dx.name, data: dx }; + } } \ No newline at end of file diff --git a/src/mol-model/structure/model/model.ts b/src/mol-model/structure/model/model.ts index 2d4a95177..00e90d1c9 100644 --- a/src/mol-model/structure/model/model.ts +++ b/src/mol-model/structure/model/model.ts @@ -12,7 +12,7 @@ import { CoarseHierarchy, CoarseConformation } from './properties/coarse'; import { Entities, ChemicalComponentMap, MissingResidues, StructAsymMap } from './properties/common'; import { CustomProperties } from '../common/custom-property'; import { SaccharideComponentMap } from '../structure/carbohydrates/constants'; -import { ModelFormat } from '../../../mol-model-formats/structure/format'; +import { ModelFormat } from '../../../mol-model-formats/format'; import { calcModelCenter } from './util'; import { Vec3 } from '../../../mol-math/linear-algebra'; import { Mutable } from '../../../mol-util/type-helpers'; diff --git a/src/mol-model/structure/topology/topology.ts b/src/mol-model/structure/topology/topology.ts index f88632543..f65e90ce2 100644 --- a/src/mol-model/structure/topology/topology.ts +++ b/src/mol-model/structure/topology/topology.ts @@ -7,7 +7,7 @@ import { UUID } from '../../../mol-util'; import { Column } from '../../../mol-data/db'; import { BasicData } from '../../../mol-model-formats/structure/basic/schema'; -import { ModelFormat } from '../../../mol-model-formats/structure/format'; +import { ModelFormat } from '../../../mol-model-formats/format'; export { Topology }; diff --git a/src/mol-model/volume/data.ts b/src/mol-model/volume/data.ts index b80149c85..2ab568112 100644 --- a/src/mol-model/volume/data.ts +++ b/src/mol-model/volume/data.ts @@ -8,6 +8,7 @@ import { SpacegroupCell, Box3D } from '../../mol-math/geometry'; import { Tensor, Mat4, Vec3 } from '../../mol-math/linear-algebra'; import { equalEps } from '../../mol-math/linear-algebra/3d/common'; +import { ModelFormat } from '../../mol-model-formats/format'; /** The basic unit cell that contains the data. */ interface VolumeDataBase { @@ -20,6 +21,7 @@ interface VolumeDataBase { mean: number, sigma: number }> + readonly sourceData: ModelFormat, } interface VolumeData extends VolumeDataBase { @@ -30,7 +32,8 @@ namespace VolumeData { export const One: VolumeData = { transform: { kind: 'matrix', matrix: Mat4.identity() }, data: Tensor.create(Tensor.Space([1, 1, 1], [0, 1, 2]), Tensor.Data1([0])), - dataStats: { min: 0, max: 0, mean: 0, sigma: 0 } + dataStats: { min: 0, max: 0, mean: 0, sigma: 0 }, + sourceData: { kind: '', data: '', name: '' } }; const _scale = Mat4.zero(), _translate = Mat4.zero(); -- GitLab