.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "fitting/1D_fitting/plot_4_2H_quad.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_2H_quad.py: ²H MAS NMR of Methionine ^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 7-10 The following is a least-squares fitting example of a :math:`^{2}\text{H}` MAS NMR spectrum of Methionine. The experimental dataset is a part of DMFIT [#f1]_ examples. We thank Dr. Dominique Massiot for sharing the dataset. .. GENERATED FROM PYTHON SOURCE LINES 10-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 from mrsimulator.spin_system.tensors import SymmetricTensor .. 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 = "2H methiodine MAS.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(600, -700) plt.grid() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_001.png :alt: plot 4 2H quad :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_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(np.logical_and(coords > -250e-6, coords < -210e-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_2H_quad_002.png :alt: Noise section :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_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-75 .. code-block:: Python H_2 = Site( isotope="2H", isotropic_chemical_shift=-57.12, # in ppm, quadrupolar=SymmetricTensor(Cq=3e4, eta=0.0), # Cq in Hz ) spin_systems = [SpinSystem(sites=[H_2])] .. GENERATED FROM PYTHON SOURCE LINES 76-77 **Method** .. GENERATED FROM PYTHON SOURCE LINES 77-90 .. code-block:: Python # Get the spectral dimension parameters from the experiment. spectral_dims = get_spectral_dimensions(experiment) MAS = BlochDecaySpectrum( channels=["2H"], magnetic_flux_density=9.395, # in T rotor_frequency=4517.1, # in Hz spectral_dimensions=spectral_dims, experiment=experiment, # experimental dataset ) .. GENERATED FROM PYTHON SOURCE LINES 91-92 **Guess Model Spectrum** .. GENERATED FROM PYTHON SOURCE LINES 92-123 .. code-block:: Python # Simulation # ---------- sim = Simulator(spin_systems=spin_systems, methods=[MAS]) sim.run() # Post Simulation Processing # -------------------------- processor = sp.SignalProcessor( operations=[ sp.IFFT(), sp.apodization.Exponential(FWHM="60 Hz"), sp.FFT(), sp.Scale(factor=1400), ] ) 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(600, -700) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_003.png :alt: plot 4 2H quad :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 124-128 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 128-132 .. code-block:: Python params = sf.make_LMFIT_params(sim, processor) params["sys_0_site_0_isotropic_chemical_shift"].vary = False 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 60 -inf inf True None SP_0_operation_3_Scale_factor 1400 -inf inf True None sys_0_abundance 100 0 100 False 100 sys_0_site_0_isotropic_chemical_shift -57.12 -inf inf False None sys_0_site_0_quadrupolar_Cq 3e+04 -inf inf True None sys_0_site_0_quadrupolar_eta 0 0 1 True None None .. GENERATED FROM PYTHON SOURCE LINES 133-134 **Solve the minimizer using LMFIT** .. GENERATED FROM PYTHON SOURCE LINES 134-144 .. 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 145-147 The best fit solution --------------------- .. GENERATED FROM PYTHON SOURCE LINES 147-162 .. 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(600, -700) plt.grid() plt.legend() plt.tight_layout() plt.show() .. image-sg:: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_004.png :alt: plot 4 2H quad :srcset: /fitting/1D_fitting/images/sphx_glr_plot_4_2H_quad_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 163-167 .. [#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 3.012 seconds) .. _sphx_glr_download_fitting_1D_fitting_plot_4_2H_quad.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_2H_quad.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_4_2H_quad.py ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_