From 6d0776788d0426a647757f9d1d7f8bea72c47331 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Fri, 26 Apr 2019 11:38:13 -0700 Subject: [PATCH] added 'illustrative' color theme --- src/mol-theme/color.ts | 2 + src/mol-theme/color/illustrative.ts | 80 +++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/mol-theme/color/illustrative.ts diff --git a/src/mol-theme/color.ts b/src/mol-theme/color.ts index a2c241768..38619982f 100644 --- a/src/mol-theme/color.ts +++ b/src/mol-theme/color.ts @@ -27,6 +27,7 @@ import { UnitIndexColorThemeProvider } from './color/unit-index'; import { ScaleLegend } from 'mol-util/color/scale'; import { TableLegend } from 'mol-util/color/tables'; import { UncertaintyColorThemeProvider } from './color/uncertainty'; +import { IllustrativeColorThemeProvider } from './color/illustrative'; export type LocationColor = (location: Location, isSecondary: boolean) => Color @@ -73,6 +74,7 @@ export const BuiltInColorThemes = { 'cross-link': CrossLinkColorThemeProvider, 'element-index': ElementIndexColorThemeProvider, 'element-symbol': ElementSymbolColorThemeProvider, + 'illustrative': IllustrativeColorThemeProvider, 'molecule-type': MoleculeTypeColorThemeProvider, 'polymer-id': PolymerIdColorThemeProvider, 'polymer-index': PolymerIndexColorThemeProvider, diff --git a/src/mol-theme/color/illustrative.ts b/src/mol-theme/color/illustrative.ts new file mode 100644 index 000000000..b25da5db4 --- /dev/null +++ b/src/mol-theme/color/illustrative.ts @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +import { ElementSymbol, isNucleic, isProtein, MoleculeType } from 'mol-model/structure/model/types'; +import { Color } from 'mol-util/color'; +import { StructureElement, Unit, Link } from 'mol-model/structure'; +import { Location } from 'mol-model/location'; +import { ColorTheme } from '../color'; +import { ParamDefinition as PD } from 'mol-util/param-definition' +import { ThemeDataContext } from '../theme'; +import { elementSymbolColor } from './element-symbol'; + +const DefaultIllustrativeColor = Color(0xFFFFFF) +const Description = `Assigns an illustrative color similar to David Goodsell's Molecule of the Month style.` + +export const IllustrativeColorThemeParams = {} +export type IllustrativeColorThemeParams = typeof IllustrativeColorThemeParams +export function getIllustrativeColorThemeParams(ctx: ThemeDataContext) { + return IllustrativeColorThemeParams // TODO return copy +} + +function illustrativeColor(typeSymbol: ElementSymbol, moleculeType: MoleculeType) { + if (isNucleic(moleculeType)) { + if (typeSymbol === 'O') { + return Color(0xFF8C8C) + } else if (typeSymbol === 'P') { + return Color(0xFF7D7D) + } else { + return Color(0xFFA6A6) + } + } else if (isProtein(moleculeType)) { + if (typeSymbol === 'C') { + return Color(0x7FB2FF) + } else { + return Color(0x6699FF) + } + } else { + return elementSymbolColor(typeSymbol) + } +} + +export function IllustrativeColorTheme(ctx: ThemeDataContext, props: PD.Values<IllustrativeColorThemeParams>): ColorTheme<IllustrativeColorThemeParams> { + function color(location: Location): Color { + if (StructureElement.isLocation(location)) { + if (Unit.isAtomic(location.unit)) { + const moleculeType = location.unit.model.atomicHierarchy.derived.residue.moleculeType[location.unit.residueIndex[location.element]] + const typeSymbol = location.unit.model.atomicHierarchy.atoms.type_symbol.value(location.element) + return illustrativeColor(typeSymbol, moleculeType) + } + } else if (Link.isLocation(location)) { + if (Unit.isAtomic(location.aUnit)) { + const elementIndex = location.aUnit.elements[location.aIndex] + const moleculeType = location.aUnit.model.atomicHierarchy.derived.residue.moleculeType[location.aUnit.residueIndex[elementIndex]] + const typeSymbol = location.aUnit.model.atomicHierarchy.atoms.type_symbol.value(elementIndex) + return illustrativeColor(typeSymbol, moleculeType) + } + } + return DefaultIllustrativeColor + } + + return { + factory: IllustrativeColorTheme, + granularity: 'group', + color, + props, + description: Description, + // TODO add legend + } +} + +export const IllustrativeColorThemeProvider: ColorTheme.Provider<IllustrativeColorThemeParams> = { + label: 'Illustrative', + factory: IllustrativeColorTheme, + getParams: getIllustrativeColorThemeParams, + defaultValues: PD.getDefaultValues(IllustrativeColorThemeParams), + isApplicable: (ctx: ThemeDataContext) => !!ctx.structure +} \ No newline at end of file -- GitLab