easydiffraction#

Version

0.21.1, with CrysPy 0.13.0 and CrysFML 0.8.0, installed by pixi install --frozen -e easydiffraction (Python 3.12 or later)

Workflow

easydiffraction.rietveld (Rietveld refinement); no single-peak fitting

Calculators

cryspy or crysfml, stated in the recipe

Parameters

[value, flag, min, max]

Platforms

Linux, Windows; macOS expected to work, not routinely tested

Run

pixi run -e easydiffraction powderline <recipe.json>

Cite

easydiffraction 0.21.1 (Zenodo) and the calculator you used, see Citing

What you write#

A minimal easydiffraction.rietveld recipe for LaB6. It validates as shown; your measured pattern replaces the three data points.

{
  "schema_name": "easydiffraction.rietveld",
  "core_schema_version": "0.1.0",
  "engine_schema_version": "0.1.0",
  "payload": {
    "xrd_data": {
      "tth": [1.000, 1.004, 1.008],
      "Itth": [30.7, 29.8, 31.2],
      "Itth_weights": [0.0326, 0.0335, 0.0320]
    },
    "instrument": {
      "radiation": {"setup_wavelength": [0.1665, false, null, null]},
      "corrections": {"calib_twotheta_offset": [0.0, false, null, null]},
      "broadening": {
        "peak_type": "cwl-pseudo-voigt",
        "parameters": {
          "broad_gauss_u": [0.0104, true, null, null], "broad_gauss_v": [0.00033, true, null, null],
          "broad_gauss_w": [0.00064, true, null, null], "broad_lorentz_x": [0.0, false, null, null],
          "broad_lorentz_y": [0.0028, true, null, null]
        }
      }
    },
    "phases": {
      "LaB6": {
        "space_group": "P m -3 m",
        "unit_cell": {
          "a": [4.15682, true, null, null], "b": [4.15682, true, null, null],
          "c": [4.15682, true, null, null], "alpha": [90.0, false, null, null],
          "beta": [90.0, false, null, null], "gamma": [90.0, false, null, null]
        },
        "atoms": {
          "La": {"element": "La", "x": [0.0, false, null, null], "y": [0.0, false, null, null],
                 "z": [0.0, false, null, null], "occupancy": [1.0, false, null, null],
                 "ADP": "Uiso", "Uiso": [0.0086, false, null, null]},
          "B": {"element": "B", "x": [0.2021, false, null, null], "y": [0.5, false, null, null],
                "z": [0.5, false, null, null], "occupancy": [1.0, false, null, null],
                "ADP": "Uiso", "Uiso": [0.009, false, null, null]}
        },
        "scale": [5.4e-06, true, null, null]
      }
    },
    "refinement_controls": {
      "calculator": "cryspy",
      "minimizer": "lmfit (leastsq)",
      "max_iterations": 1000,
      "chi_square_change_tolerance": 1e-08,
      "parameter_change_tolerance": 1e-08,
      "gradient_tolerance": 0.0
    }
  }
}

LaB6’s B is written as (x, ½, ½) here, the pattern of easydiffraction’s Wyckoff template. With CrysPy, another writing of that site is refused (EB-77).

Required:

  • xrd_data: tth, Itth, Itth_weights.

  • instrument with radiation (setup_wavelength), corrections (calib_twotheta_offset) and broadening (peak_type and its parameters).

  • At least one phase, with space_group, unit_cell, atoms and scale.

  • refinement_controls, every control stated: calculator, minimizer, max_iterations, chi_square_change_tolerance, parameter_change_tolerance, gradient_tolerance.

Optional: fit_range, background, instrument.polarization, instrument.absorption, a Kα2 line in radiation, and per phase scattering_types and preferred_orientation (both with the cryspy calculator only).

Every field, with its unit: Fields: easydiffraction.rietveld.

Units that differ from other engines#

Quantity

easydiffraction unit

broad_gauss_u, _v, _w (Gaussian FWHM² = U tan²θ + V tanθ + W)

degree²

broad_lorentz_x, _y (Lorentzian FWHM = X tanθ + Y/cosθ)

degree

setup_wavelength

Å

calib_twotheta_offset, sample displacement, transparency

degree

GSAS-II’s X and Y swap roles: its Lorentzian width is X/cosθ + Y tanθ.

