Difference between revisions of "ScatterSim:Examples:002Lattice"
KevinYager (talk | contribs) |
|||
(4 intermediate revisions by the same user not shown) | |||
Line 10: | Line 10: | ||
import numpy as np | import numpy as np | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
+ | |||
+ | # Let's use our polydisperse sphere nanoobject since it's more realistic | ||
+ | # In general though, you'll want to start with simpler objects to reduce computation time | ||
+ | # but this one should be okay... | ||
+ | pargs_polysphere = dict(radius= 1, sigma_R=.04) | ||
+ | |||
+ | polysphere = PolydisperseNanoObject(SphereNanoObject, pargs_polysphere, argname='radius', argstdname='sigma_R') | ||
+ | |||
+ | # The peak shape | ||
+ | # delta is sigma of a Gaussian, and nu is FWHM of a Lorentzian | ||
+ | # Generally, you'll want to keep one zero and vary the other (to get a Gaussian or Lorentzian) | ||
+ | # but when finalizing a fit, you may want to play with intermediate values | ||
+ | peak = PeakShape(delta=0.03, nu=0.01) | ||
+ | |||
+ | # now define your lattices | ||
+ | # lattices, to first order are just defined by 6 parameters: | ||
+ | # lattice_spacing_a, lattice_spacing_b and lattice_spacing_c (the unit vector spacings) | ||
+ | # alpha, beta, gamma (the angles the unit vectors make with the axes) | ||
+ | # We'll deal with simple lattices, so all unit vectors are aligned with x, y and z axes, and same length | ||
+ | lattice_spacing = 10. # 10 times radius (1 nm) | ||
+ | sigma_D = .06 # add a Debye-Waller factor | ||
+ | lat_sc = SimpleCubic([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) | ||
+ | lat_fcc = FCCLattice([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) | ||
+ | lat_bcc = BCCLattice([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) | ||
+ | lat_diamond = DiamondTwoParticleLattice([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) | ||
+ | |||
+ | q = np.linspace(.4, 4, 1000) | ||
+ | # Now compute the intensity, it will take some time... | ||
+ | Z0_sc = lat_sc.intensity(q, peak) | ||
+ | Pq_sc = lat_sc.form_factor_squared_isotropic(q) | ||
+ | |||
+ | c_sc = .1 | ||
+ | |||
+ | # note Gq is same for all three here (just depends on sigma_D, it's an exponential decay...) | ||
+ | Gq_sc = lat_sc.G_q(q) | ||
+ | |||
+ | Sq_sc = c_sc*Z0_sc/Pq_sc*Gq_sc + (1-Gq_sc) | ||
+ | |||
+ | print("Finished calculating Simple Cubic") | ||
+ | |||
+ | Z0_fcc = lat_fcc.intensity(q, peak) | ||
+ | Pq_fcc = lat_fcc.form_factor_squared_isotropic(q) | ||
+ | Gq_fcc = lat_fcc.G_q(q) | ||
+ | |||
+ | Sq_fcc = c_sc*Z0_fcc/Pq_fcc*Gq_fcc + (1-Gq_fcc) | ||
+ | |||
+ | print("Finished calculating Face Centered Cubic") | ||
+ | |||
+ | Z0_bcc = lat_bcc.intensity(q, peak) | ||
+ | Pq_bcc = lat_bcc.form_factor_squared_isotropic(q) | ||
+ | Gq_bcc = lat_bcc.G_q(q) | ||
+ | |||
+ | Sq_bcc = c_sc*Z0_bcc/Pq_bcc*Gq_bcc + (1-Gq_bcc) | ||
+ | |||
+ | print("Finished calculating Body Centered Cubic") | ||
+ | Z0_diamond = lat_diamond.intensity(q, peak) | ||
+ | Pq_diamond = lat_diamond.form_factor_squared_isotropic(q) | ||
+ | Gq_diamond = lat_diamond.G_q(q) | ||
+ | |||
+ | Sq_diamond = c_sc*Z0_diamond/Pq_diamond*Gq_diamond + (1-Gq_diamond) | ||
+ | |||
+ | print("Finished calculating Diamond") | ||
+ | plt.figure(0, figsize=(10,8));plt.clf() | ||
+ | plt.subplot(2,2,1) | ||
+ | plt.title("Simple Cubic Structure Factor") | ||
+ | plt.plot(q, Sq_sc) | ||
+ | plt.subplot(2,2,2) | ||
+ | plt.title("Face Centered Cubic Structure Factor") | ||
+ | plt.plot(q, Sq_fcc) | ||
+ | plt.subplot(2,2,3) | ||
+ | plt.title("Body Centered Cubic Structure Factor") | ||
+ | plt.plot(q, Sq_bcc) | ||
+ | plt.subplot(2,2,4) | ||
+ | plt.title("Diamond Structure Factor") | ||
+ | plt.plot(q, Sq_diamond) | ||
</source> | </source> | ||
+ | [[File:ScatterSimExamples-002-fig1.png]] | ||
+ | <source lang='python'> | ||
+ | # Same, but loglog plot (sometimes easier to see) | ||
+ | |||
+ | plt.figure(1, figsize=(10,8));plt.clf() | ||
+ | plt.subplot(2,2,1) | ||
+ | plt.title("Simple Cubic Structure Factor") | ||
+ | plt.loglog(q, Sq_sc) | ||
+ | plt.subplot(2,2,2) | ||
+ | plt.title("Face Centered Cubic Structure Factor") | ||
+ | plt.loglog(q, Sq_fcc) | ||
+ | plt.subplot(2,2,3) | ||
+ | plt.title("Body Centered Cubic Structure Factor") | ||
+ | plt.loglog(q, Sq_bcc) | ||
+ | plt.subplot(2,2,4) | ||
+ | plt.title("Diamond Structure Factor") | ||
+ | plt.loglog(q, Sq_diamond) | ||
− | + | </source> | |
+ | [[File:ScatterSimExamples-002-fig2.png]] |
Latest revision as of 11:01, 30 March 2017
# The next step is creating a lattice from ScatterSim.NanoObjects import SphereNanoObject, PolydisperseNanoObject # We'll import a few lattices, cubic, FCC, BCC and Diamond from ScatterSim.LatticeObjects import SimpleCubic, FCCLattice, BCCLattice, DiamondTwoParticleLattice # import the peak shape for the peaks, tunable from ScatterSim.PeakShape import PeakShape import numpy as np import matplotlib.pyplot as plt # Let's use our polydisperse sphere nanoobject since it's more realistic # In general though, you'll want to start with simpler objects to reduce computation time # but this one should be okay... pargs_polysphere = dict(radius= 1, sigma_R=.04) polysphere = PolydisperseNanoObject(SphereNanoObject, pargs_polysphere, argname='radius', argstdname='sigma_R') # The peak shape # delta is sigma of a Gaussian, and nu is FWHM of a Lorentzian # Generally, you'll want to keep one zero and vary the other (to get a Gaussian or Lorentzian) # but when finalizing a fit, you may want to play with intermediate values peak = PeakShape(delta=0.03, nu=0.01) # now define your lattices # lattices, to first order are just defined by 6 parameters: # lattice_spacing_a, lattice_spacing_b and lattice_spacing_c (the unit vector spacings) # alpha, beta, gamma (the angles the unit vectors make with the axes) # We'll deal with simple lattices, so all unit vectors are aligned with x, y and z axes, and same length lattice_spacing = 10. # 10 times radius (1 nm) sigma_D = .06 # add a Debye-Waller factor lat_sc = SimpleCubic([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) lat_fcc = FCCLattice([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) lat_bcc = BCCLattice([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) lat_diamond = DiamondTwoParticleLattice([polysphere], lattice_spacing_a=lattice_spacing, sigma_D=sigma_D) q = np.linspace(.4, 4, 1000) # Now compute the intensity, it will take some time... Z0_sc = lat_sc.intensity(q, peak) Pq_sc = lat_sc.form_factor_squared_isotropic(q) c_sc = .1 # note Gq is same for all three here (just depends on sigma_D, it's an exponential decay...) Gq_sc = lat_sc.G_q(q) Sq_sc = c_sc*Z0_sc/Pq_sc*Gq_sc + (1-Gq_sc) print("Finished calculating Simple Cubic") Z0_fcc = lat_fcc.intensity(q, peak) Pq_fcc = lat_fcc.form_factor_squared_isotropic(q) Gq_fcc = lat_fcc.G_q(q) Sq_fcc = c_sc*Z0_fcc/Pq_fcc*Gq_fcc + (1-Gq_fcc) print("Finished calculating Face Centered Cubic") Z0_bcc = lat_bcc.intensity(q, peak) Pq_bcc = lat_bcc.form_factor_squared_isotropic(q) Gq_bcc = lat_bcc.G_q(q) Sq_bcc = c_sc*Z0_bcc/Pq_bcc*Gq_bcc + (1-Gq_bcc) print("Finished calculating Body Centered Cubic") Z0_diamond = lat_diamond.intensity(q, peak) Pq_diamond = lat_diamond.form_factor_squared_isotropic(q) Gq_diamond = lat_diamond.G_q(q) Sq_diamond = c_sc*Z0_diamond/Pq_diamond*Gq_diamond + (1-Gq_diamond) print("Finished calculating Diamond") plt.figure(0, figsize=(10,8));plt.clf() plt.subplot(2,2,1) plt.title("Simple Cubic Structure Factor") plt.plot(q, Sq_sc) plt.subplot(2,2,2) plt.title("Face Centered Cubic Structure Factor") plt.plot(q, Sq_fcc) plt.subplot(2,2,3) plt.title("Body Centered Cubic Structure Factor") plt.plot(q, Sq_bcc) plt.subplot(2,2,4) plt.title("Diamond Structure Factor") plt.plot(q, Sq_diamond)
# Same, but loglog plot (sometimes easier to see) plt.figure(1, figsize=(10,8));plt.clf() plt.subplot(2,2,1) plt.title("Simple Cubic Structure Factor") plt.loglog(q, Sq_sc) plt.subplot(2,2,2) plt.title("Face Centered Cubic Structure Factor") plt.loglog(q, Sq_fcc) plt.subplot(2,2,3) plt.title("Body Centered Cubic Structure Factor") plt.loglog(q, Sq_bcc) plt.subplot(2,2,4) plt.title("Diamond Structure Factor") plt.loglog(q, Sq_diamond)