.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "fitting/1D_fitting/plot_4_27Al_YAG.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_fitting_1D_fitting_plot_4_27Al_YAG.py: ²⁷Al MAS NMR of YAG (1st and 2nd order Quad) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 7-11 The following is a quadrupolar lineshape fitting example for the 27Al MAS NMR of Yttrium aluminum garnet (YAG) crystal. The following experimental dataset is a part of DMFIT [#f1]_ examples. We thank Dr. Dominique Massiot for sharing the dataset. .. GENERATED FROM PYTHON SOURCE LINES 11-24 .. code-block:: Python import csdmpy as cp import numpy as np import matplotlib.pyplot as plt from lmfit import Minimizer from mrsimulator import Simulator, Site, SpinSystem from mrsimulator.method.lib import BlochDecaySpectrum from mrsimulator import signal_processor as sp from mrsimulator.utils import spectral_fitting as sf from mrsimulator.utils import get_spectral_dimensions from mrsimulator.spin_system.tensors import SymmetricTensor .. GENERATED FROM PYTHON SOURCE LINES 26-28 Import the dataset ------------------ .. GENERATED FROM PYTHON SOURCE LINES 28-47 .. code-block:: Python host = "https://nmr.cemhti.cnrs-orleans.fr/Dmfit/Help/csdm/" filename = "27Al Quad MAS YAG 400MHz.csdf" experiment = cp.load(host + filename) # For spectral fitting, we only focus on the real part of the complex dataset experiment = experiment.real # Convert the coordinates along each dimension from Hz to ppm. _ = [item.to("ppm", "nmr_frequency_ratio") for item in experiment.dimensions] # plot of the dataset. plt.figure(figsize=(8, 4)) ax = plt.subplot(projection="csdm") ax.plot(experiment, color="black", linewidth=0.5, label="Experiment") ax.set_xlim(1200, -1200) plt.grid() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_001.png :alt: plot 4 27Al YAG :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 48-49 Estimate noise statistics from the dataset .. GENERATED FROM PYTHON SOURCE LINES 49-64 .. code-block:: Python coords = experiment.dimensions[0].coordinates noise_region = np.where(np.logical_and(coords > -570e-6, coords < -510e-6)) noise_data = experiment[noise_region] plt.figure(figsize=(3.75, 2.5)) ax = plt.subplot(projection="csdm") ax.plot(noise_data, label="noise") plt.title("Noise section") plt.axis("off") plt.tight_layout() plt.show() noise_mean, sigma = experiment[noise_region].mean(), experiment[noise_region].std() noise_mean, sigma .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_002.png :alt: Noise section :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none (, ) .. GENERATED FROM PYTHON SOURCE LINES 65-70 Create a fitting model ---------------------- **Guess model** Create a guess list of spin systems. .. GENERATED FROM PYTHON SOURCE LINES 70-87 .. code-block:: Python Al_1 = Site( isotope="27Al", isotropic_chemical_shift=76, # in ppm quadrupolar=SymmetricTensor(Cq=6e6, eta=0.0), # Cq in Hz ) Al_2 = Site( isotope="27Al", isotropic_chemical_shift=1, # in ppm quadrupolar=SymmetricTensor(Cq=5e5, eta=0.3), # Cq in Hz ) spin_systems = [ SpinSystem(sites=[Al_1], name="AlO4"), SpinSystem(sites=[Al_2], name="AlO6"), ] .. GENERATED FROM PYTHON SOURCE LINES 88-89 **Method** .. GENERATED FROM PYTHON SOURCE LINES 89-101 .. code-block:: Python # Get the spectral dimension parameters from the experiment. spectral_dims = get_spectral_dimensions(experiment) MAS = BlochDecaySpectrum( channels=["27Al"], magnetic_flux_density=9.395, # in T rotor_frequency=15250, # in Hz spectral_dimensions=spectral_dims, experiment=experiment, # add the measurement to the method. ) .. GENERATED FROM PYTHON SOURCE LINES 102-103 **Guess Spectrum** .. GENERATED FROM PYTHON SOURCE LINES 103-135 .. code-block:: Python # Simulation # ---------- sim = Simulator(spin_systems=spin_systems, methods=[MAS]) sim.config.decompose_spectrum = "spin_system" sim.run() # Post Simulation Processing # -------------------------- processor = sp.SignalProcessor( operations=[ sp.IFFT(), sp.apodization.Gaussian(FWHM="300 Hz"), sp.FFT(), sp.Scale(factor=500), ] ) processed_dataset = processor.apply_operations(dataset=sim.methods[0].simulation).real # Plot of the guess Spectrum # -------------------------- plt.figure(figsize=(8, 4)) ax = plt.subplot(projection="csdm") ax.plot(experiment, color="black", linewidth=0.5, label="Experiment") ax.plot(processed_dataset, linewidth=2, alpha=0.6) ax.set_xlim(1200, -1200) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_003.png :alt: plot 4 27Al YAG :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 136-140 Least-squares minimization with LMFIT ------------------------------------- Use the :func:`~mrsimulator.utils.spectral_fitting.make_LMFIT_params` for a quick setup of the fitting parameters. .. GENERATED FROM PYTHON SOURCE LINES 140-143 .. code-block:: Python params = sf.make_LMFIT_params(sim, processor, include={"rotor_frequency"}) print(params.pretty_print(columns=["value", "min", "max", "vary", "expr"])) .. rst-class:: sphx-glr-script-out .. code-block:: none Name Value Min Max Vary Expr SP_0_operation_1_Gaussian_FWHM 300 -inf inf True None SP_0_operation_3_Scale_factor 500 -inf inf True None mth_0_rotor_frequency 1.525e+04 1.515e+04 1.535e+04 True None sys_0_abundance 50 0 100 True None sys_0_site_0_isotropic_chemical_shift 76 -inf inf True None sys_0_site_0_quadrupolar_Cq 6e+06 -inf inf True None sys_0_site_0_quadrupolar_eta 0 0 1 True None sys_1_abundance 50 0 100 False 100-sys_0_abundance sys_1_site_0_isotropic_chemical_shift 1 -inf inf True None sys_1_site_0_quadrupolar_Cq 5e+05 -inf inf True None sys_1_site_0_quadrupolar_eta 0.3 0 1 True None None .. GENERATED FROM PYTHON SOURCE LINES 144-145 **Solve the minimizer using LMFIT** .. GENERATED FROM PYTHON SOURCE LINES 145-155 .. code-block:: Python opt = sim.optimize() # Pre-compute transition pathways minner = Minimizer( sf.LMFIT_min_function, params, fcn_args=(sim, processor, sigma), fcn_kws={"opt": opt}, ) result = minner.minimize() result .. raw:: html

Fit Result



.. GENERATED FROM PYTHON SOURCE LINES 156-158 The best fit solution --------------------- .. GENERATED FROM PYTHON SOURCE LINES 158-173 .. code-block:: Python best_fit = sf.bestfit(sim, processor)[0].real residuals = sf.residuals(sim, processor)[0].real # Plot the spectrum plt.figure(figsize=(8, 4)) ax = plt.subplot(projection="csdm") ax.plot(experiment, color="black", linewidth=0.5, label="Experiment") ax.plot(residuals, color="gray", linewidth=0.5, label="Residual") ax.plot(best_fit, linewidth=2, alpha=0.6) ax.set_xlim(1200, -1200) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_004.png :alt: plot 4 27Al YAG :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_27Al_YAG_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 174-178 .. [#f1] D.Massiot, F.Fayon, M.Capron, I.King, S.Le Calvé, B.Alonso, J.O.Durand, B.Bujoli, Z.Gan, G.Hoatson, 'Modelling one and two-dimensional solid-state NMR spectra.', Magn. Reson. Chem. **40** 70-76 (2002) `DOI: 10.1002/mrc.984 `_ .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 11.504 seconds) .. _sphx_glr_download_fitting_1D_fitting_plot_4_27Al_YAG.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_4_27Al_YAG.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_4_27Al_YAG.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_