I'm trying to model D2 rotational symmetry in protein quaternary structure using my CoordTransformer code. A CoordTransformer is composed of a pre and post translation, and a quaternion rotation: Code (Text): def transform(self,point): point -= self.pre self.rotate(point) point += self.post return point D2 symmetry can be decomposed into two separate C2 operations. Starting from point A, I can use one of the C2 transformations to get to B, and the other to get to C, and both to get to D. The application of both transformations is commutative, such that A-->B-->D should produce the same result as A-->C-->D. However, in my test case, the operators I'm fitting to the imperfect data are not commutative. So my question is what needs to be true of the relationship between the two C2 operators to get commutativity? For example, in order for an operator to be C2, its rotation and translation directions need to be perpendicular, and the rotation to be 180 degrees. In order for the pair to compose a D2 operation, their rotation directions need to be perpendicular to each other. I'm enforcing these, but I'm still missing something I'm finding that order matters. Any ideas or references I can read?