def test_to_and_from_dict(self): mm = MoleculeMatcher(tolerance=0.5, mapper=InchiMolAtomMapper(angle_tolerance=50.0)) d = mm.as_dict() mm2 = MoleculeMatcher.from_dict(d) self.assertEqual(d, mm2.as_dict()) mm = MoleculeMatcher(tolerance=0.5, mapper=IsomorphismMolAtomMapper()) d = mm.as_dict() mm2 = MoleculeMatcher.from_dict(d) self.assertEqual(d, mm2.as_dict())
def test_fit(self): self.fit_with_mapper(IsomorphismMolAtomMapper()) self.fit_with_mapper(InchiMolAtomMapper())
def __init__(self, redundancy_parameters, geometry): ''' Makes a RedundancyGuard, and sets default parameter values if necessary. TODO: currently using pymatgen's structure matcher for comparing bulk and sheet structures, both pymatgen's structure matcher and molecule matcher for comparing wires, and only the molecule matcher for clusters. The sheet and wire cases aren't ideal, since the structure matcher assumes periodicity in all three dimensions, and the molecule matcher assumes no periodicity. Args: redundancy parameters: a dictionary of parameters geometry: the Geometry object ''' # defaults # # lattice length tolerance, in fractional coordinates self.default_lattice_length_tol = 0.05 # lattice angle tolerance, in degrees self.default_lattice_angle_tol = 2 # site tolerance, in fraction of average free length per atom self.default_site_tol = 0.1 # whether to transform to primitive cells before comparing self.default_use_primitive_cell = True # whether to check if structures are equal to supercells of each other self.default_attempt_supercell = True # RMSD tolerance for comparing clusters self.default_rmsd_tol = 0.1 # the epa difference interval self.default_epa_diff = 0.0 # set to defaults if redundancy_parameters in (None, 'default'): self.set_all_to_defaults() # parse the parameters, and set to defaults if necessary else: # lattice length tolerance if 'lattice_length_tol' not in redundancy_parameters: self.lattice_length_tol = self.default_lattice_length_tol elif redundancy_parameters['lattice_length_tol'] in (None, 'default'): self.lattice_length_tol = self.default_lattice_length_tol else: self.lattice_length_tol = redundancy_parameters[ 'lattice_length_tol'] # lattice angle tolerance if 'lattice_angle_tol' not in redundancy_parameters: self.lattice_angle_tol = self.default_lattice_angle_tol elif redundancy_parameters['lattice_angle_tol'] in (None, 'default'): self.lattice_angle_tol = self.default_lattice_angle_tol else: self.lattice_angle_tol = redundancy_parameters[ 'lattice_angle_tol'] # site tolerance if 'site_tol' not in redundancy_parameters: self.site_tol = self.default_site_tol elif redundancy_parameters['site_tol'] in (None, 'default'): self.site_tol = self.default_site_tol else: self.site_tol = redundancy_parameters['site_tol'] # whether to use primitive cells if 'use_primitive_cell' not in redundancy_parameters: self.use_primitive_cell = self.default_use_primitive_cell elif redundancy_parameters['use_primitive_cell'] in (None, 'default'): self.use_primitive_cell = self.default_use_primitive_cell else: self.use_primitive_cell = redundancy_parameters[ 'use_primitive_cell'] # whether to try matching supercells if 'attempt_supercell' not in redundancy_parameters: self.attempt_supercell = self.default_attempt_supercell elif redundancy_parameters['attempt_supercell'] in (None, 'default'): self.attempt_supercell = self.default_attempt_supercell else: self.attempt_supercell = redundancy_parameters[ 'attempt_supercell'] # RMSD tolerance if 'rmsd_tol' not in redundancy_parameters: self.rmsd_tol = self.default_rmsd_tol elif redundancy_parameters['rmsd_tol'] in (None, 'default'): self.rmsd_tol = self.default_rmsd_tol else: self.rmsd_tol = redundancy_parameters['rmsd_tol'] # epa difference if 'epa_diff' not in redundancy_parameters: self.epa_diff = self.default_epa_diff elif redundancy_parameters['epa_diff'] in (None, 'default'): self.epa_diff = self.default_epa_diff else: self.epa_diff = redundancy_parameters['epa_diff'] # make the StructureMatcher object # # the first False is to prevent the matcher from scaling the volumes, # and the second False is to prevent subset matching self.structure_matcher = StructureMatcher( self.lattice_length_tol, self.site_tol, self.lattice_angle_tol, self.use_primitive_cell, False, self.attempt_supercell, False, ElementComparator()) # make the MoleculeMatcher object if geometry.shape == 'cluster' or geometry.shape == 'wire': iso_mol_atom_mapper = IsomorphismMolAtomMapper() self.molecule_matcher = MoleculeMatcher(self.rmsd_tol, iso_mol_atom_mapper) ob.obErrorLog.SetOutputLevel(0) # to suppress openbabel warnings