[cctbxbb] Fail to extend space-group with centring translations

Ralf W. Grosse-Kunstleve rwgk at yahoo.com
Sun Dec 10 21:46:47 PST 2006

Hi Luc,

> If I understand correctly, space_group_type lets the user use any
> space-group in a non-standard setting defined by a special change of
> basis.

space_group_type determines the change-of-basis matrix from a given
setting to the reference setting.

> Now your example would require the matrix of change of basis  
> to be rational whereas in the current implementation it can only be  
> integral.

The change_of_basis_op class has both rational rotation and rational
translation parts, with a common r_den for the 9 rotation matrix
elements, and a common t_den for the 3 translation vector elements.

The "r_den" is fixed at 1 only for the space_group class. Since
space_group_type operates only on space_group objects, the limitation
applies here too, but the resulting change-of-basis rotation parts
certainly don't have to be integral (that would be a terrible

> At least as far as I understand, from the code and your  
> comments. Thus, the only place where rational numbers would be  
> necessary is in those matrices of change of basis, isn't it? Now,  
> would it be possible to define a new class  
> space_group_irrational_setting which would provide services very  
> similar to space_group_type but accepting non-integral matrices for  
> the change of basis?

You are correct. If you need to handle space groups with rational
rotation matrices, the way forward is to implement a new class similar
to space_group (I'd go for space_group_rational) with a little bit of
cut-and-paste to replicate the group multiplication. However, I don't
think it is worth redoing the entire space_group_type implementation to
accommodate rational rotation parts. In fact, I think it would be a bad
solution because of the runtime impact. Consider that any space group
when transformed to the primitive setting will have only integral
rotation matrices. I.e. all you need is an algorithm that figures out
an "initial" change-of-basis matrix to a (any) primitive setting.
Construct a standard space_group object with the transformed symmetry
operations and feed it into space_group_type. Multiply the "initial"
change-of-basis with the output of space_group_type, done.
This way you get the desired generality with a moderate effort, without
impacting the performance of the many established algorithms based on


Yahoo! Music Unlimited
Access over 1 million songs.

More information about the cctbxbb mailing list