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