I have used CryoSPARC quite a lot by now, especially on a tricky 80S ribosome dataset containing many different states. CryoSPARC is really doing well I must say, and it is super fast!
However all the runs have resulted in a plethora of different maps which I now find very difficult to compare with each other (and with maps from relion), as the maps are not oriented the same way between each cryoSPARC run.
My question is, how do you guys compare different maps from different cryoSPARC runs most efficiently?
My go to strategy is currently either fitting the maps onto a selected “fixed” map using chimera and then re-sample new maps. The re-sampling step has a negativ impact on the quality of the maps, which is of course not desirable at all. Alternatively I fit my PDB model into each map, save the model and then use multiple coot sessions to check the quality of each map at identical positions at the same time. This is very tedious work and I am sure there is a better way, I just dont know how.
Anyone got a good way of doing this?
Thanks for the feedback. It’s great to hear that cryoSPARC is performing well for you
The problem of randomly oriented maps is definitely something we run into as well. Ab-initio reconstructions by definition will generate arbitrarily oriented results. We try to align them coarsely during the run just for plotting but the final outputs are not rotated currently.
We actually have some code that is currently used for detecting symmetry axes during refinement that could be useful in aligning 3D structures. The interpolation afterwards onto a common grid, like you mentioned, is the problematic part.
I’ve added this to our feature/issue tracker and I think what we can do is provide a new job type that just aligns 3D structures to a reference and uses a Fourier interpolation scheme for decent results. For now, unfortunately, the two workarounds you suggested are the only things I can think of as well.
Hope that helps,
Also if any other users have a workflow that works, please do let us know!
One workflow for this is to:
- Obtain transformation matrices between maps (e.g. from Chimera)
- Decompose into Euler angles / axis-angle vector
- Modify .star / metadata file accordingly
- Reconstruct using the modified angles (e.g. relion_reconstruct)
You can do this with my csparc2star.py tool. You still need to manually fit the maps, but at least the rest of it is scriptable.
IMO the ideal approach would be for cryoSPARC to implement map fitting and reconstruction without refinement. Then the above would be reduced to selecting two structures and running a postprocessing job.
A quick solution is to compute an ellipsoid fit of the 3D map using a closed-form solution and then use a consistent pose, for example, longest dimension along Z-axis, 2nd longest dimension along Y-axis, and shortest dimension along X-axis. That should place the maps of different runs to a similar view (if the 3D structures are similar enough).