molstar
Version:
A comprehensive macromolecular library.
82 lines (81 loc) • 3.47 kB
JavaScript
/**
* Copyright (c) 2021-23 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { MmcifFormat } from '../../mol-model-formats/structure/mmcif';
import { CustomPropertyDescriptor } from '../../mol-model/custom-property';
import { CustomModelProperty } from '../common/custom-model-property';
export { SIFTSMapping as SIFTSMapping };
var SIFTSMapping;
(function (SIFTSMapping) {
SIFTSMapping.Provider = CustomModelProperty.createProvider({
label: 'SIFTS Mapping',
descriptor: CustomPropertyDescriptor({
name: 'sifts_sequence_mapping'
}),
type: 'static',
defaultParams: {},
getParams: () => ({}),
isApplicable: (data) => isAvailable(data),
obtain: async (ctx, data) => {
return { value: fromCif(data) };
}
});
function isAvailable(model) {
if (!MmcifFormat.is(model.sourceData))
return false;
const { pdbx_sifts_xref_db_name: db_name, pdbx_sifts_xref_db_acc: db_acc, pdbx_sifts_xref_db_num: db_num, pdbx_sifts_xref_db_res: db_res } = model.sourceData.data.db.atom_site;
return db_name.isDefined && db_acc.isDefined && db_num.isDefined && db_res.isDefined;
}
SIFTSMapping.isAvailable = isAvailable;
function getKey(loc) {
const model = loc.unit.model;
const data = SIFTSMapping.Provider.get(model).value;
if (!data)
return '';
const rI = model.atomicHierarchy.residueAtomSegments.index[loc.element];
return data.accession[rI];
}
SIFTSMapping.getKey = getKey;
function getLabel(loc) {
const model = loc.unit.model;
const data = SIFTSMapping.Provider.get(model).value;
if (!data)
return;
const rI = model.atomicHierarchy.residueAtomSegments.index[loc.element];
const dbName = data.dbName[rI];
if (!dbName)
return;
return `${dbName} ${data.accession[rI]} ${data.num[rI]} ${data.residue[rI]}`;
}
SIFTSMapping.getLabel = getLabel;
function fromCif(model) {
if (!MmcifFormat.is(model.sourceData))
return;
const { pdbx_sifts_xref_db_name: db_name, pdbx_sifts_xref_db_acc: db_acc, pdbx_sifts_xref_db_num: db_num, pdbx_sifts_xref_db_res: db_res } = model.sourceData.data.db.atom_site;
if (!db_name.isDefined || !db_acc.isDefined || !db_num.isDefined || !db_res.isDefined)
return;
const { atomSourceIndex } = model.atomicHierarchy;
const { count, offsets: residueOffsets } = model.atomicHierarchy.residueAtomSegments;
const dbName = new Array(count);
const accession = new Array(count);
const num = new Array(count);
const residue = new Array(count);
for (let i = 0; i < count; i++) {
const row = atomSourceIndex.value(residueOffsets[i]);
if (db_name.valueKind(row) !== 0 /* Column.ValueKinds.Present */) {
dbName[i] = '';
accession[i] = '';
num[i] = '';
residue[i] = '';
continue;
}
dbName[i] = db_name.value(row);
accession[i] = db_acc.value(row);
num[i] = db_num.value(row);
residue[i] = db_res.value(row);
}
return { dbName, accession, num, residue };
}
})(SIFTSMapping || (SIFTSMapping = {}));