setup_polarization_coefficient is p, and GSAS-II’s polarization P is 1 − p. GSAS-II’s P = 0.99 is p = 0.01. Copying P into p is a 6.6 % intensity error at 15° 2θ (EB-75).

Nothing has a default#

Every control is stated, and an instrument slot you leave out is not modeled. A recipe without background has no background. A recipe with no refine flag set is a simulation: lmfit is not run.

Bounds#

[value, flag, min, max]: a stated min or max replaces easydiffraction’s physical limit on that side, and null keeps it (EB-71).

  • The physical limits: cell lengths 0–30 Å, angles 0–180°, occupancy 0–1, Uiso and U11, U22, U33 0–10 Ų, and scale, wavelength and μR ≥ 0.

  • A value outside a physical limit is a validation error, even when it is fixed. So no cell over 30 Å can be modeled.

  • A refined value that ends within 1e-6 (relative) of a bound or a physical limit gets easydiffraction_parameter_at_limit. For a limit of 0, the test is within 1e-6 of the starting value.

Bounds in every engine: Recipe format.

The instrument block#

Each correction easydiffraction models for constant-wavelength X-ray powder data is a slot. A slot you leave out is not modeled.

Block

Fields

radiation

setup_wavelength (Å). Optionally a Kα2 line: setup_wavelength_2 and setup_wavelength_2_to_1_ratio, stated together.

polarization (optional)

Fixed setup_polarization_coefficient (p) and setup_monochromator_twotheta. 2θ_m acts only with p > 0.

corrections

calib_twotheta_offset (degree); optionally calib_sample_displacement, calib_sample_transparency

absorption (optional)

cylinder-hewat, with mu_r

broadening

peak_type, its parameters, and cutoff_fwhm (CrysPy only)

The peak types are cwl-pseudo-voigt (both calculators), cwl-pseudo-voigt-berar-baldinozzi-asymmetry (CrysPy) and cwl-thompson-cox-hastings with FCJ asym_fcj_1 and asym_fcj_2 (CrysFML).

Because the peak types depend on the calculator, an instrument block moves only between recipes that use the same calculator. Calibrate with the calculator you will use for your samples.

A stated profile that makes a peak width negative anywhere near the fit window is a validation error (EB-87).

Background and controls#

  • background.chebyshev is the shared Chebyshev model: num_coefficients, coefficients, and one refine_flag for all terms. Its basis spans the fit window’s first and last points. It is the only background model.

  • refinement_controls: calculator, minimizer, max_iterations, chi_square_change_tolerance, parameter_change_tolerance, gradient_tolerance. All are required. minimizer accepts only "lmfit (leastsq)".

  • preferred_orientation is March–Dollase, as in GSAS-II, with a bounded ratio plus a required march_random_fract: [f, flag, min, max] in [0, 1]. With f > 0, the refined r and f are not GSAS-II’s quantities (EB-98).

Calculators#

The calculator is part of the recipe (refinement_controls.calculator). CrysPy and CrysFML compute different intensities and offer different peak types. Every result records the calculator in engine_details.

CrysPy ("cryspy")

CrysFML ("crysfml")

Peak types

cwl-pseudo-voigt, Bérar–Baldinozzi asymmetry

cwl-pseudo-voigt, Thompson–Cox–Hastings with FCJ axial asymmetry

cutoff_fwhm

acts

fixed 30-FWHM window

Space-group settings accepted

428 of 531

230 of 531

Uaniso

yes

no: validation error (EB-23)

scattering_types (ions)

yes, 111 ions

no: validation error (EB-96)

preferred_orientation

yes

no: validation error (EB-97)

Reflection list and peak-list reports

yes

none, with easydiffraction_reflections_not_available (EB-79)

Single precision

—

yes: every refinement warns easydiffraction_crysfml_start_dependent (EB-90)

Both “pseudo-Voigts” are the TCH pseudo-Voigt, with Caglioti Gaussian and X tanθ + Y/cosθ Lorentzian widths (EB-76). Both calculators model the Kα doublet, Lorentz–polarization, the 2θ offset, sample displacement and transparency, and Hewat cylinder absorption (EB-75).

  • Space-group settings. Validation accepts, per calculator, only the settings whose computation passed for a general position and for every special site. The error names a setting of the same group that the calculator computes, or the other calculator (EB-80).

  • CrysFML’s intensities drift by −4 % from 3° to 15° 2θ. A drift this size is worth about 0.001 Ų of Uiso, and a refinement compensates by lowering Uiso (EB-78).

  • Absolute Uiso agrees across engines only when the profile models agree. On the LaB6 temperature series, easydiffraction refines La’s Uiso 10–22 % low (EB-93). Compare cells and expansion instead: Comparing engines.

How PowderLine runs easydiffraction#

easydiffraction runs in the same process as PowderLine.

  • The data are handed over as a CIF loop at full precision, every number in positional notation (EB-72, EB-89). Only the weighted points inside the fit window are handed over (EB-70).

  • Errors stay errors. The gateway sets easydiffraction’s log reaction to RAISE, whatever ED_LOG_REACTION says (EB-48).

  • Atoms are checked after the build. The gateway compares easydiffraction’s multiplicity with core’s for every atom (EB-47).

  • Convergence. PowderLine reads lmfit’s success flag and message. A fit that stops without success, for example at max_iterations, is still a success with its values reported, plus the warning easydiffraction_fit_not_converged.

  • Parameters varied is lmfit’s count. A parameter without effect gets no ESD (EB-81).

  • Offline, importing easydiffraction prints a warning about a PyPI version check and continues (EB-82).

Behaviors#

Each entry says what easydiffraction does on its own and what PowderLine does about it. Messages and the changelog cite these IDs.

Space groups#

EB-42 · A space group is a short name plus a setting code#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction takes one of 230 short names and a separate setting code: 531 settings in all.

PowderLine does: The easydiffraction gateway translates the canonical name into a short name and a setting code. It refuses what easydiffraction cannot express.

You see: validation error

EB-80 · Each calculator misreads some settings#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0, CrysFML 0.8.0)

easydiffraction does: CrysFML is handed the short symbol alone. It misreads almost every non-default setting: unique axis, cell choice, :R and some origin-1 groups. CrysPy computes 41 settings as another setting: most c- and a-unique monoclinic settings, the :R settings, some origin-1 settings, and P 31, which it computes with the operators of P 32.

PowderLine does: Validation accepts, per calculator, only the settings whose computation passed for a general position and for every special site: 428 of the 531 for CrysPy, 230 for CrysFML. The error names a setting of the same group that the calculator computes, or the other calculator.

You see: validation error

EB-84 · CrysPy crashes on 53 settings#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: CrysPy crashes on 53 settings: 51 cell-choice settings such as A 1 2 1 and I 1 2 1, plus P 6/m and F d -3 c:2. CrysFML runs them.

PowderLine does: Validation refuses these settings for the cryspy calculator (EB-80). The error names a setting of the same group that CrysPy computes, or the crysfml calculator.

You see: validation error

EB-83 · CrysPy resets the unique angle of some monoclinic cells to 90°#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: For c-unique and a-unique monoclinic cells, CrysPy resets the unique angle to 90°.

PowderLine does: These settings are not among those validation accepts for the cryspy calculator. The error names a setting of the same group that CrysPy computes, or the crysfml calculator.

You see: validation error

Special positions and sites#

EB-12 · CrysPy rationalizes and snaps coordinates#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: CrysPy rationalizes each coordinate to a denominator of at most 10⁵. It snaps 5-decimal thirds.

PowderLine does: Core hands over exact values, so CrysPy’s own tolerance never matters.

EB-47 · easydiffraction applies site symmetry itself#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction detects each atom’s Wyckoff position and marks the coordinates and Uij fixed by symmetry. It ignores a free flag on them, and coupled coordinates follow the free one. A user edit of a value re-detects the Wyckoff position with tolerance 1e-3, so an off-special coordinate can change the multiplicity.

PowderLine does: The gateway hands over core’s exact values. After the build, it checks easydiffraction’s multiplicity and coordinates against core’s for every atom. A mismatch stops the run before refining, with reason unusable_site, and names the atom.

You see: unusable_site

EB-74 · Wyckoff positions are detected when the structure is built, never during a fit#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction detects Wyckoff positions when a structure is built and when a user edit moves a coordinate. An edit within the 1e-3 tolerance rewrites the stored value (x = 0.4995 becomes 0.5). During a fit nothing is re-detected, so a refined coordinate drifting toward a special position is never snapped. A position written as another lattice translation of the template’s pattern is stored in easydiffraction’s own writing.

