"""
Implementation of the data_source for the ORSO header.
"""
from dataclasses import field
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional, Union
import yaml
from .base import ComplexValue, File, Header, Person, Value, ValueRange, ValueVector, orsodataclass
from .model_language import SampleModel
# typing stuff introduced in python 3.8
try:
from typing import Literal
except ImportError:
from .typing_backport import Literal
[docs]@orsodataclass
class Experiment(Header):
"""
A definition of the experiment performed.
:param title: Proposal or project title.
:param instrument: Reflectometer identifier.
:param start_date: Start date for the experiment.
:param probe: Radiation probe, either :code:`'neutron'` or
:code:`'x-ray'`.
:param facility: Facility where the experiment was performed.
:param proposalID: Identifier for experiment at a facility.
:param doi: Digital object identifier for the experiment, possibly
provided by the facility.
"""
title: str
instrument: str
start_date: datetime
probe: Literal["neutron", "x-ray"]
facility: Optional[str] = None
proposalID: Optional[str] = None
doi: Optional[str] = None
[docs]@orsodataclass
class Sample(Header):
"""
A description of the sample measured.
:param name: An identified for the individual sample or the subject and
state being measured.
:param category: Simple sample description, front (beam side) / back,
each side should be one of :code:`'solid/liquid'`,
:code:`'liquid/solid'`, :code:`'gas/liquid'`,
:code:`'liquid/liquid'`, :code:`'solid/gas'`, :code:`'gas/solid'`.
:param composition: Notes on the nominal composition of the sample e.g.
:code:`Si | SiO2 (20 angstrom) | Fe (200 angstrom) |
air (beam side)`.
:param description: Further details of the sample, e.g. size.
:param size: Sample size in x, y, z direction, where z is parallel to the surface normal
and x is along the beam direction (important for footprint correction).
:param environment: Name of the sample environment device(s).
:param sample_parameters: Dictionary of sample parameters.
"""
name: str
category: Optional[str] = None
composition: Optional[str] = None
description: Optional[str] = None
size: Optional[ValueVector] = None
environment: Optional[List[str]] = None
sample_parameters: Optional[Dict[str, Union[Value, ValueRange, ValueVector, ComplexValue]]] = field(
default=None, metadata={"description": "Using keys for parameters and Value* objects for values."}
)
model: Optional[SampleModel] = None
[docs]class Polarization(str, Enum):
"""
Polarization of the beam used for the reflectivity.
Neutrons:
The first symbol indicates the magnetisation direction of the incident
beam, the second symbol indicates the direction of the scattered
beam. If either polarization or analysis are not employed the
symbol is replaced by "o".
X-rays:
Uses the conventional names pi, sigma, left and right. In experiments
with polarization analysis the incident and outgoing polarizations
are separated with an underscore "_".
"""
unpolarized = "unpolarized"
# half polarized states
po = "po"
mo = "mo"
op = "op"
om = "om"
# full polarization analysis
mm = "mm"
mp = "mp"
pm = "pm"
pp = "pp"
# x-ray polarizations
pi = "pi" # in scattering plane
sigma = "sigma" # perpendicular to scattering plane
left = "left" # circular left
right = "right" # circular right
pi_pi = "pi_pi"
sigma_sigma = "sigma_sigma"
pi_sigma = "pi_sigma"
sigma_pi = "sigma_pi"
[docs] def yaml_representer(self, dumper: yaml.Dumper):
output = self.value
return dumper.represent_str(output)
[docs]@orsodataclass
class InstrumentSettings(Header):
"""
Settings associated with the instrumentation.
:param incident_angle: Angle (range) of incidence.
:param wavelength: Neutron/x-ray wavelenght (range).
:param polarization: Radiation polarization as one of
:code:`'unpolarized'`, :code:`'p'`, :code:`'m'`, :code:`'pp'`,
:code:`'pm'`, :code:`'mp'`, :code:`'mm'`, or a
:py:class:`orsopy.fileio.base.ValueVector`.
:param configuration: Description of the instreument configuration (full
polarized/liquid surface/etc).
"""
incident_angle: Union[Value, ValueRange]
wavelength: Union[Value, ValueRange]
polarization: Optional[Union[Polarization, ValueVector]] = field(
default=None,
metadata={
"description": "Polarization described as unpolarized/ po/ mo / op / om / pp / pm / mp / mm / vector"
},
)
configuration: Optional[str] = field(
default=None, metadata={"description": "half / full polarized | liquid_surface | etc"}
)
__repr__ = Header._staggered_repr
[docs]@orsodataclass
class Measurement(Header):
"""
The measurement elements for the header.
:param instrument_settings: Instrumentation details.
:param data_files: Raw data files produced in the measurement.
:param references: Raw reference files used in the reduction.
:param scheme: Measurement scheme (one of :code:`'angle-dispersive'`,
:code:`'energy-dispersive'`/:code:`'angle- and energy-dispersive'`).
"""
instrument_settings: InstrumentSettings
data_files: List[Union[File, str]]
additional_files: Optional[List[Union[File, str]]] = None
scheme: Optional[Literal["angle- and energy-dispersive", "angle-dispersive", "energy-dispersive"]] = None
__repr__ = Header._staggered_repr
[docs]@orsodataclass
class DataSource(Header):
"""
The data_source object definition.
:param owner: This refers to the actual owner of the data set, i.e. the
main proposer or the person doing the measurement on a lab
reflectometer.
:param experiment: Details of the experimental.
:param sample: Sample information.
:param measurement: Measurement specifics.
"""
owner: Person
experiment: Experiment
sample: Sample
measurement: Measurement
_orso_optionals = []
__repr__ = Header._staggered_repr