mapping.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { Table } from '../../mol-data/db';
  7. import { CifWriter } from '../../mol-io/writer/cif';
  8. import * as S from './schemas';
  9. // import { getCategoryInstanceProvider } from './utils'
  10. export default function create(allData: any) {
  11. const mols = Object.keys(allData);
  12. const enc = CifWriter.createEncoder();
  13. enc.startDataBlock(mols[0]);
  14. if (!mols.length) return enc.getData();
  15. const data = allData[mols[0]];
  16. const sources = getSources(data);
  17. if (!sources._rowCount) return enc.getData();
  18. enc.writeCategory({ name: `pdbx_domain_annotation_sources`, instance: () => CifWriter.Category.ofTable(sources) });
  19. for (const cat of Object.keys(S.categories)) {
  20. writeDomain(enc, getDomain(cat, (S.categories as any)[cat], data));
  21. }
  22. return enc.getData();
  23. }
  24. interface DomainAnnotation {
  25. name: string,
  26. domains: Table<any>,
  27. mappings: Table<S.mapping>
  28. }
  29. type MappingRow = Table.Row<S.mapping>;
  30. function writeDomain(enc: CifWriter.Encoder, domain: DomainAnnotation | undefined) {
  31. if (!domain) return;
  32. enc.writeCategory({ name: `pdbx_${domain.name}_domain_annotation`, instance: () => CifWriter.Category.ofTable(domain.domains) });
  33. enc.writeCategory({ name: `pdbx_${domain.name}_domain_mapping`, instance: () => CifWriter.Category.ofTable(domain.mappings) });
  34. }
  35. function getSources(data: any): Table<S.Sources> {
  36. const rows: Table.Row<S.Sources>[] = [];
  37. for (const name of Object.keys(S.categories)) {
  38. if (!data[name]) continue;
  39. const row: Table.Row<S.Sources> = { id: name, count: Object.keys(data[name]).length };
  40. if (row.count > 0) rows.push(row);
  41. }
  42. return Table.ofRows(S.Sources, rows);
  43. }
  44. function getMappings(startId: number, group_id: number, mappings: any): MappingRow[] {
  45. const rows: MappingRow[] = [];
  46. const n = (v: any) => v === null ? void 0 : v;
  47. for (const entry of mappings) {
  48. if (entry.start && entry.end) {
  49. rows.push({
  50. id: startId++,
  51. group_id,
  52. label_entity_id: '' + entry.entity_id,
  53. label_asym_id: entry.struct_asym_id,
  54. auth_asym_id: entry.chain_id,
  55. beg_label_seq_id: n(entry.start.residue_number),
  56. beg_auth_seq_id: n(entry.start.author_residue_number),
  57. pdbx_beg_PDB_ins_code: entry.start.author_insertion_code,
  58. end_label_seq_id: n(entry.end.residue_number),
  59. end_auth_seq_id: n(entry.end.author_residue_number),
  60. pdbx_end_PDB_ins_code: entry.end.author_insertion_code
  61. });
  62. } else {
  63. rows.push({
  64. id: startId++,
  65. group_id,
  66. label_entity_id: '' + entry.entity_id,
  67. label_asym_id: entry.struct_asym_id,
  68. auth_asym_id: entry.chain_id
  69. } as any);
  70. }
  71. }
  72. return rows;
  73. }
  74. function getDomainInfo(id: string, mapping_group_id: number, data: any, schema: any) {
  75. const props = Object.create(null);
  76. for (const k of Object.keys(schema)) props[k] = data[k];
  77. return { id, mapping_group_id, identifier: data.identifier, ...props };
  78. }
  79. function getDomain(name: string, schema: any, allData: any) {
  80. if (!allData[name]) return void 0;
  81. const data = allData[name];
  82. const domains: any[] = [];
  83. const mappings: MappingRow[] = [];
  84. let mappingSerialId = 1, mapping_group_id = 1;
  85. for (const id of Object.keys(data)) {
  86. const domain = data[id];
  87. domains.push(getDomainInfo(id, mapping_group_id, domain, schema));
  88. mappings.push(...getMappings(mappingSerialId, mapping_group_id, domain.mappings));
  89. mappingSerialId = mappings.length + 1;
  90. mapping_group_id++;
  91. }
  92. return domains.length > 0 ? {
  93. name,
  94. domains: Table.ofRows({ ...S.Base, ...schema }, domains),
  95. mappings: Table.ofRows<S.mapping>(S.mapping, mappings)
  96. } : void 0;
  97. }