diff --git a/src/apps/render-test/state.ts b/src/apps/render-test/state.ts index c0e92f901c4d9955f900e78f03c193acf2ce28bc..58f3404e7347b1632c2885754c8a57a20b0c865f 100644 --- a/src/apps/render-test/state.ts +++ b/src/apps/render-test/state.ts @@ -178,7 +178,8 @@ export default class State { if (this.spacefillRepr) this.viewer.remove(this.spacefillRepr) if (this.pdbId.length !== 4) return this.loading.next(true) - this.setModel((await getModelFromPdbId(this.pdbId))[0]) + const models = await getModelFromPdbId(this.pdbId); + this.setModel(models[0]) } setVolume(volume: Volume) { diff --git a/src/apps/render-test/utils/index.ts b/src/apps/render-test/utils/index.ts index 54486ffb3323d4808327e4ed013c332e38ed04de..b5eb271c7a63815185263d5e7185934d33b4ed12 100644 --- a/src/apps/render-test/utils/index.ts +++ b/src/apps/render-test/utils/index.ts @@ -29,7 +29,7 @@ export async function parseCif(data: string|Uint8Array) { export async function getModelFromPdbId(pdbid: string) { const cif = await downloadCif(`https://files.rcsb.org/download/${pdbid}.cif`, false) - return Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) }) + return Run(Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) })) } const readFileAsText = (file: File) => { @@ -46,7 +46,7 @@ const readFileAsText = (file: File) => { export async function getModelFromFile(file: File) { const cif = await parseCif(await readFileAsText(file)) - return Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) }) + return Run(Model.create({ kind: 'mmCIF', data: CIF.schema.mmCIF(cif.blocks[0]) })) } export type Volume = { source: DensityServer_Data_Database, volume: VolumeData } diff --git a/src/apps/structure-info/model.ts b/src/apps/structure-info/model.ts index 15ee55fd8578f3d636fe1173b980fd6990d42f38..3f7957df85e57f94552e10188669cb6059f5d30d 100644 --- a/src/apps/structure-info/model.ts +++ b/src/apps/structure-info/model.ts @@ -16,6 +16,7 @@ import { OrderedSet } from 'mol-data/int'; import { Table } from 'mol-data/db'; import { mmCIF_Database } from 'mol-io/reader/cif/schema/mmcif'; import { openCif, downloadCif } from './helpers'; +import { Run } from 'mol-task'; async function downloadFromPdb(pdb: string) { @@ -117,7 +118,7 @@ export function printIHMModels(model: Model) { } async function run(mmcif: mmCIF_Database) { - const models = Model.create({ kind: 'mmCIF', data: mmcif }); + const models = await Run(Model.create({ kind: 'mmCIF', data: mmcif })); const structure = Structure.ofModel(models[0]); printSequence(models[0]); printIHMModels(models[0]); diff --git a/src/mol-model/structure/model/formats/mmcif.ts b/src/mol-model/structure/model/formats/mmcif.ts index 3f68d54440d673ad55a30bd8b7e6fefec442df8d..d2a2338f386b8d5fd5c91c3f766f22f423097ed8 100644 --- a/src/mol-model/structure/model/formats/mmcif.ts +++ b/src/mol-model/structure/model/formats/mmcif.ts @@ -21,6 +21,7 @@ import { getIHMCoarse } from './mmcif/ihm'; import { getSequence } from './mmcif/sequence'; import mmCIF_Format = Format.mmCIF +import { Task } from 'mol-task'; function findModelBounds({ data }: mmCIF_Format, startIndex: number) { const num = data.atom_site.pdbx_PDB_model_num; @@ -154,25 +155,27 @@ function createModel(format: mmCIF_Format, bounds: Interval, previous?: Model): }; } -function buildModels(format: mmCIF_Format): ReadonlyArray<Model> { - const atomCount = format.data.atom_site._rowCount; - const isIHM = format.data.ihm_model_list._rowCount > 0; - - if (atomCount === 0) { - return isIHM - ? [createModel(format, Interval.Empty, void 0)] - : []; - } - - const models: Model[] = []; - let modelStart = 0; - while (modelStart < atomCount) { - const bounds = findModelBounds(format, modelStart); - const model = createModel(format, bounds, models.length > 0 ? models[models.length - 1] : void 0); - models.push(model); - modelStart = Interval.end(bounds); - } - return models; +function buildModels(format: mmCIF_Format): Task<ReadonlyArray<Model>> { + return Task.create('Create mmCIF Model', async ctx => { + const atomCount = format.data.atom_site._rowCount; + const isIHM = format.data.ihm_model_list._rowCount > 0; + + if (atomCount === 0) { + return isIHM + ? [createModel(format, Interval.Empty, void 0)] + : []; + } + + const models: Model[] = []; + let modelStart = 0; + while (modelStart < atomCount) { + const bounds = findModelBounds(format, modelStart); + const model = createModel(format, bounds, models.length > 0 ? models[models.length - 1] : void 0); + models.push(model); + modelStart = Interval.end(bounds); + } + return models; + }); } export default buildModels; \ No newline at end of file diff --git a/src/mol-model/structure/structure/structure.ts b/src/mol-model/structure/structure/structure.ts index efe4e8bde3ba92dd75c98953f01ccc5ec4e3370a..93d7d4b1405311c7927f2704c637ad0a1ac8e66e 100644 --- a/src/mol-model/structure/structure/structure.ts +++ b/src/mol-model/structure/structure/structure.ts @@ -7,7 +7,7 @@ import { IntMap, SortedArray, Iterator } from 'mol-data/int' import { UniqueArray } from 'mol-data/generic' import { SymmetryOperator } from 'mol-math/geometry/symmetry-operator' -import { Model, Format } from '../model' +import { Model } from '../model' import { sortArray, sort, arraySwap, hash1 } from 'mol-data/util'; import Element from './element' import Unit from './unit' @@ -85,11 +85,6 @@ namespace Structure { export function create(units: ReadonlyArray<Unit>): Structure { return new Structure(units); } - export function ofData(format: Format) { - const models = Model.create(format); - return models.map(ofModel); - } - export function ofModel(model: Model): Structure { const chains = model.atomicHierarchy.chainSegments; const builder = new StructureBuilder(); diff --git a/src/perf-tests/lookup3d.ts b/src/perf-tests/lookup3d.ts index 3875a8c138aa79364204574cebb6b97d2c9a17b0..1245d80d4cf4f2509d15316fa9871aae83aa54e6 100644 --- a/src/perf-tests/lookup3d.ts +++ b/src/perf-tests/lookup3d.ts @@ -34,7 +34,7 @@ export async function readCIF(path: string) { const data = parsed.result.blocks[0]; const mmcif = CIF.schema.mmCIF(data); - const models = Model.create({ kind: 'mmCIF', data: mmcif }); + const models = await Run(Model.create({ kind: 'mmCIF', data: mmcif })); const structures = models.map(Structure.ofModel); return { mmcif, models, structures }; diff --git a/src/perf-tests/structure.ts b/src/perf-tests/structure.ts index 92831adec5440d24c6a0eee1e44491ccfca12211..e859ff78eb862628727f5d66f17d11a20195123e 100644 --- a/src/perf-tests/structure.ts +++ b/src/perf-tests/structure.ts @@ -74,7 +74,7 @@ export async function readCIF(path: string) { console.timeEnd('schema') console.time('buildModels') - const models = Model.create({ kind: 'mmCIF', data: mmcif }); + const models = await Run(Model.create({ kind: 'mmCIF', data: mmcif })); console.timeEnd('buildModels') const structures = models.map(Structure.ofModel);