Local symmetry operators for refinement

We have an asymmetric particle containing multiple copies of the same sub-complex. Can we impose local symmetry during refinement in cryosparc similar to what has been implemented in relion? If not, is this on the to-do list for future upgrades?

Hi @jochen,

We are currently working on implementing support for non-standard symmetry in cryoSPARC. The first case we are working on is supporting multiple copies of an identical subvolume located at arbitrary locations on the volume, e.g. non-crystallographic symmetry. The second case will allow for the local refinement of symmetric units that are flexible with respect to one another.


Is there a reason local symmetry is better than localized refinement and expansion?

Using both localrec or my subparticles.py from pyem you can provide multiple target coordinates and align any number of subparticles at arbitrary locations.

Hi @DanielAsarnow, I think local symmetry is better only in the instance where your subunits are small (too small to reliably align on their own) and the non-crystal symmetry is rigid (i.e. no flex between subunits). I’m not sure how common that is though!

hiya, would you mean expanding on this a little? how to use localrec or subparticles.py ? I can’t find help info on your GitHub for the latter, and I’m guessing localrec = local refinement? If so It’s still unclear how I can use this to apply NCS. thanks!

With subparticles.py you can identify a target point in one of the symmetry-related units, and pass --target x,y,z --boxsize N --sym X to expand on every symmetry-related copy of that target point. If you had D12 symmetry, the output would have 24x the number of particles with each expanded particle referring to the same image and having metadata to center a different copy of the target.

This can be combined with my project.py or projection_subtraction.py programs. The best workflow is to extract your particle on a large box, perform the expansion on this new file, then use the expanded file to subtract including a crop operation to center the region of interest and decrease the size of the data. My subtraction programs, or star.py --info will tell you the largest shift of your particles so you can select a good box size for extraction. E.g. if the maximum shift is 100 px and you want a 150 px box for this region, the extraction size must be at least 350 px.

Relion 3.1 has added some similar features for the subtraction and cropping stage.

hi Daniel, thanks for your time in responding.

Still not clear. I do not have a --sym flag because there is no point group symmetry in my molecule. It has arbitrarily oriented identical copies. I will need to obtain the 6 parameters for each of those to tell cryosparc how to shift/rotate the map, subtract everything out, then treat that particle as the same as all the other copies. But I’m not clear at all on how to obtain the 6 params, and why in your response do you only need XYZ translations and not rotations?

Also are all of these commands executed on the particles.cs file output from a refinement?

Sorry for the hassle. I have asked around and can’t seem to find anyone who knows how to do this. Frustrating to have such an unusual symmetry!

Are they truly arbitrarily oriented? Or are they all facing “inwards” or in some other semi-uniform manner?

If it’s the later case, the alignments are already available from your consensus refinement, so only 3D translations are needed to find the local regions after that. Say you use chimera to find 6 XYZ centers, you can run subparticles.py --boxsize N --target X,Y,Z --adjust-defocus in.star out_i.star 6 times with each XYZ target. Then star.py out_*.star joined.star to make a combined file. Finally use this joined.star to perform the subtraction.

Unfortunately since I simplified the program some time ago, I haven’t yet finished adding back some features like giving --target multiple times. The separate files might come in handy at some point, though.

If the subunits are really randomly placed, then instead you can use chimera to align each subunit to a reference subunit. This is slightly more involved.

  1. Find XYZ center of reference subunit.
  2. subparticles.py --target X,Y,Z ... in.star out_xyz.star
    map.py --target X,Y,Z in.mrc out_xyz.mrc
  3. Use chimera’s fit-in-map tool to align each other subunit to out_xyz.mrc. Record the transformation matrix from the reply log and save it to a text file, keeping notes so you know which one belongs to each of the 5 other subunits. The matrices should be changed to numpy style like [[a,b,c,d],[e,f,g,h],[i,j,k,l]].
  4. For each of the 5, run subparticles.py --transform=[[...]] out_xyz.star xyz_i.star
  5. Test each all of the output files using relion_reconstruct_mpi - reconstructions should all be aligned with out_xyz.mrc. You can use --maxres 6 to make it faster (and maybe star.py --subsample 10000).
  6. star.py out_xyz.mrc xyz_*.star joined.star
  7. Subtract using joined.star

Always test your subtractions using relion_reconstruct. It’s challenging, but you can get this to work! Relion and localrec have their own tutorials, too, you can give them a try as well. Good luck! :smiley: