.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "fitting/1D_fitting/plot_1_31p_Na2PO4_static.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_1_31p_Na2PO4_static.py: ³¹P static NMR of crystalline Na2PO4 (CSA) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 7-11 The following is a CSA static least-squares fitting example of a :math:`^{31}\text{P}` MAS NMR spectrum of :math:`\text{Na}_{2}\text{PO}_{4}`. 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, SpinSystem, Site 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 = "31P Phophonate Static.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=(4.25, 3.0)) ax = plt.subplot(projection="csdm") ax.plot(experiment, color="black", linewidth=0.5, label="Experiment") ax.set_xlim(200, -200) plt.grid() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_001.png :alt: plot 1 31p Na2PO4 static :srcset: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_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(coords < -110e-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_1_31p_Na2PO4_static_002.png :alt: Noise section :srcset: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none (, ) .. GENERATED FROM PYTHON SOURCE LINES 65-68 Create a fitting model ---------------------- **Spin System** .. GENERATED FROM PYTHON SOURCE LINES 68-76 .. code-block:: Python P_31 = Site( isotope="31P", isotropic_chemical_shift=5.0, # in ppm, shielding_symmetric=SymmetricTensor(zeta=-80, eta=0.5), # zeta in Hz ) spin_systems = [SpinSystem(sites=[P_31])] .. GENERATED FROM PYTHON SOURCE LINES 77-78 **Method** .. GENERATED FROM PYTHON SOURCE LINES 78-91 .. code-block:: Python # Get the spectral dimension parameters from the experiment. spectral_dims = get_spectral_dimensions(experiment) static1D = BlochDecaySpectrum( channels=["31P"], magnetic_flux_density=9.395, # in T rotor_frequency=0, # in Hz rotor_angle=0, # in rads spectral_dimensions=spectral_dims, experiment=experiment, # experimental dataset ) .. GENERATED FROM PYTHON SOURCE LINES 92-93 **Guess Model Spectrum** .. GENERATED FROM PYTHON SOURCE LINES 93-124 .. code-block:: Python # Simulation # ---------- sim = Simulator(spin_systems=spin_systems, methods=[static1D]) sim.run() # Post Simulation Processing # -------------------------- processor = sp.SignalProcessor( operations=[ sp.IFFT(), sp.apodization.Gaussian(FWHM="3000 Hz"), sp.FFT(), sp.Scale(factor=40000), ] ) processed_dataset = processor.apply_operations(dataset=sim.methods[0].simulation).real # Plot of the guess Spectrum # -------------------------- plt.figure(figsize=(4.25, 3.0)) ax = plt.subplot(projection="csdm") ax.plot(experiment, color="black", linewidth=0.5, label="Experiment") ax.plot(processed_dataset, linewidth=2, alpha=0.6, label="Guess Spectrum") ax.set_xlim(200, -200) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_003.png :alt: plot 1 31p Na2PO4 static :srcset: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 125-129 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 129-133 .. code-block:: Python params = sf.make_LMFIT_params(sim, processor) params.pop("sys_0_abundance") 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 3000 -inf inf True None SP_0_operation_3_Scale_factor 4e+04 -inf inf True None sys_0_site_0_isotropic_chemical_shift 5 -inf inf True None sys_0_site_0_shielding_symmetric_eta 0.5 0 1 True None sys_0_site_0_shielding_symmetric_zeta -80 -inf inf True None None .. GENERATED FROM PYTHON SOURCE LINES 134-135 **Solve the minimizer using LMFIT** .. GENERATED FROM PYTHON SOURCE LINES 135-145 .. 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 146-148 The best fit solution --------------------- .. GENERATED FROM PYTHON SOURCE LINES 148-163 .. code-block:: Python best_fit = sf.bestfit(sim, processor)[0].real residuals = sf.residuals(sim, processor)[0].real # Plot the spectrum plt.figure(figsize=(4.25, 3.0)) 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, label="Best Fit") ax.set_xlim(200, -200) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_004.png :alt: plot 1 31p Na2PO4 static :srcset: /fitting/1D_fitting/images/sphx_glr_plot_1_31p_Na2PO4_static_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 164-168 .. [#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 2.157 seconds) .. _sphx_glr_download_fitting_1D_fitting_plot_1_31p_Na2PO4_static.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_1_31p_Na2PO4_static.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_1_31p_Na2PO4_static.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_