Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def MillerDirection(v):
"""Special case of :class:`MillerIndex` with ``type="direction"`` (the default)"""
return MillerIndex(v, 'direction')
def as3(self):
if len(self) == 3:
return self
else:
h, k, i, l = self
return MillerIndex((h, k, l))
def as4(self):
if len(self) == 4:
return self
else:
h, k, l = self
i = -(h+l)
return MillerIndex((h,k,i,l))
Negative indices can be denoted by:
1. leading minus sign, e.g. ``[11-2]``
2. trailing ``b`` (for 'bar'), e.g. ``112b``
3. LaTeX ``\bar{}``, e.g. ``[11\bar{2}]`` (which renders as :math:`[11\bar{2}]` in LaTeX)
Leading or trailing brackets of various kinds are ignored.
i.e. ``[001]``, ``{001}``, ``(001)``, ``[001]``, ``<001>``, ``001`` are all equivalent.
Returns an array of components (i,j,k) or (h,k,i,l)
"""
if not isinstance(s, str):
raise TypeError("Can't parse from %r of type %r" % (s, type(s)))
orig_s = s
for (a, b) in [(r'\bar{','-')] + [(b,'') for b in MillerIndex.all_brackets]:
s = s.replace(a, b)
L = list(s)
components = np.array([1,1,1,1]) # space for up to 4 elements
i = 3 # parse backwards from end of string
while L:
if i < 0:
raise ValueError('Cannot parse Miller index from string "%s", too many components found' % orig_s)
c = L.pop()
if c == '-':
if i == 3:
raise ValueError('Miller index string "%s" cannot end with a minus sign' % orig_s)
components[i+1] *= -1
elif c == 'b':
components[i] *= -1
elif c in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
def __new__(cls, v=None, type='direction'):
if isinstance(v, str):
v = MillerIndex.parse(v)
if len(v) == 3 or len(v) == 4:
self = np.ndarray.__new__(cls, len(v))
self[:] = v
else:
raise ValueError('%s input v should be of length 3 or 4' % cls.__name__)
self.type = type
self.simplify()
return self
def cross(self, other):
a = self.as3()
b = MillerIndex(other).as3()
return np.cross(a, b).view(MillerIndex).simplified()
def latex(self):
"""
Format this :class:`MillerIndex` as a LaTeX string
"""
s = '$'
bopen, bclose = MillerIndex.brackets[self.type]
s += bopen
for component in self:
if component < 0:
s += r'\bar{%d}' % abs(component)
else:
s += '%d' % component
s += bclose
s += '$'
return s