chemicalml 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/docs.yml +63 -0
- data/.github/workflows/links.yml +99 -0
- data/.github/workflows/opal.yml +34 -0
- data/.github/workflows/performance.yml +25 -0
- data/.github/workflows/rake.yml +19 -0
- data/.github/workflows/release.yml +28 -0
- data/CHANGELOG.md +52 -12
- data/Gemfile +2 -1
- data/Rakefile +9 -4
- data/TODO.align/18-wire-class-registry.md +46 -0
- data/TODO.align/19-schema-aware-translator.md +33 -0
- data/TODO.align/20-missing-translator-rules.md +44 -0
- data/TODO.align/21-encapsulate-translator.md +33 -0
- data/TODO.align/22-dry-role-modules.md +32 -0
- data/TODO.align/23-final-spec-lint.md +25 -0
- data/TODO.align/24-autoload-wire-classes.md +84 -0
- data/TODO.align/25-value-container-schema-awareness.md +44 -0
- data/TODO.align/26-remove-dead-code.md +16 -0
- data/TODO.align/27-final-spec-lint.md +26 -0
- data/TODO.align/28-stereo-model.md +40 -0
- data/TODO.align/29-stereo-wire-children.md +30 -0
- data/TODO.align/30-stereo-translator.md +32 -0
- data/TODO.align/31-final-spec-lint.md +20 -0
- data/TODO.align/32-polymorphic-translator.md +43 -0
- data/TODO.align/33-polymorphic-parse.md +43 -0
- data/TODO.align/34-polymorphic-specs.md +16 -0
- data/TODO.align/35-final-spec-lint.md +10 -0
- data/TODO.align/README.round10.md +30 -0
- data/TODO.align/README.round11.md +50 -0
- data/TODO.align/README.round12.md +73 -0
- data/TODO.align/README.round13.md +59 -0
- data/TODO.align/README.round14.md +48 -0
- data/TODO.align/README.round15.md +86 -0
- data/TODO.align/README.round16.md +46 -0
- data/TODO.align/README.round3.md +27 -0
- data/TODO.align/README.round4.md +18 -0
- data/TODO.align/README.round5.md +20 -0
- data/TODO.align/README.round6.md +27 -0
- data/TODO.align/README.round7.md +43 -0
- data/TODO.align/README.round8.md +24 -0
- data/TODO.align/README.round9.md +50 -0
- data/data/dictionaries/_index.yaml +9 -1
- data/data/dictionaries/cif.yaml +155 -0
- data/data/dictionaries/cml.yaml +172 -0
- data/data/dictionaries/cml_formula.yaml +63 -0
- data/data/dictionaries/cml_name.yaml +84 -0
- data/data/dictionaries/unit_non_si.yaml +30 -0
- data/data/dictionaries/unit_type.yaml +12 -0
- data/lib/chemicalml/cml/aliases.rb +20 -0
- data/lib/chemicalml/cml/base/abundance.rb +28 -0
- data/lib/chemicalml/cml/base/action.rb +30 -0
- data/lib/chemicalml/cml/base/action_list.rb +33 -0
- data/lib/chemicalml/cml/base/amount.rb +28 -0
- data/lib/chemicalml/cml/base/angle.rb +32 -0
- data/lib/chemicalml/cml/base/any_cml.rb +28 -0
- data/lib/chemicalml/cml/base/array.rb +1 -1
- data/lib/chemicalml/cml/base/array_list.rb +28 -0
- data/lib/chemicalml/cml/base/atom.rb +19 -1
- data/lib/chemicalml/cml/base/atom_array.rb +1 -1
- data/lib/chemicalml/cml/base/atom_parity.rb +1 -1
- data/lib/chemicalml/cml/base/atom_set.rb +28 -0
- data/lib/chemicalml/cml/base/atom_type.rb +32 -0
- data/lib/chemicalml/cml/base/atom_type_list.rb +31 -0
- data/lib/chemicalml/cml/base/atomic_basis_function.rb +40 -0
- data/lib/chemicalml/cml/base/band.rb +32 -0
- data/lib/chemicalml/cml/base/band_list.rb +31 -0
- data/lib/chemicalml/cml/base/basis_set.rb +31 -0
- data/lib/chemicalml/cml/base/bond.rb +5 -1
- data/lib/chemicalml/cml/base/bond_array.rb +1 -1
- data/lib/chemicalml/cml/base/bond_set.rb +28 -0
- data/lib/chemicalml/cml/base/bond_stereo.rb +1 -1
- data/lib/chemicalml/cml/base/bond_type.rb +32 -0
- data/lib/chemicalml/cml/base/bond_type_list.rb +31 -0
- data/lib/chemicalml/cml/base/cell_parameter.rb +34 -0
- data/lib/chemicalml/cml/base/cml_module.rb +1 -1
- data/lib/chemicalml/cml/base/condition_list.rb +33 -0
- data/lib/chemicalml/cml/base/crystal.rb +35 -0
- data/lib/chemicalml/cml/base/definition.rb +30 -0
- data/lib/chemicalml/cml/base/description.rb +30 -0
- data/lib/chemicalml/cml/base/dictionary.rb +1 -1
- data/lib/chemicalml/cml/base/dictionary_entry.rb +1 -1
- data/lib/chemicalml/cml/base/dimension.rb +32 -0
- data/lib/chemicalml/cml/base/document.rb +9 -1
- data/lib/chemicalml/cml/base/documentation.rb +30 -0
- data/lib/chemicalml/cml/base/eigen.rb +34 -0
- data/lib/chemicalml/cml/base/electron.rb +36 -0
- data/lib/chemicalml/cml/base/formula.rb +1 -1
- data/lib/chemicalml/cml/base/fragment.rb +35 -0
- data/lib/chemicalml/cml/base/fragment_list.rb +31 -0
- data/lib/chemicalml/cml/base/gradient.rb +32 -0
- data/lib/chemicalml/cml/base/identifier.rb +1 -1
- data/lib/chemicalml/cml/base/isotope.rb +34 -0
- data/lib/chemicalml/cml/base/isotope_list.rb +31 -0
- data/lib/chemicalml/cml/base/join.rb +30 -0
- data/lib/chemicalml/cml/base/kpoint.rb +32 -0
- data/lib/chemicalml/cml/base/kpoint_list.rb +31 -0
- data/lib/chemicalml/cml/base/label.rb +1 -1
- data/lib/chemicalml/cml/base/lattice.rb +35 -0
- data/lib/chemicalml/cml/base/lattice_vector.rb +30 -0
- data/lib/chemicalml/cml/base/length.rb +32 -0
- data/lib/chemicalml/cml/base/line3.rb +30 -0
- data/lib/chemicalml/cml/base/link.rb +38 -0
- data/lib/chemicalml/cml/base/list.rb +1 -1
- data/lib/chemicalml/cml/base/map.rb +28 -0
- data/lib/chemicalml/cml/base/matrix.rb +1 -1
- data/lib/chemicalml/cml/base/mechanism.rb +31 -0
- data/lib/chemicalml/cml/base/mechanism_component.rb +30 -0
- data/lib/chemicalml/cml/base/metadata.rb +1 -1
- data/lib/chemicalml/cml/base/metadata_list.rb +1 -1
- data/lib/chemicalml/cml/base/molecule.rb +17 -1
- data/lib/chemicalml/cml/base/molecule_list.rb +31 -0
- data/lib/chemicalml/cml/base/name.rb +1 -1
- data/lib/chemicalml/cml/base/object.rb +30 -0
- data/lib/chemicalml/cml/base/observation.rb +28 -0
- data/lib/chemicalml/cml/base/parameter.rb +1 -1
- data/lib/chemicalml/cml/base/parameter_list.rb +1 -1
- data/lib/chemicalml/cml/base/particle.rb +30 -0
- data/lib/chemicalml/cml/base/peak.rb +40 -0
- data/lib/chemicalml/cml/base/peak_group.rb +31 -0
- data/lib/chemicalml/cml/base/peak_list.rb +33 -0
- data/lib/chemicalml/cml/base/peak_structure.rb +30 -0
- data/lib/chemicalml/cml/base/plane3.rb +30 -0
- data/lib/chemicalml/cml/base/point3.rb +30 -0
- data/lib/chemicalml/cml/base/potential.rb +30 -0
- data/lib/chemicalml/cml/base/potential_form.rb +30 -0
- data/lib/chemicalml/cml/base/potential_list.rb +31 -0
- data/lib/chemicalml/cml/base/product.rb +1 -1
- data/lib/chemicalml/cml/base/product_list.rb +1 -1
- data/lib/chemicalml/cml/base/property.rb +1 -1
- data/lib/chemicalml/cml/base/property_list.rb +1 -1
- data/lib/chemicalml/cml/base/reactant.rb +1 -1
- data/lib/chemicalml/cml/base/reactant_list.rb +1 -1
- data/lib/chemicalml/cml/base/reaction.rb +9 -1
- data/lib/chemicalml/cml/base/reaction_list.rb +1 -1
- data/lib/chemicalml/cml/base/reaction_scheme.rb +33 -0
- data/lib/chemicalml/cml/base/reaction_step.rb +35 -0
- data/lib/chemicalml/cml/base/reaction_step_list.rb +31 -0
- data/lib/chemicalml/cml/base/reactive_centre.rb +30 -0
- data/lib/chemicalml/cml/base/region.rb +28 -0
- data/lib/chemicalml/cml/base/sample.rb +28 -0
- data/lib/chemicalml/cml/base/scalar.rb +1 -1
- data/lib/chemicalml/cml/base/spectator.rb +28 -0
- data/lib/chemicalml/cml/base/spectator_list.rb +31 -0
- data/lib/chemicalml/cml/base/spectrum.rb +41 -0
- data/lib/chemicalml/cml/base/spectrum_data.rb +33 -0
- data/lib/chemicalml/cml/base/spectrum_list.rb +31 -0
- data/lib/chemicalml/cml/base/sphere3.rb +30 -0
- data/lib/chemicalml/cml/base/stmml.rb +28 -0
- data/lib/chemicalml/cml/base/substance.rb +1 -1
- data/lib/chemicalml/cml/base/substance_list.rb +31 -0
- data/lib/chemicalml/cml/base/symmetry.rb +32 -0
- data/lib/chemicalml/cml/base/system.rb +33 -0
- data/lib/chemicalml/cml/base/table.rb +33 -0
- data/lib/chemicalml/cml/base/table_cell.rb +30 -0
- data/lib/chemicalml/cml/base/table_content.rb +33 -0
- data/lib/chemicalml/cml/base/table_header.rb +31 -0
- data/lib/chemicalml/cml/base/table_header_cell.rb +30 -0
- data/lib/chemicalml/cml/base/table_row.rb +31 -0
- data/lib/chemicalml/cml/base/table_row_list.rb +31 -0
- data/lib/chemicalml/cml/base/torsion.rb +32 -0
- data/lib/chemicalml/cml/base/transform3.rb +30 -0
- data/lib/chemicalml/cml/base/transition_state.rb +28 -0
- data/lib/chemicalml/cml/base/unit.rb +1 -1
- data/lib/chemicalml/cml/base/unit_list.rb +1 -1
- data/lib/chemicalml/cml/base/unit_type.rb +1 -1
- data/lib/chemicalml/cml/base/unit_type_list.rb +1 -1
- data/lib/chemicalml/cml/base/vector3.rb +30 -0
- data/lib/chemicalml/cml/base/xaxis.rb +32 -0
- data/lib/chemicalml/cml/base/yaxis.rb +32 -0
- data/lib/chemicalml/cml/base/z_matrix.rb +30 -0
- data/lib/chemicalml/cml/base.rb +85 -0
- data/lib/chemicalml/cml/child_mappings.rb +168 -0
- data/lib/chemicalml/cml/elements.rb +130 -42
- data/lib/chemicalml/cml/role/abundance.rb +12 -0
- data/lib/chemicalml/cml/role/action.rb +12 -0
- data/lib/chemicalml/cml/role/action_list.rb +12 -0
- data/lib/chemicalml/cml/role/amount.rb +12 -0
- data/lib/chemicalml/cml/role/angle.rb +12 -0
- data/lib/chemicalml/cml/role/any_cml.rb +12 -0
- data/lib/chemicalml/cml/role/array_list.rb +12 -0
- data/lib/chemicalml/cml/role/atom_set.rb +12 -0
- data/lib/chemicalml/cml/role/atom_type.rb +12 -0
- data/lib/chemicalml/cml/role/atom_type_list.rb +12 -0
- data/lib/chemicalml/cml/role/atomic_basis_function.rb +12 -0
- data/lib/chemicalml/cml/role/band.rb +12 -0
- data/lib/chemicalml/cml/role/band_list.rb +12 -0
- data/lib/chemicalml/cml/role/basis_set.rb +12 -0
- data/lib/chemicalml/cml/role/bond_set.rb +12 -0
- data/lib/chemicalml/cml/role/bond_type.rb +12 -0
- data/lib/chemicalml/cml/role/bond_type_list.rb +12 -0
- data/lib/chemicalml/cml/role/cell_parameter.rb +12 -0
- data/lib/chemicalml/cml/role/condition_list.rb +12 -0
- data/lib/chemicalml/cml/role/crystal.rb +12 -0
- data/lib/chemicalml/cml/role/definition.rb +12 -0
- data/lib/chemicalml/cml/role/description.rb +12 -0
- data/lib/chemicalml/cml/role/dimension.rb +12 -0
- data/lib/chemicalml/cml/role/documentation.rb +12 -0
- data/lib/chemicalml/cml/role/eigen.rb +12 -0
- data/lib/chemicalml/cml/role/electron.rb +12 -0
- data/lib/chemicalml/cml/role/fragment.rb +12 -0
- data/lib/chemicalml/cml/role/fragment_list.rb +12 -0
- data/lib/chemicalml/cml/role/gradient.rb +12 -0
- data/lib/chemicalml/cml/role/isotope.rb +12 -0
- data/lib/chemicalml/cml/role/isotope_list.rb +12 -0
- data/lib/chemicalml/cml/role/join.rb +12 -0
- data/lib/chemicalml/cml/role/kpoint.rb +12 -0
- data/lib/chemicalml/cml/role/kpoint_list.rb +12 -0
- data/lib/chemicalml/cml/role/lattice.rb +12 -0
- data/lib/chemicalml/cml/role/lattice_vector.rb +12 -0
- data/lib/chemicalml/cml/role/length.rb +12 -0
- data/lib/chemicalml/cml/role/line3.rb +12 -0
- data/lib/chemicalml/cml/role/link.rb +12 -0
- data/lib/chemicalml/cml/role/map.rb +12 -0
- data/lib/chemicalml/cml/role/mechanism.rb +12 -0
- data/lib/chemicalml/cml/role/mechanism_component.rb +12 -0
- data/lib/chemicalml/cml/role/molecule_list.rb +12 -0
- data/lib/chemicalml/cml/role/object.rb +12 -0
- data/lib/chemicalml/cml/role/observation.rb +12 -0
- data/lib/chemicalml/cml/role/particle.rb +12 -0
- data/lib/chemicalml/cml/role/peak.rb +12 -0
- data/lib/chemicalml/cml/role/peak_group.rb +12 -0
- data/lib/chemicalml/cml/role/peak_list.rb +12 -0
- data/lib/chemicalml/cml/role/peak_structure.rb +12 -0
- data/lib/chemicalml/cml/role/plane3.rb +12 -0
- data/lib/chemicalml/cml/role/point3.rb +12 -0
- data/lib/chemicalml/cml/role/potential.rb +12 -0
- data/lib/chemicalml/cml/role/potential_form.rb +12 -0
- data/lib/chemicalml/cml/role/potential_list.rb +12 -0
- data/lib/chemicalml/cml/role/reaction_scheme.rb +12 -0
- data/lib/chemicalml/cml/role/reaction_step.rb +12 -0
- data/lib/chemicalml/cml/role/reaction_step_list.rb +12 -0
- data/lib/chemicalml/cml/role/reactive_centre.rb +12 -0
- data/lib/chemicalml/cml/role/region.rb +12 -0
- data/lib/chemicalml/cml/role/sample.rb +12 -0
- data/lib/chemicalml/cml/role/spectator.rb +12 -0
- data/lib/chemicalml/cml/role/spectator_list.rb +12 -0
- data/lib/chemicalml/cml/role/spectrum.rb +12 -0
- data/lib/chemicalml/cml/role/spectrum_data.rb +12 -0
- data/lib/chemicalml/cml/role/spectrum_list.rb +12 -0
- data/lib/chemicalml/cml/role/sphere3.rb +12 -0
- data/lib/chemicalml/cml/role/stmml.rb +12 -0
- data/lib/chemicalml/cml/role/substance_list.rb +12 -0
- data/lib/chemicalml/cml/role/symmetry.rb +12 -0
- data/lib/chemicalml/cml/role/system.rb +12 -0
- data/lib/chemicalml/cml/role/table.rb +12 -0
- data/lib/chemicalml/cml/role/table_cell.rb +12 -0
- data/lib/chemicalml/cml/role/table_content.rb +12 -0
- data/lib/chemicalml/cml/role/table_header.rb +12 -0
- data/lib/chemicalml/cml/role/table_header_cell.rb +12 -0
- data/lib/chemicalml/cml/role/table_row.rb +12 -0
- data/lib/chemicalml/cml/role/table_row_list.rb +12 -0
- data/lib/chemicalml/cml/role/torsion.rb +12 -0
- data/lib/chemicalml/cml/role/transform3.rb +12 -0
- data/lib/chemicalml/cml/role/transition_state.rb +12 -0
- data/lib/chemicalml/cml/role/vector3.rb +12 -0
- data/lib/chemicalml/cml/role/xaxis.rb +12 -0
- data/lib/chemicalml/cml/role/yaxis.rb +12 -0
- data/lib/chemicalml/cml/role/z_matrix.rb +12 -0
- data/lib/chemicalml/cml/role.rb +86 -1
- data/lib/chemicalml/cml/schema24/abundance.rb +13 -0
- data/lib/chemicalml/cml/schema24/action.rb +13 -0
- data/lib/chemicalml/cml/schema24/action_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/amount.rb +13 -0
- data/lib/chemicalml/cml/schema24/angle.rb +13 -0
- data/lib/chemicalml/cml/schema24/any_cml.rb +13 -0
- data/lib/chemicalml/cml/schema24/array.rb +15 -0
- data/lib/chemicalml/cml/schema24/array_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/atom.rb +15 -0
- data/lib/chemicalml/cml/schema24/atom_array.rb +15 -0
- data/lib/chemicalml/cml/schema24/atom_parity.rb +15 -0
- data/lib/chemicalml/cml/schema24/atom_set.rb +13 -0
- data/lib/chemicalml/cml/schema24/atom_type.rb +13 -0
- data/lib/chemicalml/cml/schema24/atom_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/atomic_basis_function.rb +13 -0
- data/lib/chemicalml/cml/schema24/band.rb +13 -0
- data/lib/chemicalml/cml/schema24/band_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/basis_set.rb +13 -0
- data/lib/chemicalml/cml/schema24/bond.rb +15 -0
- data/lib/chemicalml/cml/schema24/bond_array.rb +15 -0
- data/lib/chemicalml/cml/schema24/bond_set.rb +13 -0
- data/lib/chemicalml/cml/schema24/bond_stereo.rb +15 -0
- data/lib/chemicalml/cml/schema24/bond_type.rb +13 -0
- data/lib/chemicalml/cml/schema24/bond_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/cell_parameter.rb +13 -0
- data/lib/chemicalml/cml/schema24/condition_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/context.rb +18 -0
- data/lib/chemicalml/cml/schema24/crystal.rb +13 -0
- data/lib/chemicalml/cml/schema24/definition.rb +13 -0
- data/lib/chemicalml/cml/schema24/description.rb +13 -0
- data/lib/chemicalml/cml/schema24/dictionary.rb +15 -0
- data/lib/chemicalml/cml/schema24/dictionary_entry.rb +15 -0
- data/lib/chemicalml/cml/schema24/dimension.rb +13 -0
- data/lib/chemicalml/cml/schema24/document.rb +15 -0
- data/lib/chemicalml/cml/schema24/documentation.rb +13 -0
- data/lib/chemicalml/cml/schema24/eigen.rb +13 -0
- data/lib/chemicalml/cml/schema24/electron.rb +13 -0
- data/lib/chemicalml/cml/schema24/formula.rb +15 -0
- data/lib/chemicalml/cml/schema24/fragment.rb +13 -0
- data/lib/chemicalml/cml/schema24/fragment_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/gradient.rb +13 -0
- data/lib/chemicalml/cml/schema24/identifier.rb +15 -0
- data/lib/chemicalml/cml/schema24/isotope.rb +13 -0
- data/lib/chemicalml/cml/schema24/isotope_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/join.rb +13 -0
- data/lib/chemicalml/cml/schema24/kpoint.rb +13 -0
- data/lib/chemicalml/cml/schema24/kpoint_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/label.rb +15 -0
- data/lib/chemicalml/cml/schema24/lattice.rb +13 -0
- data/lib/chemicalml/cml/schema24/lattice_vector.rb +13 -0
- data/lib/chemicalml/cml/schema24/length.rb +13 -0
- data/lib/chemicalml/cml/schema24/line3.rb +13 -0
- data/lib/chemicalml/cml/schema24/link.rb +13 -0
- data/lib/chemicalml/cml/schema24/list.rb +15 -0
- data/lib/chemicalml/cml/schema24/map.rb +13 -0
- data/lib/chemicalml/cml/schema24/matrix.rb +15 -0
- data/lib/chemicalml/cml/schema24/mechanism.rb +13 -0
- data/lib/chemicalml/cml/schema24/mechanism_component.rb +13 -0
- data/lib/chemicalml/cml/schema24/metadata.rb +15 -0
- data/lib/chemicalml/cml/schema24/metadata_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/molecule.rb +15 -0
- data/lib/chemicalml/cml/schema24/molecule_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/name.rb +15 -0
- data/lib/chemicalml/cml/schema24/object.rb +13 -0
- data/lib/chemicalml/cml/schema24/observation.rb +13 -0
- data/lib/chemicalml/cml/schema24/parameter.rb +15 -0
- data/lib/chemicalml/cml/schema24/parameter_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/particle.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak_group.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/peak_structure.rb +13 -0
- data/lib/chemicalml/cml/schema24/plane3.rb +13 -0
- data/lib/chemicalml/cml/schema24/point3.rb +13 -0
- data/lib/chemicalml/cml/schema24/potential.rb +13 -0
- data/lib/chemicalml/cml/schema24/potential_form.rb +13 -0
- data/lib/chemicalml/cml/schema24/potential_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/product.rb +15 -0
- data/lib/chemicalml/cml/schema24/product_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/property.rb +15 -0
- data/lib/chemicalml/cml/schema24/property_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/reactant.rb +15 -0
- data/lib/chemicalml/cml/schema24/reactant_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/reaction.rb +15 -0
- data/lib/chemicalml/cml/schema24/reaction_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/reaction_scheme.rb +13 -0
- data/lib/chemicalml/cml/schema24/reaction_step.rb +13 -0
- data/lib/chemicalml/cml/schema24/reaction_step_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/reactive_centre.rb +13 -0
- data/lib/chemicalml/cml/schema24/region.rb +13 -0
- data/lib/chemicalml/cml/schema24/sample.rb +13 -0
- data/lib/chemicalml/cml/schema24/scalar.rb +15 -0
- data/lib/chemicalml/cml/schema24/spectator.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectator_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectrum.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectrum_data.rb +13 -0
- data/lib/chemicalml/cml/schema24/spectrum_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/sphere3.rb +13 -0
- data/lib/chemicalml/cml/schema24/stmml.rb +13 -0
- data/lib/chemicalml/cml/schema24/substance.rb +15 -0
- data/lib/chemicalml/cml/schema24/substance_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/symmetry.rb +13 -0
- data/lib/chemicalml/cml/schema24/system.rb +13 -0
- data/lib/chemicalml/cml/schema24/table.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_cell.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_content.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_header.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_header_cell.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_row.rb +13 -0
- data/lib/chemicalml/cml/schema24/table_row_list.rb +13 -0
- data/lib/chemicalml/cml/schema24/torsion.rb +13 -0
- data/lib/chemicalml/cml/schema24/transform3.rb +13 -0
- data/lib/chemicalml/cml/schema24/transition_state.rb +13 -0
- data/lib/chemicalml/cml/schema24/unit.rb +15 -0
- data/lib/chemicalml/cml/schema24/unit_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/unit_type.rb +15 -0
- data/lib/chemicalml/cml/schema24/unit_type_list.rb +15 -0
- data/lib/chemicalml/cml/schema24/vector3.rb +13 -0
- data/lib/chemicalml/cml/schema24/xaxis.rb +13 -0
- data/lib/chemicalml/cml/schema24/yaxis.rb +13 -0
- data/lib/chemicalml/cml/schema24/z_matrix.rb +13 -0
- data/lib/chemicalml/cml/schema24.rb +131 -19
- data/lib/chemicalml/cml/schema3/abundance.rb +13 -0
- data/lib/chemicalml/cml/schema3/action.rb +13 -0
- data/lib/chemicalml/cml/schema3/action_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/amount.rb +13 -0
- data/lib/chemicalml/cml/schema3/angle.rb +13 -0
- data/lib/chemicalml/cml/schema3/any_cml.rb +13 -0
- data/lib/chemicalml/cml/schema3/array.rb +15 -0
- data/lib/chemicalml/cml/schema3/array_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/atom.rb +15 -0
- data/lib/chemicalml/cml/schema3/atom_array.rb +15 -0
- data/lib/chemicalml/cml/schema3/atom_parity.rb +15 -0
- data/lib/chemicalml/cml/schema3/atom_set.rb +13 -0
- data/lib/chemicalml/cml/schema3/atom_type.rb +13 -0
- data/lib/chemicalml/cml/schema3/atom_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/atomic_basis_function.rb +13 -0
- data/lib/chemicalml/cml/schema3/band.rb +13 -0
- data/lib/chemicalml/cml/schema3/band_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/basis_set.rb +13 -0
- data/lib/chemicalml/cml/schema3/bond.rb +15 -0
- data/lib/chemicalml/cml/schema3/bond_array.rb +15 -0
- data/lib/chemicalml/cml/schema3/bond_set.rb +13 -0
- data/lib/chemicalml/cml/schema3/bond_stereo.rb +15 -0
- data/lib/chemicalml/cml/schema3/bond_type.rb +13 -0
- data/lib/chemicalml/cml/schema3/bond_type_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/cell_parameter.rb +13 -0
- data/lib/chemicalml/cml/schema3/cml_module.rb +15 -0
- data/lib/chemicalml/cml/schema3/condition_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/context.rb +18 -0
- data/lib/chemicalml/cml/schema3/crystal.rb +13 -0
- data/lib/chemicalml/cml/schema3/definition.rb +13 -0
- data/lib/chemicalml/cml/schema3/description.rb +13 -0
- data/lib/chemicalml/cml/schema3/dictionary.rb +15 -0
- data/lib/chemicalml/cml/schema3/dictionary_entry.rb +15 -0
- data/lib/chemicalml/cml/schema3/dimension.rb +13 -0
- data/lib/chemicalml/cml/schema3/document.rb +15 -0
- data/lib/chemicalml/cml/schema3/documentation.rb +13 -0
- data/lib/chemicalml/cml/schema3/eigen.rb +13 -0
- data/lib/chemicalml/cml/schema3/electron.rb +13 -0
- data/lib/chemicalml/cml/schema3/formula.rb +15 -0
- data/lib/chemicalml/cml/schema3/fragment.rb +13 -0
- data/lib/chemicalml/cml/schema3/fragment_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/gradient.rb +13 -0
- data/lib/chemicalml/cml/schema3/identifier.rb +15 -0
- data/lib/chemicalml/cml/schema3/isotope.rb +13 -0
- data/lib/chemicalml/cml/schema3/isotope_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/join.rb +13 -0
- data/lib/chemicalml/cml/schema3/kpoint.rb +13 -0
- data/lib/chemicalml/cml/schema3/kpoint_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/label.rb +15 -0
- data/lib/chemicalml/cml/schema3/lattice.rb +13 -0
- data/lib/chemicalml/cml/schema3/lattice_vector.rb +13 -0
- data/lib/chemicalml/cml/schema3/length.rb +13 -0
- data/lib/chemicalml/cml/schema3/line3.rb +13 -0
- data/lib/chemicalml/cml/schema3/link.rb +13 -0
- data/lib/chemicalml/cml/schema3/list.rb +15 -0
- data/lib/chemicalml/cml/schema3/map.rb +13 -0
- data/lib/chemicalml/cml/schema3/matrix.rb +15 -0
- data/lib/chemicalml/cml/schema3/mechanism.rb +13 -0
- data/lib/chemicalml/cml/schema3/mechanism_component.rb +13 -0
- data/lib/chemicalml/cml/schema3/metadata.rb +15 -0
- data/lib/chemicalml/cml/schema3/metadata_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/molecule.rb +15 -0
- data/lib/chemicalml/cml/schema3/molecule_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/name.rb +15 -0
- data/lib/chemicalml/cml/schema3/object.rb +13 -0
- data/lib/chemicalml/cml/schema3/observation.rb +13 -0
- data/lib/chemicalml/cml/schema3/parameter.rb +15 -0
- data/lib/chemicalml/cml/schema3/parameter_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/particle.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak_group.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/peak_structure.rb +13 -0
- data/lib/chemicalml/cml/schema3/plane3.rb +13 -0
- data/lib/chemicalml/cml/schema3/point3.rb +13 -0
- data/lib/chemicalml/cml/schema3/potential.rb +13 -0
- data/lib/chemicalml/cml/schema3/potential_form.rb +13 -0
- data/lib/chemicalml/cml/schema3/potential_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/product.rb +15 -0
- data/lib/chemicalml/cml/schema3/product_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/property.rb +15 -0
- data/lib/chemicalml/cml/schema3/property_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/reactant.rb +15 -0
- data/lib/chemicalml/cml/schema3/reactant_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/reaction.rb +15 -0
- data/lib/chemicalml/cml/schema3/reaction_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/reaction_scheme.rb +13 -0
- data/lib/chemicalml/cml/schema3/reaction_step.rb +13 -0
- data/lib/chemicalml/cml/schema3/reaction_step_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/reactive_centre.rb +13 -0
- data/lib/chemicalml/cml/schema3/region.rb +13 -0
- data/lib/chemicalml/cml/schema3/sample.rb +13 -0
- data/lib/chemicalml/cml/schema3/scalar.rb +15 -0
- data/lib/chemicalml/cml/schema3/spectator.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectator_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectrum.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectrum_data.rb +13 -0
- data/lib/chemicalml/cml/schema3/spectrum_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/sphere3.rb +13 -0
- data/lib/chemicalml/cml/schema3/stmml.rb +13 -0
- data/lib/chemicalml/cml/schema3/substance.rb +15 -0
- data/lib/chemicalml/cml/schema3/substance_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/symmetry.rb +13 -0
- data/lib/chemicalml/cml/schema3/system.rb +13 -0
- data/lib/chemicalml/cml/schema3/table.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_cell.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_content.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_header.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_header_cell.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_row.rb +13 -0
- data/lib/chemicalml/cml/schema3/table_row_list.rb +13 -0
- data/lib/chemicalml/cml/schema3/torsion.rb +13 -0
- data/lib/chemicalml/cml/schema3/transform3.rb +13 -0
- data/lib/chemicalml/cml/schema3/transition_state.rb +13 -0
- data/lib/chemicalml/cml/schema3/unit.rb +15 -0
- data/lib/chemicalml/cml/schema3/unit_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/unit_type.rb +15 -0
- data/lib/chemicalml/cml/schema3/unit_type_list.rb +15 -0
- data/lib/chemicalml/cml/schema3/vector3.rb +13 -0
- data/lib/chemicalml/cml/schema3/xaxis.rb +13 -0
- data/lib/chemicalml/cml/schema3/yaxis.rb +13 -0
- data/lib/chemicalml/cml/schema3/z_matrix.rb +13 -0
- data/lib/chemicalml/cml/schema3.rb +132 -17
- data/lib/chemicalml/cml/translator/value_translations.rb +40 -35
- data/lib/chemicalml/cml/translator.rb +319 -68
- data/lib/chemicalml/cml/wire_class_registry.rb +42 -0
- data/lib/chemicalml/cml.rb +138 -44
- data/lib/chemicalml/convention/molecular/constraints/atom_coordinates_must_be_paired.rb +32 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_id_must_match_pattern.rb +26 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_must_have_element_type.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/atom_must_have_id.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_must_have_atom_refs2.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_must_have_order.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/bond_order_should_not_be_numeric.rb +27 -0
- data/lib/chemicalml/convention/molecular/constraints/molecule_must_have_id.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/property_must_have_dict_ref.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints/scalar_must_have_data_type.rb +20 -0
- data/lib/chemicalml/convention/molecular/constraints.rb +20 -3
- data/lib/chemicalml/convention/molecular.rb +10 -0
- data/lib/chemicalml/model/atom.rb +28 -4
- data/lib/chemicalml/model/atom_parity.rb +21 -0
- data/lib/chemicalml/model/bond.rb +9 -3
- data/lib/chemicalml/model/bond_stereo.rb +29 -0
- data/lib/chemicalml/model/molecule.rb +13 -6
- data/lib/chemicalml/model.rb +2 -0
- data/lib/chemicalml/version.rb +1 -1
- data/lib/chemicalml/versioned_parser.rb +53 -12
- data/lib/chemicalml.rb +3 -1
- metadata +476 -40
- data/lib/chemicalml/cml/array.rb +0 -10
- data/lib/chemicalml/cml/atom.rb +0 -10
- data/lib/chemicalml/cml/atom_array.rb +0 -10
- data/lib/chemicalml/cml/atom_parity.rb +0 -10
- data/lib/chemicalml/cml/bond.rb +0 -10
- data/lib/chemicalml/cml/bond_array.rb +0 -10
- data/lib/chemicalml/cml/bond_stereo.rb +0 -10
- data/lib/chemicalml/cml/cml_module.rb +0 -10
- data/lib/chemicalml/cml/dictionary.rb +0 -10
- data/lib/chemicalml/cml/dictionary_entry.rb +0 -10
- data/lib/chemicalml/cml/document.rb +0 -10
- data/lib/chemicalml/cml/formula.rb +0 -10
- data/lib/chemicalml/cml/identifier.rb +0 -10
- data/lib/chemicalml/cml/label.rb +0 -10
- data/lib/chemicalml/cml/list.rb +0 -10
- data/lib/chemicalml/cml/matrix.rb +0 -10
- data/lib/chemicalml/cml/metadata.rb +0 -10
- data/lib/chemicalml/cml/metadata_list.rb +0 -10
- data/lib/chemicalml/cml/molecule.rb +0 -10
- data/lib/chemicalml/cml/name.rb +0 -10
- data/lib/chemicalml/cml/parameter.rb +0 -10
- data/lib/chemicalml/cml/parameter_list.rb +0 -10
- data/lib/chemicalml/cml/product.rb +0 -10
- data/lib/chemicalml/cml/product_list.rb +0 -10
- data/lib/chemicalml/cml/property.rb +0 -10
- data/lib/chemicalml/cml/property_list.rb +0 -10
- data/lib/chemicalml/cml/reactant.rb +0 -10
- data/lib/chemicalml/cml/reactant_list.rb +0 -10
- data/lib/chemicalml/cml/reaction.rb +0 -10
- data/lib/chemicalml/cml/reaction_list.rb +0 -10
- data/lib/chemicalml/cml/scalar.rb +0 -10
- data/lib/chemicalml/cml/substance.rb +0 -10
- data/lib/chemicalml/cml/unit.rb +0 -10
- data/lib/chemicalml/cml/unit_list.rb +0 -10
- data/lib/chemicalml/cml/unit_type.rb +0 -10
- data/lib/chemicalml/cml/unit_type_list.rb +0 -10
- data/lib/chemicalml/cml/wire_class_macro.rb +0 -45
|
@@ -5,41 +5,103 @@ module Chemicalml
|
|
|
5
5
|
# Adapter between the canonical `Chemicalml::Model` and the CML XML
|
|
6
6
|
# wire-format layer (`Chemicalml::Cml::*` lutaml-model classes).
|
|
7
7
|
#
|
|
8
|
-
# Pure transformation. No I/O. Two class methods, one per
|
|
9
|
-
# direction.
|
|
10
|
-
#
|
|
11
|
-
#
|
|
8
|
+
# Pure transformation. No I/O. Two public class methods, one per
|
|
9
|
+
# direction. All helpers are private.
|
|
10
|
+
#
|
|
11
|
+
# `from_canonical` accepts a `schema:` keyword (`:schema3` default,
|
|
12
|
+
# or `:schema24`) and uses `WireClassRegistry` to instantiate the
|
|
13
|
+
# right wire class for every nested element — not just the
|
|
14
|
+
# Document root.
|
|
12
15
|
class Translator
|
|
13
16
|
autoload :ValueTranslations, "chemicalml/cml/translator/value_translations"
|
|
14
17
|
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
+
# Wire format -> canonical. Polymorphic: accepts either a wire
|
|
19
|
+
# Document (`<cml>` root) or a wire Module (`<module>` root).
|
|
20
|
+
# Dispatches via Role module checks.
|
|
21
|
+
def self.to_canonical(node)
|
|
22
|
+
case node
|
|
23
|
+
when Chemicalml::Cml::Role::Document
|
|
24
|
+
document_to_canonical(node)
|
|
25
|
+
when Chemicalml::Cml::Role::Module
|
|
26
|
+
module_to_canonical(node)
|
|
27
|
+
else
|
|
28
|
+
raise ArgumentError,
|
|
29
|
+
"to_canonical accepts a wire Document or Module, " \
|
|
30
|
+
"got #{node.class}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Wire Document -> canonical Model::Document.
|
|
35
|
+
def self.document_to_canonical(document)
|
|
18
36
|
Model::Document.new(
|
|
19
37
|
molecules: document.molecules.map { |m| molecule_to_canonical(m) },
|
|
20
38
|
reactions: document.reactions.map { |r| reaction_to_canonical(r) }
|
|
21
39
|
)
|
|
22
40
|
end
|
|
23
41
|
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
42
|
+
# Wire Module -> canonical Model::Module. Used for compchem
|
|
43
|
+
# documents where the root is `<module convention="convention:compchem">`
|
|
44
|
+
# rather than `<cml>`.
|
|
45
|
+
def self.module_to_canonical(wire_module)
|
|
46
|
+
Model::Module.new(
|
|
47
|
+
id: wire_module.id,
|
|
48
|
+
title: wire_module.title,
|
|
49
|
+
dict_ref: wire_module.dict_ref,
|
|
50
|
+
convention: wire_module.convention,
|
|
51
|
+
molecules: (wire_module.molecules || []).map { |m| molecule_to_canonical(m) },
|
|
52
|
+
modules: (wire_module.modules || []).map { |m| module_to_canonical(m) },
|
|
53
|
+
parameter_lists: (wire_module.parameter_lists || []).map { |l| parameter_list_to_canonical(l) },
|
|
54
|
+
property_lists: (wire_module.property_lists || []).map { |l| property_list_to_canonical(l) },
|
|
55
|
+
metadata_lists: (wire_module.metadata_lists || []).map { |l| metadata_list_to_canonical(l) },
|
|
56
|
+
lists: []
|
|
31
57
|
)
|
|
32
58
|
end
|
|
33
59
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
60
|
+
# Canonical -> wire format. Polymorphic: accepts either a
|
|
61
|
+
# canonical Document or a canonical Module. `schema:` selects
|
|
62
|
+
# the target version (`:schema3` default, or `:schema24`).
|
|
63
|
+
def self.from_canonical(node, schema: :schema3)
|
|
64
|
+
case node
|
|
65
|
+
when Model::Document
|
|
66
|
+
document_from_canonical(node, schema: schema)
|
|
67
|
+
when Model::Module
|
|
68
|
+
module_from_canonical(node, schema: schema)
|
|
38
69
|
else
|
|
39
|
-
raise ArgumentError,
|
|
70
|
+
raise ArgumentError,
|
|
71
|
+
"from_canonical accepts a canonical Document or " \
|
|
72
|
+
"Module, got #{node.class}"
|
|
40
73
|
end
|
|
41
74
|
end
|
|
42
|
-
|
|
75
|
+
|
|
76
|
+
# Canonical Document -> wire Document. All nested wire classes
|
|
77
|
+
# are looked up via `WireClassRegistry.for(schema, role)` so
|
|
78
|
+
# the right version's class is used at every level.
|
|
79
|
+
def self.document_from_canonical(document, schema: :schema3)
|
|
80
|
+
wire_doc_class(schema).new(
|
|
81
|
+
molecules: document.molecules.map { |m| molecule_from_canonical(m, schema: schema) },
|
|
82
|
+
reactions: document.reactions.map { |r| reaction_from_canonical(r, schema: schema) }
|
|
83
|
+
)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Canonical Model::Module -> wire Module. Compchem documents
|
|
87
|
+
# are rooted at `<module>` rather than `<cml>`; this method
|
|
88
|
+
# produces the corresponding wire tree (Schema 3 only — Schema
|
|
89
|
+
# 2.4 lacks `<module>`).
|
|
90
|
+
def self.module_from_canonical(model_module, schema: :schema3)
|
|
91
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
92
|
+
registry.for(schema, Chemicalml::Cml::Role::Module).new(
|
|
93
|
+
id: model_module.id,
|
|
94
|
+
title: model_module.title,
|
|
95
|
+
dict_ref: model_module.dict_ref,
|
|
96
|
+
convention: model_module.convention,
|
|
97
|
+
molecules: model_module.molecules.map { |m| molecule_from_canonical(m, schema: schema) },
|
|
98
|
+
modules: model_module.modules.map { |m| module_from_canonical(m, schema: schema) },
|
|
99
|
+
parameter_lists: model_module.parameter_lists.map { |l| parameter_list_from_canonical(l, schema: schema) },
|
|
100
|
+
property_lists: model_module.property_lists.map { |l| property_list_from_canonical(l, schema: schema) },
|
|
101
|
+
metadata_lists: model_module.metadata_lists.map { |l| metadata_list_from_canonical(l, schema: schema) },
|
|
102
|
+
lists: []
|
|
103
|
+
)
|
|
104
|
+
end
|
|
43
105
|
|
|
44
106
|
# -- CML -> canonical --------------------------------------------
|
|
45
107
|
|
|
@@ -48,14 +110,37 @@ module Chemicalml
|
|
|
48
110
|
id: cml_mol.id,
|
|
49
111
|
atoms: cml_mol.atom_array&.atoms&.map { |a| atom_to_canonical(a) } || [],
|
|
50
112
|
bonds: cml_mol.bond_array&.bonds&.map { |b| bond_to_canonical(b) } || [],
|
|
51
|
-
names: cml_mol.names.map { |n|
|
|
52
|
-
identifiers: cml_mol.identifiers.map { |i|
|
|
113
|
+
names: cml_mol.names.map { |n| name_to_canonical(n) },
|
|
114
|
+
identifiers: cml_mol.identifiers.map { |i| identifier_to_canonical(i) },
|
|
115
|
+
formulas: (cml_mol.formulas || []).map { |f| formula_to_canonical(f) },
|
|
116
|
+
properties: (cml_mol.properties || []).map { |p| property_to_canonical(p) },
|
|
117
|
+
labels: (cml_mol.labels || []).map { |l| label_to_canonical(l) },
|
|
53
118
|
count: cml_mol.count,
|
|
54
119
|
formal_charge: cml_mol.formal_charge,
|
|
55
120
|
title: cml_mol.title
|
|
56
121
|
)
|
|
57
122
|
end
|
|
58
123
|
|
|
124
|
+
def self.name_to_canonical(cml_name)
|
|
125
|
+
return nil unless cml_name
|
|
126
|
+
|
|
127
|
+
Model::Name.new(
|
|
128
|
+
content: cml_name.content,
|
|
129
|
+
convention: cml_name.convention,
|
|
130
|
+
dict_ref: cml_name.dict_ref
|
|
131
|
+
)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.identifier_to_canonical(cml_id)
|
|
135
|
+
return nil unless cml_id
|
|
136
|
+
|
|
137
|
+
Model::Identifier.new(
|
|
138
|
+
value: cml_id.value,
|
|
139
|
+
convention: cml_id.convention,
|
|
140
|
+
dict_ref: cml_id.dict_ref
|
|
141
|
+
)
|
|
142
|
+
end
|
|
143
|
+
|
|
59
144
|
def self.atom_to_canonical(cml_atom)
|
|
60
145
|
Model::Atom.new(
|
|
61
146
|
id: cml_atom.id,
|
|
@@ -65,7 +150,16 @@ module Chemicalml
|
|
|
65
150
|
count: cml_atom.count,
|
|
66
151
|
hydrogen_count: cml_atom.hydrogen_count,
|
|
67
152
|
spin_multiplicity: cml_atom.spin_multiplicity,
|
|
68
|
-
title: cml_atom.title
|
|
153
|
+
title: cml_atom.title,
|
|
154
|
+
x2: cml_atom.x2,
|
|
155
|
+
y2: cml_atom.y2,
|
|
156
|
+
x3: cml_atom.x3,
|
|
157
|
+
y3: cml_atom.y3,
|
|
158
|
+
z3: cml_atom.z3,
|
|
159
|
+
x_fract: cml_atom.xFract,
|
|
160
|
+
y_fract: cml_atom.yFract,
|
|
161
|
+
z_fract: cml_atom.zFract,
|
|
162
|
+
atom_parity: atom_parity_to_canonical(cml_atom.atom_parity)
|
|
69
163
|
)
|
|
70
164
|
end
|
|
71
165
|
|
|
@@ -73,7 +167,28 @@ module Chemicalml
|
|
|
73
167
|
Model::Bond.new(
|
|
74
168
|
id: cml_bond.id,
|
|
75
169
|
atom_refs: cml_bond.atom_refs2&.split(" ") || [],
|
|
76
|
-
kind: cml_order_to_kind(cml_bond.order)
|
|
170
|
+
kind: cml_order_to_kind(cml_bond.order),
|
|
171
|
+
bond_stereo: bond_stereo_to_canonical(cml_bond.bond_stereo)
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def self.atom_parity_to_canonical(cml_ap)
|
|
176
|
+
return nil unless cml_ap
|
|
177
|
+
|
|
178
|
+
Model::AtomParity.new(
|
|
179
|
+
atom_refs4: cml_ap.atom_refs4&.split(" ") || [],
|
|
180
|
+
value: cml_ap.content
|
|
181
|
+
)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def self.bond_stereo_to_canonical(cml_bs)
|
|
185
|
+
return nil unless cml_bs
|
|
186
|
+
|
|
187
|
+
Model::BondStereo.new(
|
|
188
|
+
value: cml_bs.content,
|
|
189
|
+
atom_refs2: cml_bs.atom_refs2&.split(" "),
|
|
190
|
+
atom_refs4: cml_bs.atom_refs4&.split(" "),
|
|
191
|
+
dict_ref: cml_bs.dict_ref
|
|
77
192
|
)
|
|
78
193
|
end
|
|
79
194
|
|
|
@@ -120,62 +235,154 @@ module Chemicalml
|
|
|
120
235
|
)
|
|
121
236
|
end
|
|
122
237
|
|
|
238
|
+
def self.property_list_to_canonical(cml_list)
|
|
239
|
+
return Model::PropertyList.new unless cml_list
|
|
240
|
+
|
|
241
|
+
Model::PropertyList.new(
|
|
242
|
+
id: cml_list.id,
|
|
243
|
+
title: cml_list.title,
|
|
244
|
+
dict_ref: cml_list.dict_ref,
|
|
245
|
+
properties: cml_list.properties.map { |p| property_to_canonical(p) }
|
|
246
|
+
)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def self.parameter_list_to_canonical(cml_list)
|
|
250
|
+
return Model::ParameterList.new unless cml_list
|
|
251
|
+
|
|
252
|
+
Model::ParameterList.new(
|
|
253
|
+
id: cml_list.id,
|
|
254
|
+
title: cml_list.title,
|
|
255
|
+
dict_ref: cml_list.dict_ref,
|
|
256
|
+
parameters: cml_list.parameters.map { |p| parameter_to_canonical(p) }
|
|
257
|
+
)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def self.metadata_list_to_canonical(cml_list)
|
|
261
|
+
return Model::MetadataList.new unless cml_list
|
|
262
|
+
|
|
263
|
+
Model::MetadataList.new(
|
|
264
|
+
id: cml_list.id,
|
|
265
|
+
title: cml_list.title,
|
|
266
|
+
dict_ref: cml_list.dict_ref,
|
|
267
|
+
metadata: cml_list.metadata.map { |m| metadata_to_canonical(m) }
|
|
268
|
+
)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def self.property_value_to_canonical(cml_prop)
|
|
272
|
+
value_container_to_canonical(cml_prop.scalar) ||
|
|
273
|
+
value_container_to_canonical(cml_prop.array) ||
|
|
274
|
+
value_container_to_canonical(cml_prop.matrix)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def self.parameter_value_to_canonical(cml_param)
|
|
278
|
+
value_container_to_canonical(cml_param.scalar) ||
|
|
279
|
+
value_container_to_canonical(cml_param.array) ||
|
|
280
|
+
value_container_to_canonical(cml_param.matrix)
|
|
281
|
+
end
|
|
282
|
+
|
|
123
283
|
# -- Canonical -> CML --------------------------------------------
|
|
284
|
+
# Every helper takes `schema:` and looks up wire classes via
|
|
285
|
+
# WireClassRegistry so children are the right version.
|
|
124
286
|
|
|
125
|
-
def self.molecule_from_canonical(mol)
|
|
126
|
-
Cml::
|
|
287
|
+
def self.molecule_from_canonical(mol, schema:)
|
|
288
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
289
|
+
registry.for(schema, Chemicalml::Cml::Role::Molecule).new(
|
|
127
290
|
id: mol.id,
|
|
128
|
-
atom_array: mol.atoms.empty? ? nil : Cml::AtomArray.new(
|
|
129
|
-
atoms: mol.atoms.map { |a| atom_from_canonical(a) }
|
|
291
|
+
atom_array: mol.atoms.empty? ? nil : registry.for(schema, Chemicalml::Cml::Role::AtomArray).new(
|
|
292
|
+
atoms: mol.atoms.map { |a| atom_from_canonical(a, schema: schema) }
|
|
130
293
|
),
|
|
131
|
-
bond_array: mol.bonds.empty? ? nil : Cml::BondArray.new(
|
|
132
|
-
bonds: mol.bonds.map { |b| bond_from_canonical(b) }
|
|
294
|
+
bond_array: mol.bonds.empty? ? nil : registry.for(schema, Chemicalml::Cml::Role::BondArray).new(
|
|
295
|
+
bonds: mol.bonds.map { |b| bond_from_canonical(b, schema: schema) }
|
|
133
296
|
),
|
|
134
|
-
names: mol.names.map { |n| Cml::Name.new(content: n.content, convention: n.convention, dict_ref: n.dict_ref) },
|
|
135
|
-
identifiers: mol.identifiers.map { |i| Cml::Identifier.new(value: i.value, convention: i.convention, dict_ref: i.dict_ref) },
|
|
297
|
+
names: mol.names.map { |n| registry.for(schema, Chemicalml::Cml::Role::Name).new(content: n.content, convention: n.convention, dict_ref: n.dict_ref) },
|
|
298
|
+
identifiers: mol.identifiers.map { |i| registry.for(schema, Chemicalml::Cml::Role::Identifier).new(value: i.value, convention: i.convention, dict_ref: i.dict_ref) },
|
|
299
|
+
formulas: mol.formulas.map { |f| formula_from_canonical(f, schema: schema) },
|
|
300
|
+
properties: mol.properties.map { |p| property_from_canonical(p, schema: schema) },
|
|
301
|
+
labels: mol.labels.map { |l| label_from_canonical(l, schema: schema) },
|
|
136
302
|
count: mol.count,
|
|
137
303
|
formal_charge: mol.formal_charge,
|
|
138
304
|
title: mol.title
|
|
139
305
|
)
|
|
140
306
|
end
|
|
141
307
|
|
|
142
|
-
def self.atom_from_canonical(atom)
|
|
143
|
-
Cml::
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
308
|
+
def self.atom_from_canonical(atom, schema:)
|
|
309
|
+
Chemicalml::Cml::WireClassRegistry
|
|
310
|
+
.for(schema, Chemicalml::Cml::Role::Atom)
|
|
311
|
+
.new(
|
|
312
|
+
id: atom.id,
|
|
313
|
+
element_type: atom.element,
|
|
314
|
+
formal_charge: atom.formal_charge,
|
|
315
|
+
isotope: atom.isotope,
|
|
316
|
+
count: atom.count,
|
|
317
|
+
hydrogen_count: atom.hydrogen_count,
|
|
318
|
+
spin_multiplicity: atom.spin_multiplicity,
|
|
319
|
+
title: atom.title,
|
|
320
|
+
x2: atom.x2,
|
|
321
|
+
y2: atom.y2,
|
|
322
|
+
x3: atom.x3,
|
|
323
|
+
y3: atom.y3,
|
|
324
|
+
z3: atom.z3,
|
|
325
|
+
xFract: atom.x_fract,
|
|
326
|
+
yFract: atom.y_fract,
|
|
327
|
+
zFract: atom.z_fract,
|
|
328
|
+
atom_parity: atom_parity_from_canonical(atom.atom_parity, schema: schema)
|
|
329
|
+
)
|
|
153
330
|
end
|
|
154
331
|
|
|
155
|
-
def self.bond_from_canonical(bond)
|
|
156
|
-
Cml::
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
332
|
+
def self.bond_from_canonical(bond, schema:)
|
|
333
|
+
Chemicalml::Cml::WireClassRegistry
|
|
334
|
+
.for(schema, Chemicalml::Cml::Role::Bond)
|
|
335
|
+
.new(
|
|
336
|
+
id: bond.id,
|
|
337
|
+
atom_refs2: bond.atom_refs.join(" "),
|
|
338
|
+
order: bond.cml_order,
|
|
339
|
+
bond_stereo: bond_stereo_from_canonical(bond.bond_stereo, schema: schema)
|
|
340
|
+
)
|
|
161
341
|
end
|
|
162
342
|
|
|
163
|
-
def self.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
343
|
+
def self.atom_parity_from_canonical(ap, schema:)
|
|
344
|
+
return nil unless ap
|
|
345
|
+
|
|
346
|
+
Chemicalml::Cml::WireClassRegistry
|
|
347
|
+
.for(schema, Chemicalml::Cml::Role::AtomParity)
|
|
348
|
+
.new(
|
|
349
|
+
atom_refs4: [*ap.atom_refs4].join(" "),
|
|
350
|
+
content: ap.value
|
|
351
|
+
)
|
|
171
352
|
end
|
|
172
353
|
|
|
173
|
-
def self.
|
|
174
|
-
|
|
354
|
+
def self.bond_stereo_from_canonical(bs, schema:)
|
|
355
|
+
return nil unless bs
|
|
356
|
+
|
|
357
|
+
Chemicalml::Cml::WireClassRegistry
|
|
358
|
+
.for(schema, Chemicalml::Cml::Role::BondStereo)
|
|
359
|
+
.new(
|
|
360
|
+
content: bs.value,
|
|
361
|
+
atom_refs2: bs.atom_refs2 && [*bs.atom_refs2].join(" "),
|
|
362
|
+
atom_refs4: bs.atom_refs4 && [*bs.atom_refs4].join(" "),
|
|
363
|
+
dict_ref: bs.dict_ref
|
|
364
|
+
)
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def self.reaction_from_canonical(rxn, schema:)
|
|
368
|
+
Chemicalml::Cml::WireClassRegistry
|
|
369
|
+
.for(schema, Chemicalml::Cml::Role::Reaction)
|
|
370
|
+
.new(
|
|
371
|
+
id: rxn.id,
|
|
372
|
+
title: rxn.title || rxn.arrow.to_s,
|
|
373
|
+
type: rxn.type || rxn.arrow.to_s,
|
|
374
|
+
reactant_list: reactant_list_from_canonical(rxn.reactant_list, schema: schema),
|
|
375
|
+
product_list: product_list_from_canonical(rxn.product_list, schema: schema)
|
|
376
|
+
)
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def self.reactant_list_from_canonical(list, schema:)
|
|
380
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
381
|
+
registry.for(schema, Chemicalml::Cml::Role::ReactantList).new(
|
|
175
382
|
reactants: list.reactants.map do |r|
|
|
176
|
-
Cml::Reactant.new(
|
|
177
|
-
substance: Cml::Substance.new(
|
|
178
|
-
molecule: molecule_from_canonical(r.substance.molecule),
|
|
383
|
+
registry.for(schema, Chemicalml::Cml::Role::Reactant).new(
|
|
384
|
+
substance: registry.for(schema, Chemicalml::Cml::Role::Substance).new(
|
|
385
|
+
molecule: molecule_from_canonical(r.substance.molecule, schema: schema),
|
|
179
386
|
title: r.substance.title,
|
|
180
387
|
role: r.substance.role
|
|
181
388
|
)
|
|
@@ -184,12 +391,13 @@ module Chemicalml
|
|
|
184
391
|
)
|
|
185
392
|
end
|
|
186
393
|
|
|
187
|
-
def self.product_list_from_canonical(list)
|
|
188
|
-
Cml::
|
|
394
|
+
def self.product_list_from_canonical(list, schema:)
|
|
395
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
396
|
+
registry.for(schema, Chemicalml::Cml::Role::ProductList).new(
|
|
189
397
|
products: list.products.map do |p|
|
|
190
|
-
Cml::Product.new(
|
|
191
|
-
substance: Cml::Substance.new(
|
|
192
|
-
molecule: molecule_from_canonical(p.substance.molecule),
|
|
398
|
+
registry.for(schema, Chemicalml::Cml::Role::Product).new(
|
|
399
|
+
substance: registry.for(schema, Chemicalml::Cml::Role::Substance).new(
|
|
400
|
+
molecule: molecule_from_canonical(p.substance.molecule, schema: schema),
|
|
193
401
|
title: p.substance.title,
|
|
194
402
|
role: p.substance.role
|
|
195
403
|
)
|
|
@@ -198,6 +406,36 @@ module Chemicalml
|
|
|
198
406
|
)
|
|
199
407
|
end
|
|
200
408
|
|
|
409
|
+
def self.property_list_from_canonical(list, schema:)
|
|
410
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
411
|
+
registry.for(schema, Chemicalml::Cml::Role::PropertyList).new(
|
|
412
|
+
id: list.id,
|
|
413
|
+
title: list.title,
|
|
414
|
+
dict_ref: list.dict_ref,
|
|
415
|
+
properties: list.properties.map { |p| property_from_canonical(p, schema: schema) }
|
|
416
|
+
)
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def self.parameter_list_from_canonical(list, schema:)
|
|
420
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
421
|
+
registry.for(schema, Chemicalml::Cml::Role::ParameterList).new(
|
|
422
|
+
id: list.id,
|
|
423
|
+
title: list.title,
|
|
424
|
+
dict_ref: list.dict_ref,
|
|
425
|
+
parameters: list.parameters.map { |p| parameter_from_canonical(p, schema: schema) }
|
|
426
|
+
)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
def self.metadata_list_from_canonical(list, schema:)
|
|
430
|
+
registry = Chemicalml::Cml::WireClassRegistry
|
|
431
|
+
registry.for(schema, Chemicalml::Cml::Role::MetadataList).new(
|
|
432
|
+
id: list.id,
|
|
433
|
+
title: list.title,
|
|
434
|
+
dict_ref: list.dict_ref,
|
|
435
|
+
metadata: list.metadata.map { |m| metadata_from_canonical(m, schema: schema) }
|
|
436
|
+
)
|
|
437
|
+
end
|
|
438
|
+
|
|
201
439
|
# -- Lookup tables -----------------------------------------------
|
|
202
440
|
|
|
203
441
|
ORDER_TO_KIND = {
|
|
@@ -225,9 +463,22 @@ module Chemicalml
|
|
|
225
463
|
TYPE_TO_ARROW.fetch(value.to_s.downcase, :forward)
|
|
226
464
|
end
|
|
227
465
|
|
|
228
|
-
|
|
466
|
+
def self.wire_doc_class(schema)
|
|
467
|
+
Chemicalml::Cml::WireClassRegistry.for(schema, Chemicalml::Cml::Role::Document)
|
|
468
|
+
end
|
|
229
469
|
|
|
230
470
|
extend ValueTranslations::ClassMethods
|
|
471
|
+
|
|
472
|
+
# Truly internal helpers — not part of the public API. Public
|
|
473
|
+
# per-element translation methods (`molecule_to_canonical`,
|
|
474
|
+
# `scalar_from_canonical`, etc.) remain public because callers
|
|
475
|
+
# may need to translate a single element without a full
|
|
476
|
+
# Document wrapper.
|
|
477
|
+
private_class_method :cml_order_to_kind, :type_to_arrow,
|
|
478
|
+
:wire_doc_class,
|
|
479
|
+
:document_to_canonical, :document_from_canonical,
|
|
480
|
+
:property_value_to_canonical, :parameter_value_to_canonical,
|
|
481
|
+
:value_container_to_canonical, :value_container_from_canonical
|
|
231
482
|
end
|
|
232
483
|
end
|
|
233
484
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Chemicalml
|
|
4
|
+
module Cml
|
|
5
|
+
# Lookup table from `(schema, role)` to the schema's wire class
|
|
6
|
+
# implementing that role. Used by the Translator to instantiate
|
|
7
|
+
# the right class for the requested schema — eliminates the
|
|
8
|
+
# hardcoded `Cml::Foo` (always Schema3) references that caused
|
|
9
|
+
# `from_canonical(schema: :schema24)` to produce Schema3 children
|
|
10
|
+
# inside a Schema24 document.
|
|
11
|
+
#
|
|
12
|
+
# Adding Schema5 later requires no changes here — the registry
|
|
13
|
+
# walks the schema module's constants lazily.
|
|
14
|
+
module WireClassRegistry
|
|
15
|
+
SCHEMA_MODULES = {
|
|
16
|
+
schema3: Chemicalml::Cml::Schema3,
|
|
17
|
+
schema24: Chemicalml::Cml::Schema24
|
|
18
|
+
}.freeze
|
|
19
|
+
|
|
20
|
+
def self.for(schema, role)
|
|
21
|
+
schema_module = SCHEMA_MODULES[schema.to_sym]
|
|
22
|
+
raise ArgumentError, "unknown schema: #{schema.inspect}" unless schema_module
|
|
23
|
+
|
|
24
|
+
role_name = role_name_for(role)
|
|
25
|
+
raise ArgumentError, "unknown role: #{role.inspect}" unless role_name
|
|
26
|
+
unless schema_module.const_defined?(role_name, false)
|
|
27
|
+
raise ArgumentError,
|
|
28
|
+
"#{schema_module.name} does not define #{role_name} " \
|
|
29
|
+
"(not all elements exist in every schema version)"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
schema_module.const_get(role_name, false)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.role_name_for(role)
|
|
36
|
+
return role.name.split("::").last if role.is_a?(::Module)
|
|
37
|
+
|
|
38
|
+
role.to_s
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|