sasdata.metadata module

Contains classes describing the metadata for a scattering run

The metadata is structures around the CANSas format version 1.1, found at https://www.cansas.org/formats/canSAS1d/1.1/doc/specification.html

Metadata from other file formats should be massaged to fit into the data classes presented here. Any useful metadata which cannot be included in these classes represent a bug in the CANSas format.

class sasdata.metadata.Aperture(*, distance: sasdata.quantities.quantity.Quantity[float] | None, size: sasdata.metadata.Vec3 | None, size_name: str | None, name: str | None, type_: str | None)

Bases: object

__annotations__ = {'distance': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'name': str | None, 'size': sasdata.metadata.Vec3 | None, 'size_name': str | None, 'type_': str | None}
__dataclass_fields__ = {'distance': Field(name='distance',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'size': Field(name='size',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'size_name': Field(name='size_name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'type_': Field(name='type_',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 145, '__annotations__': {'distance': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'size': sasdata.metadata.Vec3 | None, 'size_name': str | None, 'name': str | None, 'type_': str | None}, 'summary': <function Aperture.summary>, 'from_json': <staticmethod(<function Aperture.from_json>)>, 'as_h5': <function Aperture.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Aperture' objects>, '__weakref__': <attribute '__weakref__' of 'Aperture' objects>, '__doc__': 'Aperture(*, distance: Optional[sasdata.quantities.quantity.Quantity[float]], size: sasdata.metadata.Vec3 | None, size_name: str | None, name: str | None, type_: str | None)', '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'distance': Field(name='distance',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'size': Field(name='size',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'size_name': Field(name='size_name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'type_': Field(name='type_',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Aperture.__init__>, '__repr__': <function Aperture.__repr__>, '__eq__': <function Aperture.__eq__>, '__match_args__': ()})
__doc__ = 'Aperture(*, distance: Optional[sasdata.quantities.quantity.Quantity[float]], size: sasdata.metadata.Vec3 | None, size_name: str | None, name: str | None, type_: str | None)'
__eq__(other)

Return self==value.

__firstlineno__ = 145
__hash__ = None
__init__(*, distance: Quantity[float] | None, size: Vec3 | None, size_name: str | None, name: str | None, type_: str | None) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(group: Group)

Export data onto an HDF5 group

distance: Quantity[float] | None
static from_json(obj)
name: str | None
size: Vec3 | None
size_name: str | None
summary()
type_: str | None
class sasdata.metadata.BeamSize(*, name: str | None, size: sasdata.metadata.Vec3 | None)

Bases: object

__annotations__ = {'name': str | None, 'size': sasdata.metadata.Vec3 | None}
__dataclass_fields__ = {'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'size': Field(name='size',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 215, '__annotations__': {'name': str | None, 'size': sasdata.metadata.Vec3 | None}, 'from_json': <staticmethod(<function BeamSize.from_json>)>, 'as_h5': <function BeamSize.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'BeamSize' objects>, '__weakref__': <attribute '__weakref__' of 'BeamSize' objects>, '__doc__': 'BeamSize(*, name: str | None, size: sasdata.metadata.Vec3 | None)', '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'size': Field(name='size',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function BeamSize.__init__>, '__repr__': <function BeamSize.__repr__>, '__eq__': <function BeamSize.__eq__>, '__match_args__': ()})
__doc__ = 'BeamSize(*, name: str | None, size: sasdata.metadata.Vec3 | None)'
__eq__(other)

Return self==value.

__firstlineno__ = 215
__hash__ = None
__init__(*, name: str | None, size: Vec3 | None) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(group: Group)

Export data onto an HDF5 group

static from_json(obj)
name: str | None
size: Vec3 | None
class sasdata.metadata.Collimation(*, length: Quantity[float] | None, apertures: list[Aperture])

Bases: object

Class to hold collimation information

__annotations__ = {'apertures': list[sasdata.metadata.Aperture], 'length': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}
__dataclass_fields__ = {'apertures': Field(name='apertures',type=list[sasdata.metadata.Aperture],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'length': Field(name='length',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 188, '__annotations__': {'length': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'apertures': list[sasdata.metadata.Aperture]}, '__doc__': '\nClass to hold collimation information\n', 'summary': <function Collimation.summary>, 'from_json': <staticmethod(<function Collimation.from_json>)>, 'as_h5': <function Collimation.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Collimation' objects>, '__weakref__': <attribute '__weakref__' of 'Collimation' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'length': Field(name='length',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'apertures': Field(name='apertures',type=list[sasdata.metadata.Aperture],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Collimation.__init__>, '__repr__': <function Collimation.__repr__>, '__eq__': <function Collimation.__eq__>, '__match_args__': ()})
__doc__ = '\nClass to hold collimation information\n'
__eq__(other)

Return self==value.

__firstlineno__ = 188
__hash__ = None
__init__(*, length: Quantity[float] | None, apertures: list[Aperture]) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

apertures: list[Aperture]
as_h5(group: Group)

Export data onto an HDF5 group

static from_json(obj)
length: Quantity[float] | None
summary()
class sasdata.metadata.Detector(*, name: str | None, distance: Quantity[float] | None, offset: Vec3 | None, orientation: Rot3 | None, beam_center: Vec3 | None, pixel_size: Vec3 | None, slit_length: Quantity[float] | None)

Bases: object

Detector information

__annotations__ = {'beam_center': sasdata.metadata.Vec3 | None, 'distance': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'name': str | None, 'offset': sasdata.metadata.Vec3 | None, 'orientation': sasdata.metadata.Rot3 | None, 'pixel_size': sasdata.metadata.Vec3 | None, 'slit_length': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}
__dataclass_fields__ = {'beam_center': Field(name='beam_center',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'distance': Field(name='distance',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'offset': Field(name='offset',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'orientation': Field(name='orientation',type=sasdata.metadata.Rot3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'pixel_size': Field(name='pixel_size',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'slit_length': Field(name='slit_length',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 90, '__annotations__': {'name': str | None, 'distance': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'offset': sasdata.metadata.Vec3 | None, 'orientation': sasdata.metadata.Rot3 | None, 'beam_center': sasdata.metadata.Vec3 | None, 'pixel_size': sasdata.metadata.Vec3 | None, 'slit_length': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}, '__doc__': '\nDetector information\n', 'summary': <function Detector.summary>, 'from_json': <staticmethod(<function Detector.from_json>)>, 'as_h5': <function Detector.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Detector' objects>, '__weakref__': <attribute '__weakref__' of 'Detector' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'distance': Field(name='distance',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'offset': Field(name='offset',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'orientation': Field(name='orientation',type=sasdata.metadata.Rot3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'beam_center': Field(name='beam_center',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'pixel_size': Field(name='pixel_size',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'slit_length': Field(name='slit_length',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Detector.__init__>, '__repr__': <function Detector.__repr__>, '__eq__': <function Detector.__eq__>, '__match_args__': ()})
__doc__ = '\nDetector information\n'
__eq__(other)

Return self==value.

__firstlineno__ = 90
__hash__ = None
__init__(*, name: str | None, distance: Quantity[float] | None, offset: Vec3 | None, orientation: Rot3 | None, beam_center: Vec3 | None, pixel_size: Vec3 | None, slit_length: Quantity[float] | None) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(group: Group)

Export data onto an HDF5 group

beam_center: Vec3 | None
distance: Quantity[float] | None
static from_json(obj)
name: str | None
offset: Vec3 | None
orientation: Rot3 | None
pixel_size: Vec3 | None
slit_length: Quantity[float] | None
summary()
class sasdata.metadata.Instrument(collimations: list[sasdata.metadata.Collimation], source: sasdata.metadata.Source | None, detector: list[sasdata.metadata.Detector])

Bases: object

__annotations__ = {'collimations': list[sasdata.metadata.Collimation], 'detector': list[sasdata.metadata.Detector], 'source': sasdata.metadata.Source | None}
__dataclass_fields__ = {'collimations': Field(name='collimations',type=list[sasdata.metadata.Collimation],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'detector': Field(name='detector',type=list[sasdata.metadata.Detector],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'source': Field(name='source',type=sasdata.metadata.Source | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=False,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 416, '__annotations__': {'collimations': list[sasdata.metadata.Collimation], 'source': sasdata.metadata.Source | None, 'detector': list[sasdata.metadata.Detector]}, 'summary': <function Instrument.summary>, 'from_json': <staticmethod(<function Instrument.from_json>)>, 'as_h5': <function Instrument.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Instrument' objects>, '__weakref__': <attribute '__weakref__' of 'Instrument' objects>, '__doc__': 'Instrument(collimations: list[sasdata.metadata.Collimation], source: sasdata.metadata.Source | None, detector: list[sasdata.metadata.Detector])', '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=False,slots=False,weakref_slot=False), '__dataclass_fields__': {'collimations': Field(name='collimations',type=list[sasdata.metadata.Collimation],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'source': Field(name='source',type=sasdata.metadata.Source | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'detector': Field(name='detector',type=list[sasdata.metadata.Detector],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Instrument.__init__>, '__repr__': <function Instrument.__repr__>, '__eq__': <function Instrument.__eq__>, '__match_args__': ('collimations', 'source', 'detector')})
__doc__ = 'Instrument(collimations: list[sasdata.metadata.Collimation], source: sasdata.metadata.Source | None, detector: list[sasdata.metadata.Detector])'
__eq__(other)

Return self==value.

__firstlineno__ = 416
__hash__ = None
__init__(collimations: list[Collimation], source: Source | None, detector: list[Detector]) None
__match_args__ = ('collimations', 'source', 'detector')
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(group: Group)

Export data onto an HDF5 group

collimations: list[Collimation]
detector: list[Detector]
static from_json(obj)
source: Source | None
summary()
class sasdata.metadata.MetaNode(*, name: str, attrs: dict[str, str], contents: str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode'])

Bases: object

__annotations__ = {'attrs': dict[str, str], 'contents': str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode'], 'name': <class 'str'>}
__dataclass_fields__ = {'attrs': Field(name='attrs',type=dict[str, str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'contents': Field(name='contents',type=str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode'],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'name': Field(name='name',type=<class 'str'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 447, '__annotations__': {'name': <class 'str'>, 'attrs': dict[str, str], 'contents': str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode']}, 'to_string': <function MetaNode.to_string>, 'filter': <function MetaNode.filter>, '__eq__': <function MetaNode.__eq__>, 'from_json': <staticmethod(<function MetaNode.from_json>)>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'MetaNode' objects>, '__weakref__': <attribute '__weakref__' of 'MetaNode' objects>, '__doc__': "MetaNode(*, name: str, attrs: dict[str, str], contents: str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode'])", '__hash__': None, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'name': Field(name='name',type=<class 'str'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'attrs': Field(name='attrs',type=dict[str, str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'contents': Field(name='contents',type=str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode'],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__init__': <function MetaNode.__init__>, '__repr__': <function MetaNode.__repr__>, '__match_args__': ()})
__doc__ = "MetaNode(*, name: str, attrs: dict[str, str], contents: str | sasdata.quantities.quantity.Quantity | numpy.ndarray | list['MetaNode'])"
__eq__(other) bool

Custom equality overload needed since numpy arrays don’t play nicely with equality

__firstlineno__ = 447
__hash__ = None
__init__(*, name: str, attrs: dict[str, str], contents: str | Quantity | ndarray | list[MetaNode]) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

attrs: dict[str, str]
contents: str | Quantity | ndarray | list[MetaNode]
filter(name: str) list[ndarray | Quantity | str]
static from_json(obj)
name: str
to_string(header='')

Convert node to pretty printer string

class sasdata.metadata.Metadata(*, title: str | None, run: list[str], definition: str | None, process: list[sasdata.metadata.Process], sample: sasdata.metadata.Sample | None, instrument: sasdata.metadata.Instrument | None, raw: sasdata.metadata.MetaNode)

Bases: object

__annotations__ = {'definition': str | None, 'instrument': sasdata.metadata.Instrument | None, 'process': list[sasdata.metadata.Process], 'raw': <class 'sasdata.metadata.MetaNode'>, 'run': list[str], 'sample': sasdata.metadata.Sample | None, 'title': str | None}
__dataclass_fields__ = {'definition': Field(name='definition',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'instrument': Field(name='instrument',type=sasdata.metadata.Instrument | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'process': Field(name='process',type=list[sasdata.metadata.Process],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'raw': Field(name='raw',type=<class 'sasdata.metadata.MetaNode'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'run': Field(name='run',type=list[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'sample': Field(name='sample',type=sasdata.metadata.Sample | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'title': Field(name='title',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 533, '__annotations__': {'title': str | None, 'run': list[str], 'definition': str | None, 'process': list[sasdata.metadata.Process], 'sample': sasdata.metadata.Sample | None, 'instrument': sasdata.metadata.Instrument | None, 'raw': <class 'sasdata.metadata.MetaNode'>}, 'summary': <function Metadata.summary>, 'from_json': <staticmethod(<function Metadata.from_json>)>, 'as_h5': <function Metadata.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Metadata' objects>, '__weakref__': <attribute '__weakref__' of 'Metadata' objects>, '__doc__': 'Metadata(*, title: str | None, run: list[str], definition: str | None, process: list[sasdata.metadata.Process], sample: sasdata.metadata.Sample | None, instrument: sasdata.metadata.Instrument | None, raw: sasdata.metadata.MetaNode)', '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'title': Field(name='title',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'run': Field(name='run',type=list[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'definition': Field(name='definition',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'process': Field(name='process',type=list[sasdata.metadata.Process],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'sample': Field(name='sample',type=sasdata.metadata.Sample | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'instrument': Field(name='instrument',type=sasdata.metadata.Instrument | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'raw': Field(name='raw',type=<class 'sasdata.metadata.MetaNode'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Metadata.__init__>, '__repr__': <function Metadata.__repr__>, '__eq__': <function Metadata.__eq__>, '__match_args__': ()})
__doc__ = 'Metadata(*, title: str | None, run: list[str], definition: str | None, process: list[sasdata.metadata.Process], sample: sasdata.metadata.Sample | None, instrument: sasdata.metadata.Instrument | None, raw: sasdata.metadata.MetaNode)'
__eq__(other)

Return self==value.

__firstlineno__ = 533
__hash__ = None
__init__(*, title: str | None, run: list[str], definition: str | None, process: list[Process], sample: Sample | None, instrument: Instrument | None, raw: MetaNode) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(f: Group)

Export data onto an HDF5 group

definition: str | None
static from_json(obj)
instrument: Instrument | None
process: list[Process]
raw: MetaNode
run: list[str]
sample: Sample | None
summary()
title: str | None
class sasdata.metadata.MetadataEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)

Bases: JSONEncoder

__annotations__ = {}
__doc__ = None
__firstlineno__ = 589
__module__ = 'sasdata.metadata'
__static_attributes__ = ()
default(obj)

Implement this method in a subclass such that it returns a serializable object for o, or calls the base implementation (to raise a TypeError).

For example, to support arbitrary iterators, you could implement default like this:

def default(self, o):
    try:
        iterable = iter(o)
    except TypeError:
        pass
    else:
        return list(iterable)
    # Let the base class default method raise the TypeError
    return super().default(o)
class sasdata.metadata.Process(*, name: str | None, date: str | None, description: str | None, terms: dict[str, str | Quantity[float]], notes: list[str])

Bases: object

Class that holds information about the processes performed on the data.

__annotations__ = {'date': str | None, 'description': str | None, 'name': str | None, 'notes': list[str], 'terms': dict[str, typing.Union[str, sasdata.quantities.quantity.Quantity[float]]]}
__dataclass_fields__ = {'date': Field(name='date',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'description': Field(name='description',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'notes': Field(name='notes',type=list[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'terms': Field(name='terms',type=dict[str, typing.Union[str, sasdata.quantities.quantity.Quantity[float]]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 346, '__annotations__': {'name': str | None, 'date': str | None, 'description': str | None, 'terms': dict[str, typing.Union[str, sasdata.quantities.quantity.Quantity[float]]], 'notes': list[str]}, '__doc__': '\nClass that holds information about the processes\nperformed on the data.\n', 'single_line_desc': <function Process.single_line_desc>, 'summary': <function Process.summary>, 'from_json': <staticmethod(<function Process.from_json>)>, 'as_h5': <function Process.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Process' objects>, '__weakref__': <attribute '__weakref__' of 'Process' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'date': Field(name='date',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'description': Field(name='description',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'terms': Field(name='terms',type=dict[str, typing.Union[str, sasdata.quantities.quantity.Quantity[float]]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'notes': Field(name='notes',type=list[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Process.__init__>, '__repr__': <function Process.__repr__>, '__eq__': <function Process.__eq__>, '__match_args__': ()})
__doc__ = '\nClass that holds information about the processes\nperformed on the data.\n'
__eq__(other)

Return self==value.

__firstlineno__ = 346
__hash__ = None
__init__(*, name: str | None, date: str | None, description: str | None, terms: dict[str, str | Quantity[float]], notes: list[str]) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(group: Group)

Export data onto an HDF5 group

date: str | None
description: str | None
static from_json(obj)
name: str | None
notes: list[str]
single_line_desc()

Return a single line string representing the process

summary()
terms: dict[str, str | Quantity[float]]
class sasdata.metadata.Rot3(*, roll: Quantity[float] | None, pitch: Quantity[float] | None, yaw: Quantity[float] | None)

Bases: object

A measured rotation in 3-space

__annotations__ = {'pitch': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'roll': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'yaw': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}
__dataclass_fields__ = {'pitch': Field(name='pitch',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'roll': Field(name='roll',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'yaw': Field(name='yaw',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 62, '__annotations__': {'roll': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'pitch': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'yaw': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}, '__doc__': 'A measured rotation in 3-space', 'from_json': <staticmethod(<function Rot3.from_json>)>, 'as_h5': <function Rot3.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Rot3' objects>, '__weakref__': <attribute '__weakref__' of 'Rot3' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'roll': Field(name='roll',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'pitch': Field(name='pitch',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'yaw': Field(name='yaw',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Rot3.__init__>, '__repr__': <function Rot3.__repr__>, '__eq__': <function Rot3.__eq__>, '__match_args__': ()})
__doc__ = 'A measured rotation in 3-space'
__eq__(other)

Return self==value.

__firstlineno__ = 62
__hash__ = None
__init__(*, roll: Quantity[float] | None, pitch: Quantity[float] | None, yaw: Quantity[float] | None) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(f: Group)

Export data onto an HDF5 group

static from_json(obj: dict) Quantity | None
pitch: Quantity[float] | None
roll: Quantity[float] | None
yaw: Quantity[float] | None
class sasdata.metadata.Sample(*, name: str | None, sample_id: str | None, thickness: Quantity[float] | None, transmission: float | None, temperature: Quantity[float] | None, position: Vec3 | None, orientation: Rot3 | None, details: list[str])

Bases: object

Class to hold the sample description

__annotations__ = {'details': list[str], 'name': str | None, 'orientation': sasdata.metadata.Rot3 | None, 'position': sasdata.metadata.Vec3 | None, 'sample_id': str | None, 'temperature': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'thickness': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'transmission': float | None}
__dataclass_fields__ = {'details': Field(name='details',type=list[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'orientation': Field(name='orientation',type=sasdata.metadata.Rot3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'position': Field(name='position',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'sample_id': Field(name='sample_id',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'temperature': Field(name='temperature',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'thickness': Field(name='thickness',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'transmission': Field(name='transmission',type=float | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 287, '__annotations__': {'name': str | None, 'sample_id': str | None, 'thickness': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'transmission': float | None, 'temperature': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'position': sasdata.metadata.Vec3 | None, 'orientation': sasdata.metadata.Rot3 | None, 'details': list[str]}, '__doc__': '\nClass to hold the sample description\n', 'summary': <function Sample.summary>, 'from_json': <staticmethod(<function Sample.from_json>)>, 'as_h5': <function Sample.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Sample' objects>, '__weakref__': <attribute '__weakref__' of 'Sample' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'name': Field(name='name',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'sample_id': Field(name='sample_id',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'thickness': Field(name='thickness',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'transmission': Field(name='transmission',type=float | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'temperature': Field(name='temperature',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'position': Field(name='position',type=sasdata.metadata.Vec3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'orientation': Field(name='orientation',type=sasdata.metadata.Rot3 | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'details': Field(name='details',type=list[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Sample.__init__>, '__repr__': <function Sample.__repr__>, '__eq__': <function Sample.__eq__>, '__match_args__': ()})
__doc__ = '\nClass to hold the sample description\n'
__eq__(other)

Return self==value.

__firstlineno__ = 287
__hash__ = None
__init__(*, name: str | None, sample_id: str | None, thickness: Quantity[float] | None, transmission: float | None, temperature: Quantity[float] | None, position: Vec3 | None, orientation: Rot3 | None, details: list[str]) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(f: Group)

Export data onto an HDF5 group

details: list[str]
static from_json(obj)
name: str | None
orientation: Rot3 | None
position: Vec3 | None
sample_id: str | None
summary() str
temperature: Quantity[float] | None
thickness: Quantity[float] | None
transmission: float | None
class sasdata.metadata.Source(*, radiation: str | None, beam_shape: str | None, beam_size: sasdata.metadata.BeamSize | None, wavelength: sasdata.quantities.quantity.Quantity[float] | None, wavelength_min: sasdata.quantities.quantity.Quantity[float] | None, wavelength_max: sasdata.quantities.quantity.Quantity[float] | None, wavelength_spread: sasdata.quantities.quantity.Quantity[float] | None)

Bases: object

__annotations__ = {'beam_shape': str | None, 'beam_size': sasdata.metadata.BeamSize | None, 'radiation': str | None, 'wavelength': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'wavelength_max': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'wavelength_min': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'wavelength_spread': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}
__dataclass_fields__ = {'beam_shape': Field(name='beam_shape',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'beam_size': Field(name='beam_size',type=sasdata.metadata.BeamSize | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'radiation': Field(name='radiation',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength': Field(name='wavelength',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength_max': Field(name='wavelength_max',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength_min': Field(name='wavelength_min',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength_spread': Field(name='wavelength_spread',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 232, '__annotations__': {'radiation': str | None, 'beam_shape': str | None, 'beam_size': sasdata.metadata.BeamSize | None, 'wavelength': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'wavelength_min': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'wavelength_max': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'wavelength_spread': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}, 'summary': <function Source.summary>, 'from_json': <staticmethod(<function Source.from_json>)>, 'as_h5': <function Source.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Source' objects>, '__weakref__': <attribute '__weakref__' of 'Source' objects>, '__doc__': 'Source(*, radiation: str | None, beam_shape: str | None, beam_size: sasdata.metadata.BeamSize | None, wavelength: Optional[sasdata.quantities.quantity.Quantity[float]], wavelength_min: Optional[sasdata.quantities.quantity.Quantity[float]], wavelength_max: Optional[sasdata.quantities.quantity.Quantity[float]], wavelength_spread: Optional[sasdata.quantities.quantity.Quantity[float]])', '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'radiation': Field(name='radiation',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'beam_shape': Field(name='beam_shape',type=str | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'beam_size': Field(name='beam_size',type=sasdata.metadata.BeamSize | None,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength': Field(name='wavelength',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength_min': Field(name='wavelength_min',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength_max': Field(name='wavelength_max',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'wavelength_spread': Field(name='wavelength_spread',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Source.__init__>, '__repr__': <function Source.__repr__>, '__eq__': <function Source.__eq__>, '__match_args__': ()})
__doc__ = 'Source(*, radiation: str | None, beam_shape: str | None, beam_size: sasdata.metadata.BeamSize | None, wavelength: Optional[sasdata.quantities.quantity.Quantity[float]], wavelength_min: Optional[sasdata.quantities.quantity.Quantity[float]], wavelength_max: Optional[sasdata.quantities.quantity.Quantity[float]], wavelength_spread: Optional[sasdata.quantities.quantity.Quantity[float]])'
__eq__(other)

Return self==value.

__firstlineno__ = 232
__hash__ = None
__init__(*, radiation: str | None, beam_shape: str | None, beam_size: BeamSize | None, wavelength: Quantity[float] | None, wavelength_min: Quantity[float] | None, wavelength_max: Quantity[float] | None, wavelength_spread: Quantity[float] | None) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(group: Group)

Export data onto an HDF5 group

beam_shape: str | None
beam_size: BeamSize | None
static from_json(obj)
radiation: str | None
summary() str
wavelength: Quantity[float] | None
wavelength_max: Quantity[float] | None
wavelength_min: Quantity[float] | None
wavelength_spread: Quantity[float] | None
class sasdata.metadata.TagCollection(*, singular: set[str] = <factory>, variable: set[str] = <factory>)

Bases: object

The collected tags and their variability.

__annotations__ = {'singular': set[str], 'variable': set[str]}
__dataclass_fields__ = {'singular': Field(name='singular',type=set[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<class 'set'>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'variable': Field(name='variable',type=set[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<class 'set'>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 800, '__annotations__': {'singular': set[str], 'variable': set[str]}, '__doc__': 'The collected tags and their variability.', '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'TagCollection' objects>, '__weakref__': <attribute '__weakref__' of 'TagCollection' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'singular': Field(name='singular',type=set[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<class 'set'>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'variable': Field(name='variable',type=set[str],default=<dataclasses._MISSING_TYPE object>,default_factory=<class 'set'>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function TagCollection.__init__>, '__repr__': <function TagCollection.__repr__>, '__eq__': <function TagCollection.__eq__>, '__match_args__': ()})
__doc__ = 'The collected tags and their variability.'
__eq__(other)

Return self==value.

__firstlineno__ = 800
__hash__ = None
__init__(*, singular: set[str] = <factory>, variable: set[str] = <factory>) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

singular: set[str]
variable: set[str]
class sasdata.metadata.Vec3(*, x: Quantity[float] | None, y: Quantity[float] | None, z: Quantity[float] | None)

Bases: object

A three-vector of measured quantities

__annotations__ = {'x': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'y': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'z': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}
__dataclass_fields__ = {'x': Field(name='x',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'y': Field(name='y',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'z': Field(name='z',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False)
__dict__ = mappingproxy({'__module__': 'sasdata.metadata', '__firstlineno__': 34, '__annotations__': {'x': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'y': typing.Optional[sasdata.quantities.quantity.Quantity[float]], 'z': typing.Optional[sasdata.quantities.quantity.Quantity[float]]}, '__doc__': 'A three-vector of measured quantities', 'from_json': <staticmethod(<function Vec3.from_json>)>, 'as_h5': <function Vec3.as_h5>, '__static_attributes__': (), '__dict__': <attribute '__dict__' of 'Vec3' objects>, '__weakref__': <attribute '__weakref__' of 'Vec3' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False,match_args=True,kw_only=True,slots=False,weakref_slot=False), '__dataclass_fields__': {'x': Field(name='x',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'y': Field(name='y',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD), 'z': Field(name='z',type=typing.Optional[sasdata.quantities.quantity.Quantity[float]],default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=True,_field_type=_FIELD)}, '__replace__': <function _replace>, '__hash__': None, '__init__': <function Vec3.__init__>, '__repr__': <function Vec3.__repr__>, '__eq__': <function Vec3.__eq__>, '__match_args__': ()})
__doc__ = 'A three-vector of measured quantities'
__eq__(other)

Return self==value.

__firstlineno__ = 34
__hash__ = None
__init__(*, x: Quantity[float] | None, y: Quantity[float] | None, z: Quantity[float] | None) None
__match_args__ = ()
__module__ = 'sasdata.metadata'
__replace__(**changes)
__repr__()

Return repr(self).

__static_attributes__ = ()
__weakref__

list of weak references to the object

as_h5(f: Group)

Export data onto an HDF5 group

static from_json(obj: dict) Quantity | None
x: Quantity[float] | None
y: Quantity[float] | None
z: Quantity[float] | None
sasdata.metadata.access_meta(obj: dataclass, key: str) Any | None

Use a string accessor to locate a key from within the data object.

The basic grammar of these accessors explicitly match the python syntax for accessing the data. For example, to access the name field within the object person, you would call access_meta(person, “.name”). Similarly, lists and dicts are access with square brackets.

> assert access_meta(person, ‘.name’) == person.name > assert access_meta(person, ‘.phone.home’) == person.phone.home > assert access_meta(person, ‘.addresses[0].postal_code’) == person.address[0].postal_code > assert access_meta(person, ‘.children[“Taylor”]’) == person.children[“Taylor”]

Obviously, when the accessor is know ahead of time, access_meta provides no benefit over directly retrieving the data. However, when a data structure is loaded at runtime (e.g. the metadata of a neutron scattering file), then it isn’t possible to know in advance the location of the specific value that the user desires. access_meta allows the user to provide the location at runtime.

This function returns None when the key is not a valid address for any data within the structure. Since the leaf could be any type that is not a list, dict, or dataclass, the return type of the function is Any | None.

The list of locations within a structure is given by the meta_tags function.

sasdata.metadata.collect_tags(objs: list[dataclass]) TagCollection

Identify uniform and varying data within a groups of data objects

The resulting TagCollection contains every accessor string that is valid for every object in the objs list. For example, if obj.name is a string for every obj in objs, then the string “.name” will be present in one of the two sets in the tags collection.

To be more specific, if obj.name exists and has the same value for every obj in objs, the string “.name” will be included in the singular set. If there are at least two distinct values for obj.name, then “.name” will be in the variable set.

sasdata.metadata.from_json_quantity(obj: dict) Quantity | None
sasdata.metadata.meta_tags(obj: dataclass) list[str]

Find all leaf accessors from a data object.

The function treats the passed in object as a tree. Lists, dicts, and dataclasses are all treated as branches on the tree and any other type is treated as a leaf. The function then returns a list of strings, where each string is a “path” from the root of the tree to one leaf. The structure of the path is designed to mimic the python code to access that specific leaf value.

These accessors allow us to treat accessing entries within a structure as first class values. This list can then be presented to the user to allow them to select specific information within the larger structure. This is particularly important when plotting against a specific date value within the structure.

Example:

>@dataclass
class Thermometer:

temperature: float units: str params: list

> item = Example() > item.temperature = 273 > item.units = “K” > item.old_values = [{‘date’: ‘2025-08-12’, ‘temperature’: 300’}] > assert meta_tags(item) = [‘.temperature’, ‘.units’, ‘.old_values[0][“date”]’, ‘.old_values[0][“temperature”]’]

The actual value of the leaf object specified by a path can be retrieved with the access_meta function.