.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "fitting/1D_fitting/plot_2_13C_glycine_960Hz.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_2_13C_glycine_960Hz.py: ¹³C MAS NMR of Glycine (CSA) [960 Hz] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 7-11 The following is a sideband least-squares fitting example of a :math:`^{13}\text{C}` MAS NMR spectrum of Glycine spinning at 960 Hz. 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-23 .. 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 .. GENERATED FROM PYTHON SOURCE LINES 25-27 Import the dataset ------------------ .. GENERATED FROM PYTHON SOURCE LINES 27-46 .. code-block:: Python host = "https://nmr.cemhti.cnrs-orleans.fr/Dmfit/Help/csdm/" filename = "13C MAS 960Hz - Glycine.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(280, -10) plt.grid() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_001.png :alt: plot 2 13C glycine 960Hz :srcset: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 47-48 Estimate noise statistics from the dataset .. GENERATED FROM PYTHON SOURCE LINES 48-63 .. code-block:: Python coords = experiment.dimensions[0].coordinates noise_region = np.where(coords < 10e-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_2_13C_glycine_960Hz_002.png :alt: Noise section :srcset: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none (, ) .. GENERATED FROM PYTHON SOURCE LINES 64-67 Create a fitting model ---------------------- **Spin System** .. GENERATED FROM PYTHON SOURCE LINES 67-80 .. code-block:: Python C1 = Site( isotope="13C", isotropic_chemical_shift=176.0, # in ppm shielding_symmetric={"zeta": 70, "eta": 0.6}, # zeta in Hz ) C2 = Site( isotope="13C", isotropic_chemical_shift=43.0, # in ppm shielding_symmetric={"zeta": 30, "eta": 0.5}, # zeta in Hz ) spin_systems = [SpinSystem(sites=[C1], name="C1"), SpinSystem(sites=[C2], name="C2")] .. GENERATED FROM PYTHON SOURCE LINES 81-82 **Method** .. GENERATED FROM PYTHON SOURCE LINES 82-93 .. code-block:: Python # Get the spectral dimension parameters from the experiment. spectral_dims = get_spectral_dimensions(experiment) MAS = BlochDecaySpectrum( channels=["13C"], magnetic_flux_density=7.05, # in T rotor_frequency=960, # in Hz spectral_dimensions=spectral_dims, experiment=experiment, # experimental dataset ) .. GENERATED FROM PYTHON SOURCE LINES 94-95 **Guess Model Spectrum** .. GENERATED FROM PYTHON SOURCE LINES 95-127 .. 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.Exponential(FWHM="20 Hz", dv_index=0), # spin system 0 sp.apodization.Exponential(FWHM="200 Hz", dv_index=1), # spin system 1 sp.FFT(), sp.Scale(factor=1000), ] ) 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(280, -10) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_003.png :alt: plot 2 13C glycine 960Hz :srcset: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 128-132 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 132-135 .. 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_Exponential_FWHM 20 -inf inf True None SP_0_operation_2_Exponential_FWHM 200 -inf inf True None SP_0_operation_4_Scale_factor 1000 -inf inf True None mth_0_rotor_frequency 960 860 1060 True None sys_0_abundance 50 0 100 True None sys_0_site_0_isotropic_chemical_shift 176 -inf inf True None sys_0_site_0_shielding_symmetric_eta 0.6 0 1 True None sys_0_site_0_shielding_symmetric_zeta 70 -inf inf True None sys_1_abundance 50 0 100 False 100-sys_0_abundance sys_1_site_0_isotropic_chemical_shift 43 -inf inf True None sys_1_site_0_shielding_symmetric_eta 0.5 0 1 True None sys_1_site_0_shielding_symmetric_zeta 30 -inf inf True None None .. GENERATED FROM PYTHON SOURCE LINES 136-137 **Solve the minimizer using LMFIT** .. GENERATED FROM PYTHON SOURCE LINES 137-147 .. code-block:: Python opt = sim.optimize() 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 148-150 The best fit solution --------------------- .. GENERATED FROM PYTHON SOURCE LINES 150-165 .. code-block:: Python best_fit = sf.bestfit(sim, processor)[0].real residuals = sf.residuals(sim, processor)[0].real 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(280, -10) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_004.png :alt: plot 2 13C glycine 960Hz :srcset: /fitting/1D_fitting/images/sphx_glr_plot_2_13C_glycine_960Hz_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 166-170 .. [#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 4.354 seconds) .. _sphx_glr_download_fitting_1D_fitting_plot_2_13C_glycine_960Hz.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_2_13C_glycine_960Hz.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_2_13C_glycine_960Hz.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_