PowderLine does: The gateway hands over core’s exact values, and core’s 5e-6 to 2e-3 band refuses every position the detection could move. A position stored translated by a lattice vector is the same atom: it is accepted with a warning, and reports keep the recipe’s writing. A refined coordinate that ends near a special position is reported through the output recipe (KI-18).

You see: easydiffraction_position_translated, output_recipe_not_valid

EB-77 · CrysPy computes some special positions wrongly#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: CrysPy computes wrong structure factors for some equivalent writings of a special position with a free coordinate. LaB6’s B written as (½, ½, x) instead of the template’s (x, ½, ½) gives intensities off by up to ×2. It also computes special positions wrongly in nine origin-choice-1 settings. General positions and fixed special positions are right.

PowderLine does: With calculator: "cryspy", an atom on such a site must be written in the pattern of easydiffraction’s Wyckoff template. Otherwise the run stops before refining, with reason unusable_site, and names the position to write. --validate-only does not catch this. The nine settings are refused at validation for the cryspy calculator. CrysFML has no such rule.

You see: unusable_site, validation error

Cell, ADPs and occupancy#

EB-23 · CrysFML ignores anisotropic ADPs#

handled · easydiffraction 0.21.1 (CrysFML 0.8.0)

easydiffraction does: easydiffraction supports anisotropic ADPs, but CrysFML is handed only B = 8π²·Ueq. A Uaniso has no effect with CrysFML.

PowderLine does: Uaniso with the crysfml calculator is a validation error.

You see: validation error

EB-86 · A refined Uij can land in the wrong atom’s column#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: With CrysPy, easydiffraction writes a refined Uij into the wrong atom’s column whenever an isotropic atom precedes the anisotropic one. The refined tensor then has no effect.

PowderLine does: The gateway hands the anisotropic atoms to easydiffraction first. Reports keep the recipe’s order. A test proves that a refined Uij moves.

EB-46 · Negative ADPs are refused at input#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction refuses a negative Uiso or U11, U22, U33 at input. Its physical limit for them is 0–10 Ų. The minimizer skips that check, so a refinement can still carry a negative value, and the pattern stays finite.

PowderLine does: An easydiffraction.* recipe may not state a negative Uiso or U11, U22, U33: validation error.

You see: validation error

EB-22 · Occupancy outside [0, 1] is refused#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction refuses an occupancy outside [0, 1].

PowderLine does: Core requires 0 ≤ occupancy ≤ 1 for every engine, so the recipe is refused before easydiffraction sees it.

You see: validation error

Scattering types#

EB-95 · An ion CrysPy has no form factor for becomes the neutral atom#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: easydiffraction accepts any CIF type symbol, such as O2-. When CrysPy has no form factor for the ion, it uses the neutral atom with a log warning only. CrysPy has 111 ions: O1- but no O2-.

PowderLine does: An ion outside CrysPy’s table is a validation error that names the forms CrysPy has.

You see: validation error

EB-96 · CrysFML computes neutral atoms only#

handled · easydiffraction 0.21.1 (CrysFML 0.8.0)

easydiffraction does: easydiffraction strips every charge before handing the type to CrysFML.

PowderLine does: scattering_types with the crysfml calculator is a validation error. Use the cryspy calculator for ions.

You see: validation error

Names#

EB-45 · Atom labels are restricted and datablock names lowercased#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction accepts atom labels of the form [A-Za-z_][A-Za-z0-9_]* only. It lowercases datablock names.

PowderLine does: The core name rule makes every name easydiffraction would reject or merge invalid before it runs.

You see: validation error

Bounds and limits#

EB-71 · Unbounded sides get physical limits, and starts are moved silently#

handled · easydiffraction 0.21.1

easydiffraction does: When a fit starts, easydiffraction gives an unbounded side its physical limit: cell lengths 0–30 Å, angles 0–180°, occupancy 0–1, adp_iso and U11/U22/U33 0–10 Ų, scale, wavelength and μR ≥ 0. It refuses a value outside a physical limit at input, even when fixed, so no cell over 30 Å can be modeled. lmfit moves a start outside its bounds onto the bound without a message.

PowderLine does: A stated bound replaces the physical limit on its side, and null keeps it. A value outside a physical limit is a validation error. A refined value that ends within 1e-6 (relative) of a bound or physical limit gets a warning. For a limit of 0, the test is within 1e-6 of the starting value.

You see: validation error, easydiffraction_parameter_at_limit

Peak profile and instrument#

EB-75 · The X-ray corrections easydiffraction models, and its polarization#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0, CrysFML 0.8.0)

easydiffraction does: Both calculators model the Kα doublet, the Lorentz factor and the polarization factor 1 − p + p cos²2θ_m cos²2θ, the 2θ offset, sample displacement and transparency, and Hewat cylinder absorption. A second wavelength alone does nothing. 2θ_m acts only with p > 0. GSAS-II’s polarization P is easydiffraction’s 1 − p: copying P to p is a 6.6 % intensity error at 15° 2θ.

PowderLine does: Every correction is a recipe slot; left out means not modeled. The schema requires both Kα2 fields or neither. The hand-derived per-engine recipes state p = 1 − P.

You see: validation error

EB-87 · Negative peak widths give a wrong pattern without a message#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0, CrysFML 0.8.0)

easydiffraction does: Where U tan²θ + V tanθ + W < 0, CrysFML drops the peaks and CrysPy distorts them. Where X tanθ + Y/cosθ < 0, both give a finite pattern 12–24 % off.

PowderLine does: A stated profile that makes a width negative is a validation error. The check covers the handed points and a 0.01° grid over the window widened by 1° plus the position corrections. A refined profile that does so gets a warning. In example_LaB6_ionic, the CrysPy pseudo-Voigt fit refines X to −0.097, so the Lorentzian width is negative from about 11.3° on.

You see: validation error, easydiffraction_negative_width

Seen in: example_LaB6_ionic

Preferred orientation#

EB-97 · Preferred orientation reaches CrysPy only, under the right key#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0, CrysFML 0.8.0)

easydiffraction does: Only the CrysPy calculator reads the experiment’s preferred-orientation rows. CrysFML’s pattern does not change with march_r, without a message. CrysPy also ignores a row whose structure_id is not the lowercase linked structure name, silently.

PowderLine does: preferred_orientation with calculator: "crysfml" is a validation error. The builder keys the row by the structure name easydiffraction uses.

You see: validation error

EB-98 · CrysPy’s March correction is Dollase’s times r^1.5#

documented · easydiffraction 0.21.1 (CrysPy 0.13.0)

easydiffraction does: CrysPy’s texture correction is not volume-normalized, so every textured-to-untextured intensity ratio carries the constant r^1.5. With march_random_fract = 0 the scale absorbs it, and the refined march_r is the same r as GSAS-II’s. With f > 0 the correction is (1 − f)·r^1.5·A + f, and the refined r and f are not GSAS-II’s quantities.

PowderLine does: Documented. A test compares normalized ratios with GSAS-II’s March–Dollase correction.

Data and the fit window#

EB-70 · Only the handed points are calculated#

documented · easydiffraction 0.21.1

easydiffraction does: easydiffraction calculates only the points it is handed, and maps its Chebyshev basis over them. Reflection tails from beyond the window are lost: at most 3e-4 σ at the refined scale.

PowderLine does: The gateway hands easydiffraction exactly the weighted points inside the window, so it fits the points core scores. The lost tails are documented.

EB-73 · A σ below 1e-4 becomes 1.0 silently#

handled · easydiffraction 0.21.1

easydiffraction does: On every input path, easydiffraction replaces σ < 1e-4 with σ = 1.0.

PowderLine does: Weights above 1e8 on handed points are a validation error.

You see: validation error

EB-91 · Negative measured intensities are refused#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction refuses negative measured intensities.

PowderLine does: A negative intensity on a handed point is a validation error.

You see: validation error

EB-72 · The ASCII data reader rounds 2θ to 4 decimals#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction’s ASCII data reader rounds 2θ to 4 decimals.

PowderLine does: The gateway hands the data as a CIF loop at full precision.

EB-89 · The CIF loop cannot read exponent notation#

handled · easydiffraction 0.21.1

easydiffraction does: easydiffraction’s CIF loop reader cannot read numbers in exponent notation.

PowderLine does: The gateway writes every number in the data loop in positional notation.

Statistics#

EB-81 · A parameter without effect gets no ESD#

warned · easydiffraction 0.21.1

easydiffraction does: easydiffraction’s free-parameter count is lmfit’s. A parameter without effect gets no ESD. Its own prof_wr_factor is 1/σ²-weighted.

PowderLine does: parameters_varied is lmfit’s count. The engine’s own statistics stay under engine_details.

You see: easydiffraction_parameters_not_varied

Calculators#

EB-76 · The two calculators compute different peak types#

handled · easydiffraction 0.21.1 (CrysPy 0.13.0, CrysFML 0.8.0)

easydiffraction does: CrysPy computes cwl-pseudo-voigt and the Bérar–Baldinozzi empirical asymmetry. CrysFML computes cwl-pseudo-voigt and the Thompson–Cox–Hastings profile with FCJ axial asymmetry. Both pseudo-Voigts are the TCH pseudo-Voigt with Caglioti Gaussian and X tanθ + Y/cosθ Lorentzian widths. cutoff_fwhm acts in CrysPy only; CrysFML uses a fixed 30-FWHM window.

PowderLine does: The peak type must be one the chosen calculator computes. Otherwise validation fails.

You see: validation error

EB-79 · CrysFML reports no reflection list#

warned · easydiffraction 0.21.1 (CrysFML 0.8.0)

easydiffraction does: CrysFML reports no reflection list.

PowderLine does: No peak list reports are written with CrysFML, and the result says so.

You see: easydiffraction_reflections_not_available

EB-90 · CrysFML refinements depend on their starting values#

warned · easydiffraction 0.21.1 (CrysFML 0.8.0)

easydiffraction does: CrysFML computes in single precision, below lmfit’s finite-difference step. A CrysFML refinement stops at a point that depends on its starting values. Starts changed by 1e-6 (relative) gave Rwp 6.79 % against 6.27 %, with cells stable to about 1e-5.

PowderLine does: Every CrysFML refinement carries a warning. The calculator stays available because you choose it, and PowderLine states the difference.

You see: easydiffraction_crysfml_start_dependent

EB-78 · CrysFML’s integrated intensities drift with angle#

documented · easydiffraction 0.21.1 (CrysFML 0.8.0)

easydiffraction does: Relative to m·|F|²·Lorentz, CrysFML’s integrated intensities drift by −4 % from 3° to 15° 2θ. A drift this size is worth about 0.001 Ų of Uiso; a refinement compensates by lowering Uiso.

PowderLine does: The calculator is recorded in every result.

EB-93 · On the temperature series, easydiffraction refines La’s Uiso low#

documented · easydiffraction 0.21.1 (CrysPy 0.13.0, CrysFML 0.8.0)

easydiffraction does: On GSAS-II-calculated LaB6 patterns, easydiffraction refines La’s Uiso 10–22 % low. B’s Uiso, the thermal expansion and GoF ≈ 1 agree. Most of it comes from the series’ profile: GSAS-II clamps its Lorentzian width to 0.001 centideg above about 10.7°, so the high-angle peaks are pure Gaussian. Neither a symmetric pseudo-Voigt nor TCH can represent that, and Uiso absorbs the mismatch. Simulated with a profile easydiffraction can represent, CrysPy’s La Uiso is 0.00863 against 0.00858 programmed. CrysFML’s is 0.00823 (−4 %); its remaining profile mismatch and its intensity drift (EB-78) both act on Uiso, and the two were not separated.

PowderLine does: Documented, no code change. Across engines, compare cells, with the EB-88-size offsets in mind, and the expansion. Absolute Uiso agrees only when the profile models agree.

Seen in: example_LaB6_temperature_series

Platform and installation#

EB-48 · An environment variable can turn errors into log messages#

handled · easydiffraction 0.21.1

easydiffraction does: With ED_LOG_REACTION=WARN in the environment, easydiffraction downgrades its errors to log messages.

PowderLine does: The gateway sets the reaction to RAISE itself, whatever the environment.

EB-82 · Importing easydiffraction queries PyPI#

documented · easydiffraction 0.21.1

easydiffraction does: Importing easydiffraction imports diffpy.pdffit2, whose version module queries PyPI. Offline, it prints a warning and continues.

PowderLine does: Nothing. The import, and the run, continue.