From 44b8f5c19dc97b70ac6cfa6769d9f1a26c60229a Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Tue, 18 Sep 2018 09:37:23 -0700 Subject: [PATCH] added molecule-type color scheme --- src/mol-view/theme/color.ts | 3 ++ src/mol-view/theme/color/molecule-type.ts | 59 +++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/mol-view/theme/color/molecule-type.ts diff --git a/src/mol-view/theme/color.ts b/src/mol-view/theme/color.ts index 6f0cecf67..a9ca94485 100644 --- a/src/mol-view/theme/color.ts +++ b/src/mol-view/theme/color.ts @@ -21,6 +21,7 @@ import { CustomColorTheme } from './color/custom'; import { ResidueNameColorTheme } from './color/residue-name'; import { SequenceIdColorTheme } from './color/sequence-id'; import { SecondaryStructureColorTheme } from './color/secondary-structure'; +import { MoleculeTypeColorTheme } from './color/molecule-type'; export type LocationColor = (location: Location, isSecondary: boolean) => Color @@ -57,6 +58,7 @@ export function ColorTheme(props: ColorThemeProps): ColorTheme { case 'custom': return CustomColorTheme(props) case 'element-index': return ElementIndexColorTheme(props) case 'element-symbol': return ElementSymbolColorTheme(props) + case 'molecule-type': return MoleculeTypeColorTheme(props) case 'residue-name': return ResidueNameColorTheme(props) case 'secondary-structure': return SecondaryStructureColorTheme(props) case 'sequence-id': return SequenceIdColorTheme(props) @@ -84,6 +86,7 @@ export const ColorThemeInfo = { 'custom': {}, 'element-index': {}, 'element-symbol': {}, + 'molecule-type': {}, 'residue-name': {}, 'secondary-structure': {}, 'sequence-id': {}, diff --git a/src/mol-view/theme/color/molecule-type.ts b/src/mol-view/theme/color/molecule-type.ts new file mode 100644 index 000000000..f2be520fe --- /dev/null +++ b/src/mol-view/theme/color/molecule-type.ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +import { Color, ColorMap } from 'mol-util/color'; +import { StructureElement, Unit, Link, ElementIndex } from 'mol-model/structure'; +import { Location } from 'mol-model/location'; +import { ColorThemeProps, ColorTheme, TableLegend } from '../color'; +import { MoleculeType } from 'mol-model/structure/model/types'; +import { getElementMoleculeType } from 'mol-model/structure/util'; + +const MoleculeTypeColors = ColorMap({ + water: 0x386cb0, + ion: 0xf0027f, + protein: 0xbeaed4, + RNA: 0xfdc086, + DNA: 0xbf5b17, + PNA: 0x42A49A, + saccharide: 0x7fc97f, +}) + +const DefaultMoleculeTypeColor = Color(0xffff99) +const Description = 'Assigns a color based on the molecule type of a residue.' + +export function moleculeTypeColor(unit: Unit, element: ElementIndex): Color { + const moleculeType = getElementMoleculeType(unit, element) + switch (moleculeType) { + case MoleculeType.water: return MoleculeTypeColors.water + case MoleculeType.ion: return MoleculeTypeColors.ion + case MoleculeType.protein: return MoleculeTypeColors.protein + case MoleculeType.RNA: return MoleculeTypeColors.RNA + case MoleculeType.DNA: return MoleculeTypeColors.DNA + case MoleculeType.PNA: return MoleculeTypeColors.PNA + case MoleculeType.saccharide: return MoleculeTypeColors.saccharide + } + return DefaultMoleculeTypeColor +} + +export function MoleculeTypeColorTheme(props: ColorThemeProps): ColorTheme { + function color(location: Location): Color { + if (StructureElement.isLocation(location)) { + return moleculeTypeColor(location.unit, location.element) + } else if (Link.isLocation(location)) { + return moleculeTypeColor(location.aUnit, location.aUnit.elements[location.aIndex]) + } + return DefaultMoleculeTypeColor + } + + return { + granularity: 'group', + color, + description: Description, + legend: TableLegend(Object.keys(MoleculeTypeColors).map(name => { + return [name, (MoleculeTypeColors as any)[name] as Color] as [string, Color] + }).concat([[ 'Other/unknown', DefaultMoleculeTypeColor ]])) + } +} \ No newline at end of file -- GitLab