sort.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { mmCIF_Database } from '../../../mol-io/reader/cif/schema/mmcif';
  7. import { createRangeArray, makeBuckets } from '../../../mol-data/util';
  8. import { Column, Table } from '../../../mol-data/db';
  9. import { RuntimeContext } from '../../../mol-task';
  10. export type SortedAtomSite = mmCIF_Database['atom_site'] & { sourceIndex: Column<number> }
  11. function isIdentity(xs: ArrayLike<number>) {
  12. for (let i = 0, _i = xs.length; i < _i; i++) {
  13. if (xs[i] !== i) return false;
  14. }
  15. return true;
  16. }
  17. export async function sortAtomSite(ctx: RuntimeContext, atom_site: mmCIF_Database['atom_site'], start: number, end: number) {
  18. const indices = createRangeArray(start, end - 1);
  19. const { label_entity_id, label_asym_id, label_seq_id } = atom_site;
  20. const entityBuckets = makeBuckets(indices, label_entity_id.value);
  21. if (ctx.shouldUpdate) await ctx.update();
  22. for (let ei = 0, _eI = entityBuckets.length - 1; ei < _eI; ei++) {
  23. const chainBuckets = makeBuckets(indices, label_asym_id.value, { start: entityBuckets[ei], end: entityBuckets[ei + 1] });
  24. for (let cI = 0, _cI = chainBuckets.length - 1; cI < _cI; cI++) {
  25. const aI = chainBuckets[cI];
  26. // are we in HETATM territory?
  27. if (label_seq_id.valueKind(aI) !== Column.ValueKind.Present) continue;
  28. makeBuckets(indices, label_seq_id.value, { sort: true, start: aI, end: chainBuckets[cI + 1] });
  29. if (ctx.shouldUpdate) await ctx.update();
  30. }
  31. if (ctx.shouldUpdate) await ctx.update();
  32. }
  33. if (isIdentity(indices) && indices.length === atom_site._rowCount) {
  34. return { atom_site, sourceIndex: Column.ofIntArray(indices) };
  35. }
  36. return {
  37. atom_site: Table.view(atom_site, atom_site._schema, indices) as mmCIF_Database['atom_site'],
  38. sourceIndex: Column.ofIntArray(indices)
  39. };
  40. }