Source code for mrfmsim.component.sample

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
from dataclasses import dataclass, field
from mrfmsim.component import ComponentBase

spin_dict = {
    # note: not accounting for the g-factor of the electron spin;
    "e": {"Gamma": 1.760859708e8, "J": 0.5},  # rad/s.mT
    "1H": {"Gamma": 2.675222005e05, "J": 0.5},  # rad/s.mT
    "71Ga": {"Gamma": 2.0 * np.pi * 12.98e3, "J": 1.5},  # rad/s.mT
    "19F": {"Gamma": 2.0 * np.pi * 40.05e3, "J": 0.5},  # rad/s.mT
    "2H": {"Gamma": 2.0 * np.pi * 6.536e3, "J": 1.0},  # rad/s.mT
}


[docs] @dataclass class Sample(ComponentBase): r"""Sample object for magnetic resonance force microscopy experiments. For spins 'e', '1H', '71Ga', '19F', or '2H' the Gamma and J are preset. For other spins, input the name, Gamma and J directly. :param str spin: spin type :param float T1: spin-lattice relaxation :math:`T_1` [s] :param float T2: spin-spin relaxation :math:`T_2` [s] :param float temperature: the sample temperature [K] :param float spin_density: the sample spin density :math:`\rho` [1/nm^3] :param float Gamma: spin gyromagnetic ratio [rad/s.mT] defaults to None if spin_type is one of the preset :param float L: spin angular momentum [unitless] default to None if spin_type is one of the preset :param float dB_hom: homogeneous linewidth [mT] :param float dB_sat: saturation linewidth [mT] """ spin: str T1: float = field(metadata={"unit": "s", "format": ".3e"}) T2: float = field(metadata={"unit": "s", "format": ".3e"}) temperature: float = field(metadata={"unit": "K"}) spin_density: float = field(metadata={"unit": "1/nm^3"}) Gamma: float = field(default=None, metadata={"unit": "rad/(s.mT)", "format": ".3e"}) J: float = field(default=None, metadata={"format": ".1f"}) dB_hom: float = field(init=False, default=None, metadata={"unit": "mT"}) dB_sat: float = field(init=False, default=None, metadata={"unit": "mT"}) def __post_init__(self): self.Gamma = self.Gamma or spin_dict[self.spin]["Gamma"] # rad/s.mT self.J = self.J or spin_dict[self.spin]["J"] self.dB_hom = 1 / (self.Gamma * self.T2) # mT self.dB_sat = 1 / (self.Gamma * np.sqrt(self.T1 * self.T2)) # mT