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

wip, sequence selector

parent a3094b4d
No related branches found
No related tags found
No related merge requests found
...@@ -10,29 +10,52 @@ import { PluginUIComponent } from './base'; ...@@ -10,29 +10,52 @@ import { PluginUIComponent } from './base';
import { StateTreeSpine } from '../../mol-state/tree/spine'; import { StateTreeSpine } from '../../mol-state/tree/spine';
import { PluginStateObject as SO } from '../state/objects'; import { PluginStateObject as SO } from '../state/objects';
import { Sequence } from './sequence/sequence'; import { Sequence } from './sequence/sequence';
import { Structure } from '../../mol-model/structure'; import { Structure, StructureElement, StructureProperties as SP } from '../../mol-model/structure';
import { SequenceWrapper } from './sequence/util'; import { SequenceWrapper } from './sequence/util';
import { PolymerSequenceWrapper } from './sequence/polymer'; import { PolymerSequenceWrapper } from './sequence/polymer';
import { StructureElementSelectionManager } from '../util/structure-element-selection'; import { StructureElementSelectionManager } from '../util/structure-element-selection';
import { MarkerAction } from '../../mol-util/marker-action'; import { MarkerAction } from '../../mol-util/marker-action';
import { ParameterControls } from './controls/parameters';
import { ParamDefinition as PD } from '../../mol-util/param-definition';
function getSequenceWrappersForStructure(structure: Structure, structureSelection: StructureElementSelectionManager) { function getSequenceWrapperForStructure(index: number, structure: Structure, structureSelection: StructureElementSelectionManager): SequenceWrapper.Any | undefined {
const sequenceWrappers: SequenceWrapper.Any[] = [] let j = 0
for (let i = 0, il = structure.units.length; i < il; ++i) {
const unit = structure.units[i]
if (unit.polymerElements.length === 0) continue
if (j === index) {
const sw = new PolymerSequenceWrapper({ structure, unit })
sw.markResidue(structureSelection.get(structure), MarkerAction.Select)
return sw
}
j += 1
}
}
function getPolymerOptionsForStructure(structure: Structure) {
const options: [number, string][] = []
let i = 0
structure.units.forEach(unit => { structure.units.forEach(unit => {
if (unit.polymerElements.length === 0) return if (unit.polymerElements.length === 0) return
const sw = new PolymerSequenceWrapper({ structure, unit }) const l = StructureElement.create(unit, unit.elements[0])
sw.markResidue(structureSelection.get(structure), MarkerAction.Select) const entityDescription = SP.entity.pdbx_description(l)
sequenceWrappers.push(sw) const label_asym_id = SP.chain.label_asym_id(l)
const label = `${label_asym_id}: ${entityDescription}`
options.push([ i, label ])
i += 1
}) })
return sequenceWrappers return options
} }
export class SequenceView extends PluginUIComponent<{ }, { }> { export class SequenceView extends PluginUIComponent<{ }, { polymer: number }> {
private spine: StateTreeSpine.Impl private spine: StateTreeSpine.Impl
state = { polymer: 0 }
componentDidMount() { componentDidMount() {
this.spine = new StateTreeSpine.Impl(this.plugin.state.dataState.cells); this.spine = new StateTreeSpine.Impl(this.plugin.state.dataState.cells);
...@@ -54,6 +77,18 @@ export class SequenceView extends PluginUIComponent<{ }, { }> { ...@@ -54,6 +77,18 @@ export class SequenceView extends PluginUIComponent<{ }, { }> {
return so && so.data return so && so.data
} }
private getParams(structure: Structure) {
return {
polymer: PD.Select(0, getPolymerOptionsForStructure(structure))
}
}
private setParamProps = (p: { param: PD.Base<any>, name: string, value: any }) => {
if (p.name === 'polymer') {
this.setState({ polymer: p.value })
}
}
render() { render() {
const structure = this.getStructure(); const structure = this.getStructure();
if (!structure) return <div className='msp-sequence'> if (!structure) return <div className='msp-sequence'>
...@@ -61,11 +96,14 @@ export class SequenceView extends PluginUIComponent<{ }, { }> { ...@@ -61,11 +96,14 @@ export class SequenceView extends PluginUIComponent<{ }, { }> {
</div>; </div>;
const { structureSelection } = this.plugin.helpers const { structureSelection } = this.plugin.helpers
const sequenceWrappers = getSequenceWrappersForStructure(structure, structureSelection) const params = this.getParams(structure)
const sequenceWrapper = getSequenceWrapperForStructure(this.state.polymer, structure, structureSelection)
return <div className='msp-sequence'> return <div className='msp-sequence'>
{sequenceWrappers.map((sequenceWrapper, i) => { <ParameterControls params={params} values={this.state} onChange={this.setParamProps} />
return <Sequence key={i} sequenceWrapper={sequenceWrapper} /> {sequenceWrapper !== undefined
})} ? <Sequence sequenceWrapper={sequenceWrapper} />
: <div className='msp-sequence-entity'>No sequence available</div>}
</div>; </div>;
} }
} }
\ No newline at end of file
...@@ -88,7 +88,6 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P, Sequ ...@@ -88,7 +88,6 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P, Sequ
render() { render() {
const { markerData } = this.state; const { markerData } = this.state;
const { label } = this.props.sequenceWrapper
const { offset, sequence } = this.props.sequenceWrapper.sequence; const { offset, sequence } = this.props.sequenceWrapper.sequence;
const elems: JSX.Element[] = []; const elems: JSX.Element[] = [];
...@@ -101,7 +100,6 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P, Sequ ...@@ -101,7 +100,6 @@ export class Sequence<P extends SequenceProps> extends PluginUIComponent<P, Sequ
onContextMenu={this.contextMenu} onContextMenu={this.contextMenu}
onMouseDown={this.mouseDown} onMouseDown={this.mouseDown}
> >
<span style={{ fontWeight: 'bold' }}>{label}:{offset}&nbsp;</span>
{elems} {elems}
</div>; </div>;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment