UNPKG

molstar

Version:

A comprehensive macromolecular library.

95 lines 3.65 kB
/** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author Sebastian Bittrich <sebastian.bittrich@rcsb.org> */ function shouldExtendLadder(ladder, bridge) { // in order to extend ladders, same type must be present if (bridge.type !== ladder.type) return false; // only extend if residue 1 is sequence neighbor with regard to ladder if (bridge.partner1 !== ladder.firstEnd + 1) return false; if (bridge.type === 0 /* PARALLEL */) { if (bridge.partner2 === ladder.secondEnd + 1) { return true; } } else { if (bridge.partner2 === ladder.secondStart - 1) { return true; } } return false; } /** * For beta structures, we define: a bulge-linked ladder consists of two ladders or bridges of the same type * connected by at most one extra residue of one strand and at most four extra residues on the other strand, * all residues in bulge-linked ladders are marked E, including any extra residues. */ function resemblesBulge(ladder1, ladder2) { if (!(ladder1.type === ladder2.type && ladder2.firstStart - ladder1.firstEnd < 6 && ladder1.firstStart < ladder2.firstStart && ladder2.nextLadder === 0)) return false; if (ladder1.type === 0 /* PARALLEL */) { return bulgeCriterion2(ladder1, ladder2); } else { return bulgeCriterion2(ladder2, ladder1); } } function bulgeCriterion2(ladder1, ladder2) { return ladder2.secondStart - ladder1.secondEnd > 0 && ((ladder2.secondStart - ladder1.secondEnd < 6 && ladder2.firstStart - ladder1.firstEnd < 3) || ladder2.secondStart - ladder1.secondEnd < 3); } /** * ladder=: set of one or more consecutive bridges of identical type * * Type: E */ export function assignLadders(ctx) { var bridges = ctx.bridges, ladders = ctx.ladders; // create ladders for (var bridgeIndex = 0; bridgeIndex < bridges.length; bridgeIndex++) { var bridge = bridges[bridgeIndex]; var found = false; for (var ladderIndex = 0; ladderIndex < ladders.length; ladderIndex++) { var ladder = ladders[ladderIndex]; if (shouldExtendLadder(ladder, bridge)) { found = true; ladder.firstEnd++; if (bridge.type === 0 /* PARALLEL */) { ladder.secondEnd++; } else { ladder.secondStart--; } } } // no suitable assignment: create new ladder with single bridge as content if (!found) { ladders[ladders.length] = { previousLadder: 0, nextLadder: 0, firstStart: bridge.partner1, firstEnd: bridge.partner1, secondStart: bridge.partner2, secondEnd: bridge.partner2, type: bridge.type }; } } // connect ladders for (var ladderIndex1 = 0; ladderIndex1 < ladders.length; ladderIndex1++) { var ladder1 = ladders[ladderIndex1]; for (var ladderIndex2 = ladderIndex1; ladderIndex2 < ladders.length; ladderIndex2++) { var ladder2 = ladders[ladderIndex2]; if (resemblesBulge(ladder1, ladder2)) { ladder1.nextLadder = ladderIndex2; ladder2.previousLadder = ladderIndex1; } } } } //# sourceMappingURL=ladders.js.map