There are 7 variable thresholds, 6 of which deal with different aspects of the molecular symmetry algorithm (1 is exclusive to orbitals), adjusting these usually detect partial or full symmetry of “broken” molecules.
There is no “fallback” as such, but it should figure out the highest order point group based on the minimum number of symmetry elements required to generate that group.
e.g. if it only detects 1 C3 axis, 1 Sigma_v and one perpendicular C2 axis, it will generate a D3d point group from those (this should rarely happen though, since it will have inferred this already, but they can be filtered out during a reduction step if the molecule is very “broken”).
If the generated group is also wrong however, it will not fall back to a subgroup (although this wouldn’t be too hard to implement).
If you notice there are some features you’d like that are missing, or a bug, you can always just write an email or submit it to git hub and I’ll try to fix it.
In the example code the read_xyz function is a little picky on the format (e.g. no spaces before atom names) if you want to try it out.
Unfortunately, the paper I have describing all of this isn’t publicly available yet (not sure why) so here is a short summary:
It is written to be fast, with as little as possible tradeoff on accuracy, so the delay in a GUI is minimal (I have integrated it into the luscus molecular modding software).
There is an equivalence set algorithm, which uses the eigenvalues and eigenvectors of the inertial tensor, as well as weighted vertex lengths, and some projection operators to split the molecule into equivalence sets (this is where most of the speedup comes from).
There is basically no exhaustive search performed, all symmetry operations as logically inferred (except for parts of cubic groups which use and equidistant pairs algorithm).
I can try to describe the wave function symmetrisation if that will be used, otherwise it’ll be in the paper.
On 24 Apr 2015, at 13:42, Geoffrey Hutchison email@example.com wrote:
I’ve published some code dealing with point group symmetry of molecules, and was wondering if this would be of any interest (MIT lic).
Oh, most definitely. I’ve had this on my wish list for a while - particularly the “symmetrize” part. Does it have variable tolerances to deal with, say a C60 that’s low symmetry, but close to D2d or Ih?
I haven’t had time to go fully through the code, but the other concern I have is where similar libraries get confused if they find some but not all symmetry elements and then the molecule doesn’t fulfill any known point group. Is there code to “fall back to a known subgroup”?
Thanks - this should be great!