basic.ts 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { StateAction } from 'mol-state/action';
  7. import { PluginStateObject } from '../objects';
  8. import { StateTransforms } from '../transforms';
  9. import { ParamDefinition as PD } from 'mol-util/param-definition';
  10. import { StateSelection } from 'mol-state/state/selection';
  11. export const CreateStructureFromPDBe = StateAction.create<PluginStateObject.Root, void, { id: string }>({
  12. from: [PluginStateObject.Root],
  13. display: {
  14. name: 'Entry from PDBe',
  15. description: 'Download a structure from PDBe and create its default Assembly and visual'
  16. },
  17. params: {
  18. default: () => ({ id: '1grm' }),
  19. controls: () => ({
  20. id: PD.Text('PDB id', '', '1grm'),
  21. }),
  22. validate: p => !p.id || !p.id.trim() ? ['Enter id.'] : void 0
  23. },
  24. apply({ params, state }) {
  25. const url = `http://www.ebi.ac.uk/pdbe/static/entry/${params.id.toLowerCase()}_updated.cif`;
  26. const b = state.build();
  27. // const query = MolScriptBuilder.struct.generator.atomGroups({
  28. // // 'atom-test': MolScriptBuilder.core.rel.eq([
  29. // // MolScriptBuilder.struct.atomProperty.macromolecular.label_comp_id(),
  30. // // MolScriptBuilder.es('C')
  31. // // ]),
  32. // 'residue-test': MolScriptBuilder.core.rel.eq([
  33. // MolScriptBuilder.struct.atomProperty.macromolecular.label_comp_id(),
  34. // 'ALA'
  35. // ])
  36. // });
  37. const newTree = b.toRoot()
  38. .apply(StateTransforms.Data.Download, { url })
  39. .apply(StateTransforms.Data.ParseCif)
  40. .apply(StateTransforms.Model.ParseTrajectoryFromMmCif, {})
  41. .apply(StateTransforms.Model.CreateModelFromTrajectory, { modelIndex: 0 })
  42. .apply(StateTransforms.Model.CreateStructureAssembly)
  43. // .apply(StateTransforms.Model.CreateStructureSelection, { query, label: 'ALA residues' })
  44. .apply(StateTransforms.Visuals.CreateStructureRepresentation)
  45. .getTree();
  46. return state.update(newTree);
  47. }
  48. });
  49. export const UpdateTrajectory = StateAction.create<PluginStateObject.Root, void, { action: 'advance' | 'reset', by?: number }>({
  50. from: [],
  51. display: {
  52. name: 'Update Trajectory'
  53. },
  54. params: {
  55. default: () => ({ action: 'reset', by: 1 })
  56. },
  57. apply({ params, state }) {
  58. const models = state.select(q => q.rootsOfType(PluginStateObject.Molecule.Model).filter(c => c.transform.transformer === StateTransforms.Model.CreateModelFromTrajectory));
  59. const update = state.build();
  60. if (params.action === 'reset') {
  61. for (const m of models) {
  62. update.to(m.transform.ref).update(StateTransforms.Model.CreateModelFromTrajectory,
  63. () => ({ modelIndex: 0}));
  64. }
  65. } else {
  66. for (const m of models) {
  67. const parent = StateSelection.findAncestorOfType(state.tree, state.cells, m.transform.ref, [PluginStateObject.Molecule.Trajectory]);
  68. if (!parent || !parent.obj) continue;
  69. const traj = parent.obj as PluginStateObject.Molecule.Trajectory;
  70. update.to(m.transform.ref).update(StateTransforms.Model.CreateModelFromTrajectory,
  71. old => {
  72. let modelIndex = (old.modelIndex + params.by!) % traj.data.length;
  73. if (modelIndex < 0) modelIndex += traj.data.length;
  74. return { modelIndex };
  75. });
  76. }
  77. }
  78. return state.update(update);
  79. }
  80. });