material_density
MATERIAL_DEFAULTS = {'sld': {'description': 'The real scattering length density for a material in e-6 per squared angstrom.', 'url': 'https://www.ncnr.nist.gov/resources/activation/', 'value': 4.186, 'unit': '1 / angstrom^2', 'min': -np.inf, 'max': np.inf, 'fixed': True}, 'isld': {'description': 'The imaginary scattering length density for a material in e-6 per squared angstrom.', 'url': 'https://www.ncnr.nist.gov/resources/activation/', 'value': 0.0, 'unit': '1 / angstrom^2', 'min': -np.inf, 'max': np.inf, 'fixed': True}}
module-attribute
DEFAULTS = {'chemical_structure': 'Si', 'density': {'description': 'The mass density of the material.', 'url': 'https://en.wikipedia.org/wiki/Density', 'value': 2.33, 'unit': 'gram / centimeter ** 3', 'min': 0, 'max': np.inf, 'fixed': True}, 'molecular_weight': {'description': 'The molecular weight of a material.', 'url': 'https://en.wikipedia.org/wiki/Molecular_mass', 'value': 28.02, 'unit': 'g / mole'}, 'scattering_length_real': {'description': 'The real scattering length for a chemical formula in angstrom.', 'url': 'https://www.ncnr.nist.gov/resources/activation/', 'value': 4.1507e-05, 'unit': 'angstrom', 'min': -np.inf, 'max': np.inf, 'fixed': True}, 'scattering_length_imag': {'description': 'The imaginary scattering length for a chemical formula in angstrom.', 'url': 'https://www.ncnr.nist.gov/resources/activation/', 'value': 0.0, 'unit': 'angstrom', 'min': -np.inf, 'max': np.inf, 'fixed': True}, 'avogadro': {'description': 'The Avogadro constant.', 'url': 'https://en.wikipedia.org/wiki/Avogadro_constant', 'value': AVOGADRO, 'unit': '1 / mole'}}
module-attribute
SLD_DEPENDENCY_EXPRESSION = 'na * d * sl / mw * 1e6'
module-attribute
Material
Bases: BaseCore
Source code in src/easyreflectometry/sample/elements/materials/material.py
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | |
__init__(sld=None, isld=None, name='EasyMaterial', unique_name=None, interface=None)
Constructor.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
unique_name
|
Optional[str]
|
By default, None. |
None
|
sld
|
Union[Parameter, float, None]
|
Real scattering length density. By default, None. |
None
|
isld
|
Union[Parameter, float, None]
|
Imaginary scattering length density. By default, None. |
None
|
name
|
str
|
Name of the material. By default, 'EasyMaterial'. |
'EasyMaterial'
|
interface
|
Calculator interface. By default, None. |
None
|
Source code in src/easyreflectometry/sample/elements/materials/material.py
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | |
MaterialDensity
Bases: Material
A material defined by chemical formula and mass density.
The scattering length density is derived rather than set: from the
formula, the coherent neutron scattering length b (real and
imaginary parts, tabulated per isotope) and the molecular weight M
are computed, and sld/isld are wired as dependent parameters
sld = N_A * density * b / M
so density is the natural fit parameter and edits to the density or
the formula propagate to the SLD automatically.
The coupling can be switched off per material via :attr:sld_coupled:
when False, sld/isld are independent parameters that can be
set and fitted directly, while density, molecular_weight and the
scattering lengths stop affecting anything until the coupling is
restored. Restoring it (sld_coupled = True) recomputes the SLDs from
the current formula and density, discarding manually set values. The
state round-trips through as_dict/from_dict, including the
manual SLD values of a decoupled material; dictionaries from before
this feature deserialize as coupled.
Assigning :attr:chemical_structure updates the scattering lengths and
the molecular weight together; an invalid formula raises ValueError
and leaves the material unchanged.
:attr:molecular_weight is a read-only DescriptorNumber, never a fit
parameter: it is fully determined by the formula, and freeing it alongside
density would make the fit degenerate (only density / molecular_weight
enters the derived SLD).
Source code in src/easyreflectometry/sample/elements/materials/material_density.py
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 | |
sld_coupled
property
writable
Whether sld/isld are derived from formula & density (True,
the default) or independent, directly editable/fittable parameters
(False).
An explicit flag reconciled with the live dependency state, because
neither alone is reliable: a decoupled sld may still be made
dependent by a user constraint, which must not make the material read
as coupled again; and the density dependencies may be removed behind
the material's back (unconstrain(material.sld) or a raw
make_independent()), after which the flag alone would still claim
coupling and serialization would drop the manual values.
The coupling is all-or-nothing: sld and isld are decoupled and
recoupled together, and only that joint state is serialized. Freeing
just one of them (unconstrain(material.sld) alone) reads as
decoupled, and a save/load restores both as independent with their
saved values; such a mixed state is session-only.
chemical_structure
property
writable
Get the chemical structure string.
molecular_weight
property
The molecular weight of the formula. A read-only descriptor, not a
fittable parameter: it is a constant of the chemical formula and is
recomputed whenever :attr:chemical_structure is assigned.
number_density
property
Number density of formula units in 1/angstrom^3, derived from the
density and the formula. Read-only: density is the fit parameter;
convert a number density with
:func:~easyreflectometry.special.calculations.mass_density_from_number_density.
__init__(chemical_structure=None, density=None, name='EasyMaterialDensity', unique_name=None, interface=None)
Constructor.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
unique_name
|
Optional[str]
|
By default, None. |
None
|
chemical_structure
|
Union[str, None]
|
Chemical formula for the material. By default, None. |
None
|
density
|
Union[Parameter, float, None]
|
Mass density for the material. By default, None. |
None
|
name
|
str
|
Identifier. By default, 'EasyMaterialDensity'. |
'EasyMaterialDensity'
|
interface
|
Interface object. By default, None. |
None
|
Source code in src/easyreflectometry/sample/elements/materials/material_density.py
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | |
from_dict(obj_dict)
classmethod
Re-attach sld/isld dependencies after deserialization.
:class:ModelBase.from_dict re-points self._density at the
deserialized Parameter (because density is a constructor argument);
the constraint graph built in __init__ still references the
temporary Parameter created from the float kwarg. Rebuild here so
q.density = X propagates to the derived SLDs.
The keys written by _convert_to_dict are not constructor
arguments and must be removed before the parent's cls(**data)
call; they are then used to restore the coupling state. A dict
without them (pre-feature project files) restores as coupled.
Source code in src/easyreflectometry/sample/elements/materials/material_density.py
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 | |
unconstrain(parameter)
Remove any constraint from parameter.
Idempotent: calling it on an already-independent parameter is a
no-op. The parameter keeps its current (last evaluated) value and
becomes fittable again. Its bounds, unit, variance and fixed state
are not restored to their pre-constraint values. Review and reset
the bounds before fitting.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
parameter
|
Parameter
|
Parameter to make independent again. |
required |
Source code in src/easyreflectometry/constraints.py
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | |
get_as_parameter(name, value, default_dict, unique_name_prefix=None)
This function creates a parameter for the variable name.
A parameter has a value and metadata.
If the value already is a parameter, it is returned. If the value is a number, a parameter is created with this value and metadata from the dictionary. If the value is None, a parameter is created with the default value and metadata from the dictionary.
param value: The value to use for the parameter. If None, the default value in the dictionary is used.
param name: The name of the parameter
param default_dict: Dictionary with entry for `name` containing the default value and metadata for the parameter
Source code in src/easyreflectometry/utils.py
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | |