Skip to content
Snippets Groups Projects
Commit 8e31f702 authored by Sebastian Bittrich's avatar Sebastian Bittrich
Browse files

fixes to DSSP impl, detection of bends and sheets

parent 2325ac9a
Branches
Tags
No related merge requests found
...@@ -414,6 +414,7 @@ namespace Vec3 { ...@@ -414,6 +414,7 @@ namespace Vec3 {
} }
const angleTempA = zero(), angleTempB = zero(); const angleTempA = zero(), angleTempB = zero();
/** Computes the angle between 2 vectors, reports in rad. */
export function angle(a: Vec3, b: Vec3) { export function angle(a: Vec3, b: Vec3) {
copy(angleTempA, a); copy(angleTempA, a);
copy(angleTempB, b); copy(angleTempB, b);
......
import { Vec3 } from '../3d'
describe('vec3', () => {
const vec1 = [ 1, 2, 3 ] as Vec3;
const vec2 = [ 2, 3, 1 ] as Vec3;
const orthVec1 = [ 0, 1, 0 ] as Vec3;
const orthVec2 = [ 1, 0, 0 ] as Vec3;
it('angle calculation', () => {
expect(Vec3.angle(vec1, vec1) * 360 / (2 * Math.PI)).toBe(0.0);
expect(Vec3.angle(orthVec1, orthVec2) * 360 / (2 * Math.PI)).toBe(90.0);
expect(Vec3.angle(vec1, vec2)).toBeCloseTo(0.666946);
});
})
\ No newline at end of file
...@@ -20,7 +20,8 @@ namespace SecondaryStructure { ...@@ -20,7 +20,8 @@ namespace SecondaryStructure {
export type Element = None | Helix | Sheet export type Element = None | Helix | Sheet
export interface None { export interface None {
kind: 'none' kind: 'none',
flags?: SecondaryStructureType // TODO should this level of detail be added to non-defined secondary structure elements?
} }
export interface Helix { export interface Helix {
......
compares Mol* port of DSSP (with default parameters) to the BioJava implementation
### pdb:1pga ###
# turns #
Mol*: ----------------------TTTTTTTTTTTTTTTT--------TTTT------
53 turns, 18 openings
DSSP: ----------------------TTTTTTTTTTTTTTTT--------TTTT------
53 turns, 18 openings
# bends #
Mol*: ---------SS---------SSSSSSSSSSSSSSSSSS--------SSS-------
23 bends
DSSP: ---------SS---------SSSSSSSSSSSSSSSSSS--------SSS-------
23 bends
# helices #
Mol*: ----------------------HHHHHHHHHHHHHHTT--------TTTT------
44 helix elements - 0 3-10, 44 alpha, 0 pi
DSSP: ----------------------HHHHHHHHHHHHHHTT--------TTTT------
44 helix elements - 0 3-10, 44 alpha, 0 pi
# all #
Mol*: -EEEEEEE-SS-EEEEEEE-SSHHHHHHHHHHHHHHTT---EEEEETTTTEEEEE-
DSSP: -EEEEEEE-SS-EEEEEEE-SSHHHHHHHHHHHHHHTT---EEEEETTTTEEEEE-
### pdb:1bta ###
# turns #
Mol*: ------TTT---TTTTTTTTTTTTT--TT----TTTTTTTTTTT-----------TTTTTTTTT--TTTTTTTTTTTTTTT--------
127 turns, 44 openings
DSSP: ------TTT---TTTTTTTTTTTTT--TT----TTTTTTTTTTT-----------TTTTTTTTT--TTTTTTTTTTTTTTT--------
127 turns, 44 openings
# bends #
Mol*: ------SSS--SSSSSSSSSSSSS---SS---SSSSSSSSSSSSS-SS------SSSSSSSSSSSSSSSSSSSSSSSSSSS--------
60 bends
DSSP: ------SSS--SSSSSSSSSSSSS---SS---SSSSSSSSSSSSS-SS------SSSSSSSSSSSSSSSSSSSSSSSSSSS--------
60 bends
# helices #
Mol*: ------TTT---HHHHHHHHHHHHT--TT----HHHHHHHHTTT-----------TTHHHHTTT--HHHHHHHHHHHHHTT--------
100 helix elements - 0 3-10, 100 alpha, 0 pi
DSSP: ------TTT---HHHHHHHHHHHHT--TT----HHHHHHHHTTT-----------TTHHHHTTT--HHHHHHHHHHHHHTT--------
100 helix elements - 0 3-10, 100 alpha, 0 pi
# all #
Mol*: -EEEEETTT--SHHHHHHHHHHHHT--TT---SHHHHHHHHTTTS-SSEEEEEESTTHHHHTTTSSHHHHHHHHHHHHHTT--EEEEE-
DSSP: -EEEEETTT--SHHHHHHHHHHHHT--TT---SHHHHHHHHTTTS-SSEEEEEESTTHHHHTTTSSHHHHHHHHHHHHHTT--EEEEE-
### pdb:1acj ###
# turns #
Mol*: -------TT----------TT----------------TTTTT----------------------------TTTT-TTTTTT----------------------------------TTT------TTT-TTTTTTTTT-----------TTTT---TT-------TTTTTTTTTTTTTTTTTTTTT--TT-------TTTTTTTTTTTT-TTTTTT----------TT-TT----TTTTTTTTTTTTTTTT-----TTTTTTTTTT--TTTTTTTTTTT-----------------------TTTTTTTT----------------TTTTTTT-TT--TT------TTTTTTTTTTTTTT--TTTTTTTTTTT--TTTTT-TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT-------------TT----TTT---TTTTTTTTTTTTT-TTT---TTTTTTTTTTTTTTTTTTTT--------------------------------TTTTTTTTTTTTTTTTTTT-
614 turns, 223 openings
DSSP: -------TT----------TT----------------TTTTT------------------------------TT-TTTTTT----------------------------------TTT------TTT-TTTTTTTTT-----------TTTT---TT-------TTTTTTTTTTTTTTTTTTTTT--TT-------TTTTTTTTTTTT-TTTTTT----------TT-TT----TTTTTTTTTTTTTTTT-----TTTTTTTTTT--TTTTTTTTTTT-----------------------TTTTTTTT----------------TTTTTTT-TT--TT------TTTTTTTTTTT-TT--TTTTTTTTTTT--TTTTT-TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT-------------TT----TTT---TTTTTTTTTTTTT-TTT---TTTTTTTTTTTTTTTTTTTT--------------------------------TTTTTTTTTTTTTTTTTTT-
606 turns, 220 openings
# bends #
Mol*: --S----SS----------SSS----------S----SS-SSS--------SS-----S-----------SSSS-SSSSSSS--S---S----------SS--SS---------SSSS---S-SSSS--SSSSSSS-----------SSSS----SS-SSS-S-SSSSSSSSSSSSSSSSSSSSS--SSS------SSSSSSSSSSSS-SSSSSS-S----SS--SSSSSS---SSSSSSSSSSSSSSS----S-SSSSSSSSSSS-SSSSSSSSSS--SS--SS--S------SSSSSS-SSSSSSS--S--S-------S--SSSSSSSSSSS--SSS-----SSSSSSSSSSS-SS--SSSSSSSSSSS--SSSSS-SSSSSSSSSSSSSSSSS----SSSSSSSSSSSS-----------SS--S-SSS-S-SS-SSSSSS--SS-SSS---SSSSSSSSSSSSSSSSSSSSSSSS---------SSS------SSSS----SSSS-S----SSSSSSSSSS--
305 bends
DSSP: --S----SS----------SSS----------S----SS-SSS--------SS-----S-----------SSSS-SSSSSSS--S---S----------SS--SS---------SSSS---S-SSSS--SSSSSSS-----------SSSS----SS-SSS-S-SSSSSSSSSSSSSSSSSSSSS--SSS------SSSSSSSSSSSS-SSSSSS-S----SS--SSSSSS---SSSSSSSSSSSSSSS----S-SSSSSSSSSSS-SSSSSSSSSS--SS--SS--S------SSSSSS-SSSSSSS--S--S-------S--SSSSSSSSSSS--SSS-----SSSSSSSSSSS-SS--SSSSSSSSSSS--SSSSS-SSSSSSSSSSSSSSSSS----SSSSSSSSSSSS-----------SS--S-SSS-S-SS-SSSSSS--SS-SSS---SSSSSSSSSSSSSSSSSSSSSSSS---------SSS------SSSS----SSSS-S----SSSSSSSSSS--
305 bends
# helices #
Mol*: -------TT----------TT----------------GGGTT----------------------------TTTT-HHHHTT----------------------------------TTT------GGG-THHHHHHHT-----------HHHH---TT-------HHHHHHHHHHHHHHHHGGGGT--TT-------THHHHHHHHHHH-HHHHTT----------TT-TT----HHHHHHHHHHHHHHTT-----HHHHHHHHHH--HHHHHHHHGGG-----------------------HHHHHHHT----------------HHHHHHH-TT--TT------HHHHHHHHHHHTTT--HHHHHHHHHHH--GGGTT-HHHHHHHHHHHHHHHHTHHHHHHHHHHHHTT-------------TT----GGG---TTTTHHHHTTGGG-GGG---HHHHHHHHHHHHHHHHHHHT--------------------------------TTHHHHHHHHTHHHHHHHH-
523 helix elements - 27 3-10, 496 alpha, 0 pi
DSSP: -------TT----------TT----------------GGGTT------------------------------TT-HHHHTT----------------------------------TTT------GGG-THHHHHHHT-----------HHHH---TT-------HHHHHHHHHHHHHHHHGGGGT--TT-------THHHHHHHHHHH-HHHHTT----------TT-TT----HHHHHHHHHHHHHHTT-----HHHHHHHHHH--HHHHHHHHGGG-----------------------HHHHHHHT----------------HHHHHHH-TT--TT------HHHHHHHHHHH-TT--HHHHHHHHHHH--GGGTT-HHHHHHHHHHHHHHHHTHHHHHHHHHHHHTT-------------TT----GGG---TTTTHHHHTTGGG-GGG---HHHHHHHHHHHHHHHHHHHT--------------------------------TTHHHHHHHHTHHHHHHHH-
523 helix elements - 27 3-10, 496 alpha, 0 pi
# all #
Mol*: --SEEEETTEEEE-EEEEETTEEEEEEEEEE-EE---GGGTTS--EE----SSEEE--S---B-------TTTT-HHHHTTS--S-B-S---EEEEEE-SS--SSEEEEEEE--STTT---S-SGGG-THHHHHHHT-EEEE-----SHHHH---TT-SSS-S-HHHHHHHHHHHHHHHHGGGGTEEEEEEEEEEETHHHHHHHHHHH-HHHHTT-SEEEEES--TTSTTSEEEHHHHHHHHHHHHHHTT---S-HHHHHHHHHHS-HHHHHHHHGGG-SS--SS--S--EEE-SSSSSS-HHHHHHHT-S--S-EEEEEESB-SHHHHHHHSTT--TTS-----HHHHHHHHHHHTTT--HHHHHHHHHHH--GGGTT-HHHHHHHHHHHHHHHHTHHHHHHHHHHHHTTSS-EEEEEE----TT--S-GGG-SBTTTTHHHHTTGGG-GGG---HHHHHHHHHHHHHHHHHHHTSSSS---------SSS-EEEEESSSS--EEESTTHHHHHHHHTHHHHHHHH-
DSSP: --SEEEETTEEEE-EEEEETTEEEEEEEEEE-EE---GGGTTS--EE----SSEEE--S---B-------SSTT-HHHHTTS--S-B-S---EEEEEE-SS--SSEEEEEEE--STTT---S-SGGG-THHHHHHHT-EEEE-----SHHHH---TT-SSS-S-HHHHHHHHHHHHHHHHGGGGTEEEEEEEEEEETHHHHHHHHHHH-HHHHTT-SEEEEES--TTSTTS-EEHHHHHHHHHHHHHHTT---S-HHHHHHHHHHS-HHHHHHHHGGG-SS--SS--S---EE-SSSSSS-HHHHHHHT-S--S-EEEEEESB-SHHHHHHHSTT--TTS-----HHHHHHHHHHH-TT--HHHHHHHHHHH--GGGTT-HHHHHHHHHHHHHHHHTHHHHHHHHHHHHTTSS-EEEEEE----TT--S-GGG-SBTTTTHHHHTTGGG-GGG---HHHHHHHHHHHHHHHHHHHTSSSS---------SSS-EEEEESSSS--EEESTTHHHHHHHHTHHHHHHHH-
TODO fix mismatches e.g. here
\ No newline at end of file
...@@ -275,41 +275,42 @@ export namespace SecondaryStructureType { ...@@ -275,41 +275,42 @@ export namespace SecondaryStructureType {
DoubleHelix = 0x1, DoubleHelix = 0x1,
Helix = 0x2, Helix = 0x2,
Beta = 0x4, Beta = 0x4,
Turn = 0x8, Bend = 0x8,
Turn = 0x10,
// category variant // category variant
LeftHanded = 0x10, // helix LeftHanded = 0x20, // helix
RightHanded = 0x20, RightHanded = 0x40,
ClassicTurn = 0x40, // turn ClassicTurn = 0x80, // turn
InverseTurn = 0x80, InverseTurn = 0x100,
// sub-category // sub-category
HelixOther = 0x100, // protein HelixOther = 0x200, // protein
Helix27 = 0x200, Helix27 = 0x400,
Helix3Ten = 0x400, Helix3Ten = 0x800,
HelixAlpha = 0x800, HelixAlpha = 0x1000,
HelixGamma = 0x1000, HelixGamma = 0x2000,
HelixOmega = 0x2000, HelixOmega = 0x4000,
HelixPi = 0x4000, HelixPi = 0x8000,
HelixPolyproline = 0x8000, HelixPolyproline = 0x10000,
DoubleHelixOther = 0x10000, // nucleic DoubleHelixOther = 0x20000, // nucleic
DoubleHelixZ = 0x20000, DoubleHelixZ = 0x40000,
DoubleHelixA = 0x40000, DoubleHelixA = 0x80000,
DoubleHelixB = 0x80000, DoubleHelixB = 0x100000,
BetaOther = 0x100000, // protein BetaOther = 0x200000, // protein
BetaStrand = 0x200000, // single strand BetaStrand = 0x400000, // single strand
BetaSheet = 0x400000, // multiple hydrogen bonded strands BetaSheet = 0x800000, // multiple hydrogen bonded strands
BetaBarell = 0x800000, // closed series of sheets BetaBarell = 0x1000000, // closed series of sheets
TurnOther = 0x1000000, // protein TurnOther = 0x2000000, // protein
Turn1 = 0x2000000, Turn1 = 0x4000000,
Turn2 = 0x4000000, Turn2 = 0x8000000,
Turn3 = 0x8000000, Turn3 = 0x10000000,
NA = 0x10000000, // not applicable/available NA = 0x20000000, // not applicable/available
} }
export const SecondaryStructureMmcif: { [value: string]: number } = { export const SecondaryStructureMmcif: { [value: string]: number } = {
...@@ -386,7 +387,7 @@ export namespace SecondaryStructureType { ...@@ -386,7 +387,7 @@ export namespace SecondaryStructureType {
G: Flag.Helix | Flag.Helix3Ten, // 3-helix (310 helix) G: Flag.Helix | Flag.Helix3Ten, // 3-helix (310 helix)
I: Flag.Helix | Flag.HelixPi, // 5 helix (pi-helix) I: Flag.Helix | Flag.HelixPi, // 5 helix (pi-helix)
T: Flag.Turn, // hydrogen bonded turn T: Flag.Turn, // hydrogen bonded turn
S: Flag.Turn, // bend S: Flag.Bend, // bend
} }
} }
......
...@@ -22,6 +22,8 @@ const SecondaryStructureColors = ColorMap({ ...@@ -22,6 +22,8 @@ const SecondaryStructureColors = ColorMap({
'betaTurn': 0x6080FF, 'betaTurn': 0x6080FF,
'betaStrand': 0xFFC800, 'betaStrand': 0xFFC800,
'coil': 0xFFFFFF, 'coil': 0xFFFFFF,
'bend': 0x66D8C9 /* biting original color used 0x00FF00 */,
'turn': 0x00B266,
'dna': 0xAE00FE, 'dna': 0xAE00FE,
'rna': 0xFD0162, 'rna': 0xFD0162,
...@@ -53,8 +55,10 @@ export function secondaryStructureColor(unit: Unit, element: ElementIndex): Colo ...@@ -53,8 +55,10 @@ export function secondaryStructureColor(unit: Unit, element: ElementIndex): Colo
return SecondaryStructureColors.alphaHelix return SecondaryStructureColors.alphaHelix
} else if (SecondaryStructureType.is(secStrucType, SecondaryStructureType.Flag.Beta)) { } else if (SecondaryStructureType.is(secStrucType, SecondaryStructureType.Flag.Beta)) {
return SecondaryStructureColors.betaStrand return SecondaryStructureColors.betaStrand
} else if (SecondaryStructureType.is(secStrucType, SecondaryStructureType.Flag.Bend)) {
return SecondaryStructureColors.bend
} else if (SecondaryStructureType.is(secStrucType, SecondaryStructureType.Flag.Turn)) { } else if (SecondaryStructureType.is(secStrucType, SecondaryStructureType.Flag.Turn)) {
return SecondaryStructureColors.coil return SecondaryStructureColors.turn
} else { } else {
const moleculeType = getElementMoleculeType(unit, element) const moleculeType = getElementMoleculeType(unit, element)
if (moleculeType === MoleculeType.DNA) { if (moleculeType === MoleculeType.DNA) {
......
...@@ -65,9 +65,10 @@ async function init() { ...@@ -65,9 +65,10 @@ async function init() {
const cif = await downloadFromPdb('3j3q') const cif = await downloadFromPdb('3j3q')
const models = await getModels(cif) const models = await getModels(cif)
console.time('computeModelDSSP') console.time('computeModelDSSP')
const secondaryStructure = computeModelDSSP(models[0].atomicHierarchy, models[0].atomicConformation) const secondaryStructure = computeModelDSSP(models[0].atomicHierarchy,
console.timeEnd('computeModelDSSP') models[0].atomicConformation)
;(models[0].properties as any).secondaryStructure = secondaryStructure console.timeEnd('computeModelDSSP');
(models[0].properties as any).secondaryStructure = secondaryStructure
const structure = await getStructure(models[0]) const structure = await getStructure(models[0])
const cartoonRepr = getCartoonRepr() const cartoonRepr = getCartoonRepr()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment