relion icon indicating copy to clipboard operation
relion copied to clipboard

Manual rotation of euler angles in Relion

Open rudasantos opened this issue 8 years ago • 3 comments

Hi 3dem,

I'm working on a protein with D7 pseudo symmetry, having real C2 symmetry and pseudo C7 symmetry. As far as I know so far Relion doesn't deal with pseudo symmetries, but I'd still like to use it to analyze this protein. My plan is to do a regular D7 reconstruction to find a general position of the particles along C7 then do a local search on C2 to find to which subunit the particle belongs to.

However, the Z axis change by 90 degrees when I switch from D7 to C2, so I need to turn the map and the particle coordinates as well. To achieve that, I looked into the source code to find what functions there were to perform euler angle rotations, where I found Euler_angles2matrix() at euler.h/euler.cpp.

Direct application of the transformation matrix to the euler angles on the star file from my D7 reconstruction placed the new coordinates at 90 degrees on the Z axis, however there seems to be a flip on the XY axis as well as a "spreading" of the particles that were originally on the bottom center (Y axis view - 90 degrees on Z axis).

Looking at other functions on euler.cpp there are several that seems to deal with some of these issues, such as Euler up and down correction and mirroring of different axis, as well as Euler_apply_transf(). So my question is what function(s) should I use to correctly perform euler rotations in Relion? I think Euler_apply_transf() is probably what I want, although I don't understand what are the roles of L and R on "temp = L * euler * R".

Thank you for your time!

-- Ruda Santos, MSc PhD Candidate, Department of Biochemistry and Cell Biology Stony Brook University +1 616 234 5257 [email protected] / [email protected]

( d7 particle distribution x axis view - 90 degrees on z axis y axis view - 90 degrees on z axis

rudasantos avatar Mar 27 '17 12:03 rudasantos

Unless I'm mistaken, you can simply change which axis the C-symmetry is defined around by changing line 613 in symmetries.cpp from

fileContent.push_back("rot_axis " + integerToString(pgOrder) + " 0 0 1");

(meaning z-axis), to for instance

fileContent.push_back("rot_axis " + integerToString(pgOrder) + " 0 1 0");

to instead mean around the y-axis. If I understand your aim correctly, this should work, without having to change any particle parameters. Please correct me if I'm wrong.

bforsbe avatar Mar 28 '17 09:03 bforsbe

Hi Bjorn,

Yes I think that should work. But there is another issue though. Even after the particles are correctly aligned on the C2 symmetry I still need to apply ~51.4 degrees rotations to the particle orientations so I can see to which subunit that particle belongs to, hence the need to apply "manual euler angle rotations".

In other words, once the particles are aligned and ready for C2 symmetry simulations I still need to rotate them so each subunit is sampled and finally decide to which subunit does that particle belongs to. Does that make sense?

rudasantos avatar Mar 29 '17 13:03 rudasantos

I get the idea. In fact it's getting to be a common question.

There's a critical consideration in this situation. Does the "symmetry-break" result in identical, non-symmetrical particles? If you have a heptamer where each subunit can be in state 0 or 1, independently of the other 6, then the answer is no. What you get is a "symmetry-break", that results in a combinatoric multitude of heptamers, which can't really be aligned as a whole.

Under the assumption that each of your 7 subunits is entirely independent of the others, you will instead have to consider each subunit individually, to avoid the combinatorics. In that case you need to rotate your image to all 7 positions, and apply a mask which removes 6 of them, thus producing a new, signal-subtracted dataset which is 7 times as big, but which only has a single subunit in each. If your subunit is too small, this won't work for alignment, maybe not even for classification.

If you are lucky enough, your "symmetry-break" is "deterministic" (for lack of a better word), meaning that all your particles appear to be asymmetrical in exactly the same way. In that case you CAN take the approach of performing a local search alignment, and extent the search to all symmetry-related points.

What you would have to do is to extend the list of all orientations relion scans for each particle, by looping through it and applying each symmetry operation on all of them. But you would also like to be able to say "choose one of those symmetry units". There is no method in relion perform this last step, however you can force relion to use only the best N orientations. Setting that to 1 for instance, would have the desired effect.

But relion is NOT designed to set that number to 1, and I would not dare recommend it, as results might be worse than expected because of it. That being said, you could still try it. You'll find that relion uses functions like projector_plan() to set up euler angles, which specify orientations. Rotating them is the hard part, but this is really what you want to do. You might also have to set all the orientation-priors to 1.

bforsbe avatar Apr 02 '17 19:04 bforsbe