Skip to content
Snippets Groups Projects
Commit 6d077678 authored by Alexander Rose's avatar Alexander Rose
Browse files

added 'illustrative' color theme

parent ae285940
No related branches found
No related tags found
No related merge requests found
......@@ -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,
......
/**
* 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment