Am Montag 04 März 2013 16:18:03 schrieb Luc Bourhis:
Hi Jan,
the cctbx does not have a tool doing exactly what you describe. But there is cctbx.euclidean_model_matching, that we all call emma, which could be close enough. It tries to find the best isometry matching the biggest subset of the 1st structure onto the 2nd structure, and since an isometry preserves bond lengths, angles and even torsion angles, perhaps you may find that tool useful. Here is a very quick kickstarter:
Starting from two instances of xray.structure xs1 and xs2 for the two structures you wish to compare, the following is all you need to do
Seems I praised emma a little bit too soon, as this example leads to an exception: ----8<------------------------------------------------------------------ from cctbx import xray from cctbx import crystal from cctbx.array_family import flex from cctbx import euclidean_model_matching as emma xs1=xray.structure( crystal_symmetry=crystal.symmetry( unit_cell=(4.98599, 6.48179, 8.47619, 83, 109, 129), space_group_symbol="P -1"), scatterers=flex.xray_scatterer([ xray.scatterer( #0 label="C1", site=(0.710543, 0.440181, 0.852614), u=0.005000), xray.scatterer( #1 label="C2", site=(0.305308, 0.127783, 0.856840), u=0.005000)])) xs2=xray.structure( crystal_symmetry=crystal.symmetry( unit_cell=(4.98599, 6.48179, 8.47619, 83, 109, 129), space_group_symbol="P -1"), scatterers=flex.xray_scatterer([ xray.scatterer( #0 label="C1", site=(0.199543, 0.159467, 0.002565), u=0.001260), xray.scatterer( #1 label="C2", site=(0.205553, 0.153391, 0.002025), u=0.001260)])) m = emma.model_matches( xs1.as_emma_model(), xs2.as_emma_model(), tolerance=0.5, break_if_match_with_no_singles=False ).refined_matches[0] print(m.rms) ----8<------------------------------------------------------------------ I've got no idea as to why those two (random) structures cannot be compared. Have I found a bug in emma? With regards, Dipl. Phys. Jan M. Simons Institute of Crystallography RWTH Aachen University