From a9b62ef1655d6de66d85ae0a2a8e59a24bd4d324 Mon Sep 17 00:00:00 2001 From: Kevin Maik Jablonka Date: Mon, 7 Nov 2022 19:14:09 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Bump=20version:=200.0.4-dev=20=E2=86=92=200?= =?UTF-8?q?.0.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docs/source/conf.py | 2 +- setup.cfg | 2 +- src/moffragmentor/version.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 1425f5d..51f10bd 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.0.4-dev +current_version = 0.0.4 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(?:-(?P[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+(?P[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))? diff --git a/docs/source/conf.py b/docs/source/conf.py index 898b80e..f33a6de 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -24,7 +24,7 @@ author = "Kevin Maik Jablonka" # The full version, including alpha/beta/rc tags -release = "0.0.4-dev" +release = "0.0.4" # -- General configuration --------------------------------------------------- diff --git a/setup.cfg b/setup.cfg index dca614c..dec04b6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = moffragmentor -version = 0.0.4-dev +version = 0.0.4 description = Splits MOFs into metal nodes and linkers. author = Kevin Maik Jablonka author_email = mail@kjablonka.com diff --git a/src/moffragmentor/version.py b/src/moffragmentor/version.py index da56be8..b11fe13 100644 --- a/src/moffragmentor/version.py +++ b/src/moffragmentor/version.py @@ -14,7 +14,7 @@ "get_git_hash", ] -VERSION = "0.0.4-dev" +VERSION = "0.0.4" def get_git_hash() -> str: From 36d61f720ff240374de8785093782d2514291069 Mon Sep 17 00:00:00 2001 From: Kevin Maik Jablonka Date: Mon, 7 Nov 2022 19:14:24 +0100 Subject: [PATCH 2/4] =?UTF-8?q?Bump=20version:=200.0.4=20=E2=86=92=200.0.5?= =?UTF-8?q?-dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docs/source/conf.py | 2 +- setup.cfg | 2 +- src/moffragmentor/version.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 51f10bd..3865797 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.0.4 +current_version = 0.0.5-dev commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(?:-(?P[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+(?P[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))? diff --git a/docs/source/conf.py b/docs/source/conf.py index f33a6de..7d5f97a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -24,7 +24,7 @@ author = "Kevin Maik Jablonka" # The full version, including alpha/beta/rc tags -release = "0.0.4" +release = "0.0.5-dev" # -- General configuration --------------------------------------------------- diff --git a/setup.cfg b/setup.cfg index dec04b6..22c58cf 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = moffragmentor -version = 0.0.4 +version = 0.0.5-dev description = Splits MOFs into metal nodes and linkers. author = Kevin Maik Jablonka author_email = mail@kjablonka.com diff --git a/src/moffragmentor/version.py b/src/moffragmentor/version.py index b11fe13..3eb9651 100644 --- a/src/moffragmentor/version.py +++ b/src/moffragmentor/version.py @@ -14,7 +14,7 @@ "get_git_hash", ] -VERSION = "0.0.4" +VERSION = "0.0.5-dev" def get_git_hash() -> str: From d49dbd805db00232bce8abeb23d324bd8a4a5299 Mon Sep 17 00:00:00 2001 From: Kevin Maik Jablonka Date: Mon, 14 Nov 2022 18:35:17 +0100 Subject: [PATCH 3/4] give `reassemble in net` option Fixes #154 --- src/moffragmentor/sbu/node.py | 35 +++++++++++++++++++++++++++++++---- src/moffragmentor/sbu/sbu.py | 5 +++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/moffragmentor/sbu/node.py b/src/moffragmentor/sbu/node.py index ee12f95..a4b6718 100644 --- a/src/moffragmentor/sbu/node.py +++ b/src/moffragmentor/sbu/node.py @@ -18,6 +18,7 @@ _BINDING_DUMMY = "Xe" _BRANCHING_DUMMY = "Kr" +_EXTENSION_DUMMY = "Ar" # important for MOF assembly tools def _build_mol_and_graph(mof, indices, ignore_hidden_indices=True, add_additional_site=True): @@ -89,40 +90,66 @@ def _extract_and_wrap(node_indices, all_branching_indices, all_binding_indices, binding_neighbors = sum([mof.get_neighbor_indices(i) for i in binding_to_node_metal], []) branching_to_binding = set(binding_neighbors).intersection(all_branching_indices) + extension_points = [] + + for branching_idx in branching_to_binding | branching_to_node_metal: + if branching_idx in node_indices: + # find extension point + neighbors_of_branching = mof.get_neighbor_indices(branching_idx) + extension_point = set(neighbors_of_branching) - node_indices + assert len(extension_point) == 1 # perhaps we should raise an error here + extension_point = list(extension_point)[0] + extension_points.append(extension_point) + else: + extension_points.append(branching_idx) + # Now, make a copy of the structure and replace the indices with dummy atoms dummy_structure = Structure.from_sites(mof.structure.sites) + print('binding_to_node_metal', binding_to_node_metal) for i in binding_to_node_metal: dummy_structure.replace(i, _BINDING_DUMMY) for i in branching_to_binding | branching_to_node_metal: dummy_structure.replace(i, _BRANCHING_DUMMY) - dummy_branching_sites = branching_to_binding | branching_to_node_metal + for i in extension_points: + dummy_structure.replace(i, _EXTENSION_DUMMY) + dummy_branching_sites = branching_to_binding | branching_to_node_metal | set(extension_points) mol_w_dummy, graph_w_dummy, mapping_w_dummy = _build_mol_and_graph( mof, list(node_indices) + list(binding_to_node_metal) + list(branching_to_binding) - + list(branching_to_node_metal), + + list(branching_to_node_metal) + + extension_points, ignore_hidden_indices=False, add_additional_site=False, ) inverse_mapping = {v[0]: k for k, v in mapping_w_dummy.items()} + print('inverse_mapping', inverse_mapping) # let's replace here now the atoms with the dummys as doing it beforehand might cause issues # (e.g. we do not have the distances for a cutoffdict) + original_mol_w_dummy_species = mol_w_dummy.species for i in branching_to_binding | branching_to_node_metal: if i not in node_indices & set(mof.metal_indices): mol_w_dummy._sites[inverse_mapping[i]] = Site( _BRANCHING_DUMMY, mol_w_dummy._sites[inverse_mapping[i]].coords, - properties={"original_species": str(mol_w_dummy._sites[inverse_mapping[i]].specie)}, + properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, ) for i in binding_to_node_metal: mol_w_dummy._sites[inverse_mapping[i]] = Site( _BINDING_DUMMY, mol_w_dummy._sites[inverse_mapping[i]].coords, - properties={"original_species": str(mol_w_dummy._sites[inverse_mapping[i]].specie)}, + properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, + ) + + for i in extension_points: + mol_w_dummy._sites[inverse_mapping[i]] = Site( + _EXTENSION_DUMMY, + mol_w_dummy._sites[inverse_mapping[i]].coords, + properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, ) graph_w_dummy.molecule = mol_w_dummy diff --git a/src/moffragmentor/sbu/sbu.py b/src/moffragmentor/sbu/sbu.py index 1214a9b..1871f3b 100644 --- a/src/moffragmentor/sbu/sbu.py +++ b/src/moffragmentor/sbu/sbu.py @@ -13,6 +13,7 @@ from pymatgen.core import Molecule, Structure from pymatgen.io.babel import BabelMolAdaptor from rdkit import Chem +from rdkit.Chem.Descriptors import NumRadicalElectrons from scipy.spatial.distance import pdist from moffragmentor.utils import pickle_dump @@ -210,6 +211,10 @@ def get_indices(self): def is_edge(self): return len(self.branching_coords) == 2 + @property + def num_radical_electrons(self): + return NumRadicalElectrons(self.rdkit_mol) + def __len__(self): """Return the number of atoms in the molecule.""" return len(self.molecule) From 8fc9f1e6818bc5f7a00ff119147c472fe490c2ad Mon Sep 17 00:00:00 2001 From: Kevin Maik Jablonka Date: Mon, 14 Nov 2022 18:53:31 +0100 Subject: [PATCH 4/4] there are periodic images missing (?) --- src/moffragmentor/sbu/node.py | 37 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/moffragmentor/sbu/node.py b/src/moffragmentor/sbu/node.py index a4b6718..2dafdde 100644 --- a/src/moffragmentor/sbu/node.py +++ b/src/moffragmentor/sbu/node.py @@ -78,26 +78,23 @@ def _extract_and_wrap(node_indices, all_branching_indices, all_binding_indices, # now, also create one molecule from the node indices, where we replace # binding and branching indices with dummy atoms node_metal_atoms = [i for i in node_indices if i in mof.metal_indices] - binding_to_node_metal = set(sum([mof.get_neighbor_indices(i) for i in node_metal_atoms], [])) - binding_to_node_metal = binding_to_node_metal.intersection(all_binding_indices) + metal_neighbors = set(sum([mof.get_neighbor_indices(i) for i in node_metal_atoms], [])) + binding_to_node_metal = metal_neighbors.intersection(all_binding_indices) - branching_to_node_metal = set( - sum( - [mof.get_neighbor_indices(i) for i in node_metal_atoms if i in all_branching_indices], - [], - ) - ) + branching_to_node_metal = (metal_neighbors & all_branching_indices) - set(node_metal_atoms) + + print(branching_to_node_metal, all_branching_indices) binding_neighbors = sum([mof.get_neighbor_indices(i) for i in binding_to_node_metal], []) branching_to_binding = set(binding_neighbors).intersection(all_branching_indices) extension_points = [] - + for branching_idx in branching_to_binding | branching_to_node_metal: if branching_idx in node_indices: # find extension point neighbors_of_branching = mof.get_neighbor_indices(branching_idx) extension_point = set(neighbors_of_branching) - node_indices - assert len(extension_point) == 1 # perhaps we should raise an error here + # assert len(extension_point) == 1 # perhaps we should raise an error here extension_point = list(extension_point)[0] extension_points.append(extension_point) else: @@ -105,7 +102,7 @@ def _extract_and_wrap(node_indices, all_branching_indices, all_binding_indices, # Now, make a copy of the structure and replace the indices with dummy atoms dummy_structure = Structure.from_sites(mof.structure.sites) - print('binding_to_node_metal', binding_to_node_metal) + print("binding_to_node_metal", binding_to_node_metal) for i in binding_to_node_metal: dummy_structure.replace(i, _BINDING_DUMMY) for i in branching_to_binding | branching_to_node_metal: @@ -125,7 +122,7 @@ def _extract_and_wrap(node_indices, all_branching_indices, all_binding_indices, ) inverse_mapping = {v[0]: k for k, v in mapping_w_dummy.items()} - print('inverse_mapping', inverse_mapping) + print("inverse_mapping", inverse_mapping) # let's replace here now the atoms with the dummys as doing it beforehand might cause issues # (e.g. we do not have the distances for a cutoffdict) @@ -135,7 +132,9 @@ def _extract_and_wrap(node_indices, all_branching_indices, all_binding_indices, mol_w_dummy._sites[inverse_mapping[i]] = Site( _BRANCHING_DUMMY, mol_w_dummy._sites[inverse_mapping[i]].coords, - properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, + properties={ + "original_species": str(original_mol_w_dummy_species[inverse_mapping[i]]) + }, ) for i in binding_to_node_metal: @@ -145,12 +144,12 @@ def _extract_and_wrap(node_indices, all_branching_indices, all_binding_indices, properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, ) - for i in extension_points: - mol_w_dummy._sites[inverse_mapping[i]] = Site( - _EXTENSION_DUMMY, - mol_w_dummy._sites[inverse_mapping[i]].coords, - properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, - ) + # for i in extension_points: + # mol_w_dummy._sites[inverse_mapping[i]] = Site( + # _EXTENSION_DUMMY, + # mol_w_dummy._sites[inverse_mapping[i]].coords, + # properties={"original_species": str(original_mol_w_dummy_species[inverse_mapping[i]])}, + # ) graph_w_dummy.molecule = mol_w_dummy