Source code for pylorenzmie.theory.Cluster
from pylorenzmie.theory.Particle import Particle
from pylorenzmie.lib.lmtypes import Properties
from dataclasses import dataclass, field
[docs]
@dataclass
class Cluster(Particle):
'''A cluster of particles for Lorenz-Mie microscopy.
Groups a list of :class:`Particle` objects into a single
scatterer. The cluster position ``r_p`` sets the origin of each
constituent particle's coordinate system via :attr:`Particle.r_0`.
Inherits from :class:`~pylorenzmie.theory.Particle`.
Parameters
----------
particles : list of Particle, optional
Constituent particles. Default: empty list.
Notes
-----
Setting ``x_p``, ``y_p``, ``z_p``, or ``particles`` automatically
calls :meth:`update` to propagate the new cluster center to each
constituent particle's ``r_0``.
'''
particles: list[Particle] = field(repr=False, default_factory=list)
def __post_init__(self) -> None:
self.update()
def __setattr__(self, key: str, value: object) -> None:
super().__setattr__(key, value)
if key in ('x_p', 'y_p', 'z_p', 'particles'):
self.update()
def __len__(self) -> int:
return len(self.particles)
def __iter__(self):
return iter(self.particles)
def __getitem__(self, index: int) -> Particle:
return self.particles[index]
@Particle.properties.getter
def properties(self) -> Properties:
return {'x_p': self.x_p,
'y_p': self.y_p,
'z_p': self.z_p}
[docs]
def update(self) -> None:
'''Propagate cluster position to each constituent particle's origin.'''
try:
for particle in self.particles:
particle.r_0 = self.r_p
except AttributeError:
pass