diff --git a/src/mol-theme/color.ts b/src/mol-theme/color.ts index a2c2417686935eb95a0ea3385591d38e0f8ba0f5..38619982fcd13f179a4c6eeb2d04e7cf1cc1db9e 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 0000000000000000000000000000000000000000..b25da5db4b549023d8b638a1239d5b92e749bdea --- /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