Skip to content
Snippets Groups Projects
Commit 678f7887 authored by David Sehnal's avatar David Sehnal
Browse files

mol-plugin: multi-source obtain structure, param definition tweaks

parent 694fee25
No related branches found
No related tags found
No related merge requests found
...@@ -10,7 +10,7 @@ import * as React from 'react'; ...@@ -10,7 +10,7 @@ import * as React from 'react';
import * as ReactDOM from 'react-dom'; import * as ReactDOM from 'react-dom';
import { PluginCommands } from './command'; import { PluginCommands } from './command';
import { PluginSpec } from './spec'; import { PluginSpec } from './spec';
import { CreateStructureFromPDBe } from './state/actions/basic'; import { ObtainAtomicStructure } from './state/actions/basic';
import { StateTransforms } from './state/transforms'; import { StateTransforms } from './state/transforms';
import { PluginBehaviors } from './behavior'; import { PluginBehaviors } from './behavior';
import { LogEntry } from 'mol-util/log-entry'; import { LogEntry } from 'mol-util/log-entry';
...@@ -22,7 +22,7 @@ function getParam(name: string, regex: string): string { ...@@ -22,7 +22,7 @@ function getParam(name: string, regex: string): string {
const DefaultSpec: PluginSpec = { const DefaultSpec: PluginSpec = {
actions: [ actions: [
PluginSpec.Action(CreateStructureFromPDBe), PluginSpec.Action(ObtainAtomicStructure),
PluginSpec.Action(StateTransforms.Data.Download), PluginSpec.Action(StateTransforms.Data.Download),
PluginSpec.Action(StateTransforms.Data.ParseCif), PluginSpec.Action(StateTransforms.Data.ParseCif),
PluginSpec.Action(StateTransforms.Model.StructureAssemblyFromModel), PluginSpec.Action(StateTransforms.Model.StructureAssemblyFromModel),
......
...@@ -12,7 +12,6 @@ import { CameraSnapshotManager } from './state/camera'; ...@@ -12,7 +12,6 @@ import { CameraSnapshotManager } from './state/camera';
import { PluginStateSnapshotManager } from './state/snapshots'; import { PluginStateSnapshotManager } from './state/snapshots';
import { RxEventHelper } from 'mol-util/rx-event-helper'; import { RxEventHelper } from 'mol-util/rx-event-helper';
import { Canvas3DParams } from 'mol-canvas3d/canvas3d'; import { Canvas3DParams } from 'mol-canvas3d/canvas3d';
import { ParamDefinition } from 'mol-util/param-definition';
import { PluginCommands } from './command'; import { PluginCommands } from './command';
export { PluginState } export { PluginState }
......
...@@ -11,16 +11,53 @@ import { ParamDefinition as PD } from 'mol-util/param-definition'; ...@@ -11,16 +11,53 @@ import { ParamDefinition as PD } from 'mol-util/param-definition';
import { StateSelection } from 'mol-state/state/selection'; import { StateSelection } from 'mol-state/state/selection';
import { CartoonParams } from 'mol-repr/structure/representation/cartoon'; import { CartoonParams } from 'mol-repr/structure/representation/cartoon';
import { BallAndStickParams } from 'mol-repr/structure/representation/ball-and-stick'; import { BallAndStickParams } from 'mol-repr/structure/representation/ball-and-stick';
import { Download } from '../transforms/data';
export const CreateStructureFromPDBe = StateAction.create<PluginStateObject.Root, void, { id: string }>({ export { ObtainAtomicStructure }
namespace ObtainAtomicStructure {
export type Sources = 'pdbe-updated' | 'rcsb' | 'bcif-static' | 'url' | 'file'
export type Source = ObtainStructureHelpers.MapParams<Sources, typeof ObtainStructureHelpers.ControlMap>
export interface Params {
source: Source
}
}
namespace ObtainStructureHelpers {
export const SourceOptions: [ObtainAtomicStructure.Sources, string][] = [
['pdbe-updated', 'PDBe Updated'],
['rcsb', 'RCSB'],
['bcif-static', 'BinaryCIF (static PDBe Updated)'],
['url', 'URL'],
// ['file', 'File']
];
export const ControlMap = {
'pdbe-updated': PD.Text('1cbs', { label: 'Id' }),
'rcsb': PD.Text('1tqn', { label: 'Id' }),
'bcif-static': PD.Text('1tqn', { label: 'Id' }),
'url': PD.Group({ url: PD.Text(''), isBinary: PD.Boolean(false) }),
'file': PD.Group({ })
}
export function getControls(key: string) { return (ControlMap as any)[key]; }
export type MapParams<P extends ObtainAtomicStructure.Sources, Map extends { [K in P]: PD.Any }> = P extends ObtainAtomicStructure.Sources ? PD.NamedParams<Map[P]['defaultValue'], P> : never
export function getUrl(src: ObtainAtomicStructure.Source): Download.Params {
switch (src.name) {
case 'url': return src.params;
case 'pdbe-updated': return { url: `https://www.ebi.ac.uk/pdbe/static/entry/${src.params.toLowerCase()}_updated.cif`, isBinary: false, label: `PDBe: ${src.params}` };
case 'rcsb': return { url: `https://files.rcsb.org/download/${src.params.toUpperCase()}.cif`, isBinary: false, label: `RCSB: ${src.params}` };
case 'bcif-static': return { url: `https://webchem.ncbr.muni.cz/ModelServer/static/bcif/${src.params.toLowerCase()}`, isBinary: true, label: `BinaryCIF: ${src.params}` };
default: throw new Error(`${src.name} not supported.`);
}
}
}
const ObtainAtomicStructure = StateAction.create<PluginStateObject.Root, void, ObtainAtomicStructure.Params>({
from: [PluginStateObject.Root], from: [PluginStateObject.Root],
display: { display: {
name: 'Entry from PDBe', name: 'Obtain Structure',
description: 'Download a structure from PDBe and create its default Assembly and visual' description: 'Load a structure from PDBe and create its default Assembly and visual'
}, },
params: () => ({ id: PD.Text('1grm', { label: 'PDB id' }) }), params: () => ({ source: PD.Mapped('bcif-static', ObtainStructureHelpers.SourceOptions, ObtainStructureHelpers.getControls) }),
apply({ params, state }) { apply({ params, state }) {
const url = `http://www.ebi.ac.uk/pdbe/static/entry/${params.id.toLowerCase()}_updated.cif`;
const b = state.build(); const b = state.build();
// const query = MolScriptBuilder.struct.generator.atomGroups({ // const query = MolScriptBuilder.struct.generator.atomGroups({
...@@ -34,8 +71,10 @@ export const CreateStructureFromPDBe = StateAction.create<PluginStateObject.Root ...@@ -34,8 +71,10 @@ export const CreateStructureFromPDBe = StateAction.create<PluginStateObject.Root
// ]) // ])
// }); // });
const url = ObtainStructureHelpers.getUrl(params.source);
const root = b.toRoot() const root = b.toRoot()
.apply(StateTransforms.Data.Download, { url }) .apply(StateTransforms.Data.Download, url)
.apply(StateTransforms.Data.ParseCif) .apply(StateTransforms.Data.ParseCif)
.apply(StateTransforms.Model.TrajectoryFromMmCif, {}) .apply(StateTransforms.Model.TrajectoryFromMmCif, {})
.apply(StateTransforms.Model.ModelFromTrajectory, { modelIndex: 0 }) .apply(StateTransforms.Model.ModelFromTrajectory, { modelIndex: 0 })
......
...@@ -226,19 +226,17 @@ export class MultiSelectControl extends React.PureComponent<ParamProps<PD.MultiS ...@@ -226,19 +226,17 @@ export class MultiSelectControl extends React.PureComponent<ParamProps<PD.MultiS
export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>, { isExpanded: boolean }> { export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>, { isExpanded: boolean }> {
state = { isExpanded: false } state = { isExpanded: false }
change(value: PD.Mapped<any>['defaultValue'] ) { change(value: any ) {
this.props.onChange({ name: this.props.name, param: this.props.param, value }); this.props.onChange({ name: this.props.name, param: this.props.param, value });
} }
onChangeParam: ParamOnChange = e => { onChangeParam: ParamOnChange = e => {
const value: PD.Mapped<any>['defaultValue'] = this.props.value; this.change({ ...this.props.value, [e.name]: e.value });
this.change({ ...value.params, [e.name]: e.value });
} }
toggleExpanded = () => this.setState({ isExpanded: !this.state.isExpanded }); toggleExpanded = () => this.setState({ isExpanded: !this.state.isExpanded });
render() { render() {
const value: PD.Mapped<any>['defaultValue'] = this.props.value;
const params = this.props.param.params; const params = this.props.param.params;
const label = this.props.param.label || camelCaseToWords(this.props.name); const label = this.props.param.label || camelCaseToWords(this.props.name);
...@@ -250,7 +248,7 @@ export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>, ...@@ -250,7 +248,7 @@ export class GroupControl extends React.PureComponent<ParamProps<PD.Group<any>>,
</button> </button>
</div> </div>
{this.state.isExpanded && <div className='msp-control-offset' style={{ display: this.state.isExpanded ? 'block' : 'none' }}> {this.state.isExpanded && <div className='msp-control-offset' style={{ display: this.state.isExpanded ? 'block' : 'none' }}>
<ParameterControls params={params} onChange={this.onChangeParam} values={value.params} onEnter={this.props.onEnter} isDisabled={this.props.isDisabled} /> <ParameterControls params={params} onChange={this.onChangeParam} values={this.props.value} onEnter={this.props.onEnter} isDisabled={this.props.isDisabled} />
</div> </div>
} }
</div> </div>
...@@ -268,8 +266,7 @@ export class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any> ...@@ -268,8 +266,7 @@ export class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any>
} }
onChangeParam: ParamOnChange = e => { onChangeParam: ParamOnChange = e => {
const value: PD.Mapped<any>['defaultValue'] = this.props.value; this.change({ name: this.props.value.name, params: e.value });
this.change({ name: value.name, params: e.value });
} }
render() { render() {
...@@ -288,7 +285,7 @@ export class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any> ...@@ -288,7 +285,7 @@ export class MappedControl extends React.PureComponent<ParamProps<PD.Mapped<any>
return <div> return <div>
{select} {select}
<Mapped param={param} value={value} name={`${label} Properties`} onChange={this.onChangeParam} onEnter={this.props.onEnter} isDisabled={this.props.isDisabled} /> <Mapped param={param} value={value.params} name={`${label} Properties`} onChange={this.onChangeParam} onEnter={this.props.onEnter} isDisabled={this.props.isDisabled} />
</div> </div>
} }
} }
......
...@@ -132,7 +132,7 @@ export namespace ParamDefinition { ...@@ -132,7 +132,7 @@ export namespace ParamDefinition {
return setInfo<Group<Values<P>>>({ type: 'group', defaultValue: getDefaultValues(params) as any, params }, info); return setInfo<Group<Values<P>>>({ type: 'group', defaultValue: getDefaultValues(params) as any, params }, info);
} }
export interface NamedParams<T = any> { name: string, params: T } export interface NamedParams<T = any, K = string> { name: K, params: T }
export interface Mapped<T> extends Base<NamedParams<T>> { export interface Mapped<T> extends Base<NamedParams<T>> {
type: 'mapped', type: 'mapped',
select: Select<string>, select: Select<string>,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment