Source code for fibomat.mill.mill
"""Provide the :class:`Mill` class."""
from typing import Optional
from fibomat.units import QuantityType, has_time_dim, Q_
from fibomat.mill.ionbeam import IonBeam
[docs]class MillBase:
[docs] def __init__(self, **kwargs):
self._kwargs = kwargs
def __repr__(self) -> str:
return ('{}(' + ', '.join([key + '={}' for key in self._kwargs.keys()]) + ')').format(
self.__class__.__name__, *self._kwargs.values()
)
# def __getattr__(self, item):
# return self.__getitem__(item)
#
# def __setattr__(self, key, value):
# if not key.startswith('_'):
# raise TypeError(
# "'MillBase' object does not support item assignment (if you are a developer, use variables with "
# " _ [underscore] as first character. Then, this check is bypassed)"
# )
# super().__setattr__(key, value)
# def __getattribute__(self, item: str):
# print('__getattribute__', item)
# if not item.startswith('_') and item not in self._kwargs:
# raise AttributeError
# return object.__getattribute__(self, item)
#
# def __setattr__(self, key, value):
# raise NotImplementedError
def __getitem__(self, item: str):
try:
value = self._kwargs[item]
if value is None:
raise KeyError('value is none')
return value
except KeyError as key_error:
raise KeyError(
f'Mill object does not have property "{item}". '
'Maybe you need a SpecialMill with custom properties for the used backend?'
) # from key_error
[docs]class Mill(MillBase):
"""The `Mill` class is used to specify the, dwell_time per spot and the number of repats for a pattern.
Optionally, the class can hold an object describing the shape of the ion beam which is needed if any kind of
optimization is done.
"""
[docs] def __init__(self, dwell_time: QuantityType, repeats: int):
"""
Args:
dwell_time (QuantityType): dwell time per spot
repeats (int): number of repeats
"""
if not isinstance(dwell_time, Q_):
raise TypeError('dwell_time must be a quantity.')
if not has_time_dim(dwell_time):
raise ValueError('dwell_time must have dimension [time].')
if not isinstance(repeats, int):
raise TypeError('repats must be an int')
if repeats < 1:
raise ValueError('repeats must be at least 1.')
super().__init__(dwell_time=dwell_time, repeats=repeats)
@property
def dwell_time(self) -> QuantityType:
return self['dwell_time']
@property
def repeats(self) -> int:
return self['repeats']
[docs]class SpecialMill(MillBase):
[docs] def __init__(self, **kwargs):
super().__init__(**kwargs)