Skip to content

Commit

Permalink
🚧 Add rudimentary hm_symbol property that better aligns with crysta…
Browse files Browse the repository at this point in the history
…llographic tables
  • Loading branch information
Baharis committed Jan 22, 2025
1 parent 0f0cb4c commit 8b850b0
Showing 1 changed file with 41 additions and 1 deletion.
42 changes: 41 additions & 1 deletion hikari/symmetry/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ def name(self) -> str:
elif self.typ is self.Type.reflection:
return 'm'
elif self.typ is self.Type.rotation:
return str(self.fold) + self.sense
return str(self.fold) + (self.sense if self.fold > 2 else '')
elif self.typ is self.Type.inversion:
return '-1'
elif self.typ is self.Type.rototranslation:
Expand Down Expand Up @@ -307,6 +307,46 @@ def sense(self) -> str:
sign = np.dot(self.orientation, np.cross(unique, rotation @ unique))
return '' if np.isclose(sign, 0) else '+' if sign > 0 else '-'

@property
def _hm_span(self):
span = np.array(['', '', ''], dtype='U16')
for inv in self.invariants:
coefficients = (inv / min(i for i in abs(inv) if i > 0.01)).astype(int)
axis = 'xyz'[(coefficients != 0).argmax(axis=0)]
letters = [str(s).replace('0', '').replace('1', '')
+ (axis if s != 0 else '') for s in coefficients]
span += np.array(letters)
for i, s in enumerate(span):
if s == '':
span[i] = Fraction(self.origin[i]).limit_denominator(12)
return ','.join(f'{s!s:>4s}' for s in span)

@property
def _hm_glide(self):
return ','.join([f'{Fraction(g).limit_denominator(12)!s:>4s}'
for g in self.glide])

@property
def hm_symbol(self) -> str:
if self.typ is self.Type.identity:
return ' 1 '
elif self.typ is self.Type.inversion:
return f'-1 {self._hm_span} '
elif self.typ is self.Type.translation:
return f' t ({self._hm_glide})'
elif self.typ is self.Type.rotation:
return f' {self.name:2s} {self._hm_span}'
elif self.typ is self.Type.rototranslation:
return f'{self.name:3s} ({self._hm_glide}) {self._hm_span}'
elif self.typ is self.Type.reflection:
return f' m {self._hm_span}'
elif self.typ is self.Type.transflection:
return f'{self.name:3s} ({self._hm_glide}) {self._hm_span}'
elif self.typ is self.Type.rotoinversion:
return f'{self.name:3s} ({self._hm_glide}) {self._hm_span}'
else:
return '?'

@property
def bounded(self) -> 'BoundedOperation':
"""Instance of self that always collapses down to Coset representative"""
Expand Down

0 comments on commit 8b850b0

Please sign in to comment.