I have a map with a resolution of 2.5A from cryosparc. I exported it into relion and reconstruction in relion resulted in a slightly lower resolution map (2.6A).
To test whether the difference is due to differences in FSC estimation in cryosparc and relion, or some information is lost in pyem conversion, I re-imported the star file generated in pyem back to cryosparc and did a reconstruction, which gave me again a 2.6A map.
This suggests that maybe something’s lost in pyem conversion. So I compared the particle.cs files of both reconstructions and I saw that the poses are the same, the shifts (e.g. -0.2320816 vs -0.2320819) and the locations (e.g. 0.7717285 vs 0.77174056) are both similar. However, since the location value needs to be multiplied by image dimension 4096, the difference is quite a lot larger than difference in shifts. This difference seems to present because relion only takes integer number for particle location. And I wonder if this is the reason that the reconstruction of the re-imported particles is at lower resolution.
Maybe we can add this rounding error to the shifts if this is what causing it? Could you please comment on this? @DanielAsarnow
The locations (normalized coordinates) aren’t relevant to reconstructions, only to re-extracting the particles. They are probably different because of rounding like you suggest or because of a recentering operation during extraction at some point. Even multiplying by 4096, however, only results in a 1 pixel difference in the particle center. The shifts are in pixels and are not significantly different.
The resolution from cryoSPARC is from the corrected FSC curve (subtracting the phase randomized one). Unless you have done post-processing in Relion, the value is from the uncorrected FSC curve. If you did do post-processing, the two programs use a different cutoff resolution to subtract the phase substituted FSC. The two programs are thus very unlikely to generate exactly equivalent nominal resolutions under any circumstances.
Thanks for the reply! What I did is that I converted .cs to .star. Then immediately re-imported the .star in cryosparc, then do particle extraction followed by reconstruction. So I’m comparing cryosparc to cryosparc here. The weird thing is that the resolution still got slightly worse. so I’m wondering whether the location does make a difference here. I agree that the shift is very small, but the resolution difference is also quite small (2.6A vs 2.5A) and I’m struggling to see any other parameters that might affect resolution. Maybe others have suggestions for a potential cause of this? Thanks again!
I’m doing reconstruction without alignment so I thought no random seed is used in this case?
Just to clarify what exactly I did:
A: in cryosparc, re-extracted particles that went to 2.5A in a cryosparc refinement job and did reconstruction without alignment. The resolution stayed at 2.5A.
B: converted the .cs file of the same refinement job to .star. Imported the particles back in cryosparc, extracted the particles and did reconstruction without alignment and that went to 2.6A.
C: converted the .cs file of the same refinement job to .star. Reconstructed the half maps in relion. Postprocessing in relion with the same mask used in cryosparc went to 2.6A.
OK, got it. When you re-extracted in cryoSPARC, were the particles re-centered?
If you want to eliminate precision of the shifts as a factor, you could manually edit pyem/pyem/star.py line 527 and increase the digits in the float format. E.g. change the '%.6f' to say '%.12f'
(This line, last line of star.write_star_table function). df.to_csv(starfile, mode='a', sep=' ', header=False, index=False, float_format='%.6f')
If that makes a difference, I will change the defaults.
Thanks a lot, Daniel! I figured out what went wrong – I forgot that the higher order CTF info was lost in the conversion and didn’t repeat the global CTF refinement after re-import the particles. Once I did that the resolution went to 2.5A as it should.
Is there a reason why these info were not converted? I think I can re-run these in relion as well but if those can be converted by pyem it would be quite nice.