download the cu.py python script and the copper.cif file. Put those files in the same folder. You can run your first MsSpec calculation by typing in a terminal:
+
$pythoncu.py
+
+
+
Here is the content of the script file:
1fromase.ioimportread2frommsspec.calculatorimportMSSPEC3
@@ -816,12 +821,14 @@ Building atomic systems, structures… is pretty straightforward:
Based on the previous *.cif file, create a new cluster without the deepest plane and run the same calculation for the same emitter
Note
+
Use the cluster.edit() method to interactively remove atoms…
As the cluster will contain fewer atoms, the emitter index will be different
MsSpec is a Fortran code with two components: Phagen (Written by R. Natoli) and Spec (written by D. Sébilleau). Phagen computes the phase shifts of the electronic wave propagating in the matter on a spherical harmonics basis. Spec uses those phase shifts to compute the multiple scattering process and simulate the intensity of different electronic spectroscopies.
+
In the most recent version of MsSpec, the program is interfaced with python (https://msspec.cnrs.fr/), allowing for much more flexibility and interplay with other simulation techniques.
ASE is a set of tools and Python modules for setting up, manipulating, running, visualizing and analyzing atomistic simulations.
+Building atomic systems, structures… is pretty straightforward:
+
+
+
# To build a molecule with ASE
+fromase.buildimportmolecule
+# To view
+fromase.visualizeimportview
+
+# Create a water molecule
+water=molecule('H2O')
+# Display it
+view(water)
+
MsSpec can simulate different electronic spectroscopies like PED, AED, LEED, EXAFS, APECS and more will be included in the forthcoming version. However, it is really well-suited for PhotoElectron Diffraction simulation, and the python interface is only fully available for it at the moment. Since PED covers all the MsSpec features and concepts, we will focus on this technique.
+
There are typically 3 steps to follow to get a result with MsSpec:
download the cu.py python script and the copper.cif file. Put those files in the same folder. You can run your first MsSpec calculation by typing in a terminal:
9# The "emitter" atom is located in the middle of the 3rd plane
+10cluster.emitter=10
+11
+12# Create a "calculator"
+13calc=MSSPEC(spectroscopy='PED',algorithm='inversion')
+14calc.set_atoms(cluster)
+15
+16data=calc.get_theta_scan(level='2p3/2')
+17
+18# Plot the result with the interactive GUI
+19data.view()
+20
+21# Or plot using matplotlib directly
+22frommatplotlibimportpyplotasplt
+23data[0].views[0].plot()
+24plt.show()
+
Based on the previous *.cif file, create a new cluster without the deepest plane and run the same calculation for the same emitter
+
+
Note
+
Use the cluster.edit() method to interactively remove atoms…
+
As the cluster will contain fewer atoms, the emitter index will be different
+
+
What do you conclude ?
+
+
+
The number of atoms used for the calculation greatly impact the calculation time and memory. Most of the time, a cluster is shaped as an hemisphere to minimize the number of atoms to take into account
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity02/Activity02.html b/msspecbook/_build/html/Activity02/Activity02.html
index 3bc9efd..c5f718b 100644
--- a/msspecbook/_build/html/Activity02/Activity02.html
+++ b/msspecbook/_build/html/Activity02/Activity02.html
@@ -32,7 +32,7 @@
-
+
@@ -381,7 +381,7 @@ The idea is to use low energy photoelectron diffraction to see the substitution
Let’s start by building the cluster. You can copy/paste directly the code from this page to your text editor or you can download the script SbAg.py. You will also need the data.txt file.
1fromase.buildimportbulk 2fromase.visualizeimportview 3
@@ -1409,7 +1409,8 @@ The idea is to use low energy photoelectron diffraction to see the substitution
To model a spectroscopy experiment, some parameters need to be correctly defined. In MsSpec, parameters are grouped in different categories (detector_parameters, source_parameters, calculation_parameters…). Each category is an attribute of your calculator object and contains different parameters.
+For example, to define the angle of the incoming light with respect to the sample normal direction, you will use
+
# (assuming your calculator variable is calc)
+# e.g: Incoming X-Ray light is 30° from the sample normal
+calc.source_parameters.theta=30
+
+
+
+
Sb-induced smooth growth of Ag on Ag(111) example#
+
To see how some parameters - not related to the cluster shape - may change the results, we will look at the effect of two parameters:
+
+
The source direction
+
The inner potential of the sample
+
+
The inner potential is material specific. It will add to the photoelectron kinetic energy inside the material. When the photoelectron escapes the sample, this internal potential is missing and this will create an energy step that will act as a refraction for the photoelectron intensity. The effect will be significant for large polar angles and for small kinetic energy of the photoelectron.
+
Let’s look at the effect of those parameters on the following example.
+The idea is to use low energy photoelectron diffraction to see the substitution of Ag by Sb atoms on the surface plane.
Let’s start by building the cluster. You can copy/paste directly the code from this page to your text editor or you can download the script SbAg.py. You will also need the data.txt file.
+
1fromase.buildimportbulk
+ 2fromase.visualizeimportview
+ 3
+ 4frommsspec.calculatorimportMSSPEC
+ 5frommsspec.utilsimporthemispherical_cluster,get_atom_index,cut_plane
+ 6importnumpyasnp
+ 7frommatplotlibimportpyplotasplt
+ 8
+ 9# Create the silver cell
+10Ag=bulk('Ag',cubic=True)
+11# Orientate the cell in the [111] direction
+12Ag.rotate((1,1,1),(0,0,1),rotate_cell=True)
+13# Align the azimuth to match experimental reference
+14Ag.rotate(15,'z',rotate_cell=True)
+15
+16# Create a cluster
+17cluster=hemispherical_cluster(Ag,diameter=20,emitter_plane=0)
+18cluster=cut_plane(cluster,z=-4.8)
+19cluster.emitter=get_atom_index(cluster,0,0,0)
+20cluster[cluster.emitter].symbol='Sb'
+
Azimuthal (\(\phi\)) scan for Sb(4d) emitter in the top layer of Ag(111) at 45 eV kinetic energy.#
+
+
+
The agreement is not satisfactory although most of the features may be identified.
+
+
+
+
Try to change the source direction and the inner potential of Ag to better match the experiment…
+
+
Note
+
The cluster is smaller than it should for size convergence, but the calculation would take too much memory for this example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity03/Activity03.html b/msspecbook/_build/html/Activity03/Activity03.html
index 3f0f55d..5f3b12c 100644
--- a/msspecbook/_build/html/Activity03/Activity03.html
+++ b/msspecbook/_build/html/Activity03/Activity03.html
@@ -32,7 +32,7 @@
-
+
@@ -511,7 +511,8 @@ document.write(`
How large is the backscattering factor of Rhodium with respect to that of Oxygen ?
-
+
+
Solution…
# Compute the scattering factordata=calc.get_scattering_factors(kinetic_energy=723)
@@ -543,7 +544,7 @@ document.write(`
-
Complete the script below to compute the (\(\theta,\phi\)) scan of the photodiffraction of O(1s) adsorbed on a fcc site on Rh(111) surface.
+
Complete the script below to compute the (\(\theta,\phi\)) scan of the photodiffraction of O(1s) adsorbed on a fcc site on Rh(111) surface.
1frommsspec.calculatorimportMSSPEC 2fromase.buildimportfcc111,add_adsorbate 3importnumpyasnp
@@ -573,7 +574,8 @@ document.write(`
What is the bond length difference between to intensity maxima ?
Activity 3: Adsorbates and the single scattering approach
+
+
+
+
+
+
Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
Activity 3: Adsorbates and the single scattering approach#
+
Photoelectron diffraction is widely used to study the adsorption of atoms or molecules on a crystalline surface. Photoelectrons from adsorbates are scattered by the underlying surface, carrying information about the adsorption site, bond length and/or molecule orientation…. Thanks to a simulation, such information becomes quantitative with a high degree of accuracy.
+
Calculations of the multiple scattering using matrix inversion have the great advantage of being exact, including all scattering paths. On the other hand, memory consumption soon becomes a problem as the kinetic energy and number of atoms to be considered increase. As an approximation, it is possible to only consider a single scattering from the emitter to any atom in the cluster. This approximation is extremely computationally fast and can give satisfactory results for adsorbates. We’ll see later that this approach is rather too simplistic for most cases.
In a paper published in 1998, T. Gerber et al. used the quite high backscattering factor of Rhodium atoms to probe the distance of Oxygen atoms adsorbed on a Rhodium surface. Some electrons coming from Oxygen atoms are ejected toward the Rhodium surface. They are then backscattered and interfere with the direct signal comming from Oxygen atoms (see the figure below). They demonstrated both experimentally and numerically with a sinle scattering computation that this lead to a very accurate probe of adsorbed species that can be sensitive to bond length changes of the order of \(\pm 0.02 \mathring{A}\).
To illustrate that photoelectrons emitted by Oxygen adsorbates towards the Rhodium surface can be backscattered, we will start by computing the scattering factor for both O and Rh atoms.
+
+
+
+
By using the Atoms class of the ase package, try to build a O-Rh chain where atoms are 4 Å apart. Here is the begining of the script. Try to complete the line of code and view your two-atoms chain.
+
fromaseimportAtoms
+fromase.visualizeimportview
+
+# Create an atomic chain O-Rh
+cluster=Atoms(...# Fill this line
+
We will compute for different values of the adsorption height \(z_0\).
+
+
+
+
Complete the script below to compute the (\(\theta,\phi\)) scan of the photodiffraction of O(1s) adsorbed on a fcc site on Rh(111) surface.
+
1frommsspec.calculatorimportMSSPEC
+ 2fromase.buildimportfcc111,add_adsorbate
+ 3importnumpyasnp
+ 4
+ 5data=None
+ 6all_z=...# -> Define a list of z values for the adsorbate
+ 7
+ 8for...# -> Complete this for-loop over z values
+ 9# construct the cluster
+10cluster=fcc111('Rh',size=(2,2,1))
+11cluster.pop(3)
+12add_adsorbate(...# -> Put the oxygen atom on the fcc site
+13cluster.emitter=...# -> Oxygen is the last atom we added, so the indice is...
+14
+15# Define a calculator for single scattering calculations
+16calc=MSSPEC(spectroscopy='PED',algorithm='expansion')
+17calc.calculation_parameters.scattering_order=1
+18calc.set_atoms(cluster)
+19
+20# Compute
+21data=calc.get_theta_phi_scan(level='1s',kinetic_energy=723,data=data)
+22
+23data.view()
+
+
+
As proposed in the comments, add a loop to vary the adsorption height of Oxygen between 1.10 and 1.65 Å.
+What is the bond length difference between to intensity maxima ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity04/Activity04.html b/msspecbook/_build/html/Activity04/Activity04.html
index 71c0c1e..ee08018 100644
--- a/msspecbook/_build/html/Activity04/Activity04.html
+++ b/msspecbook/_build/html/Activity04/Activity04.html
@@ -32,7 +32,7 @@
-
+
@@ -357,9 +357,9 @@ document.write(`
Activity 4: From single scattering to multiple scattering#
-
In the previous activity, we saw that simple single scattering calculations (SSC) can be used to simulate photodiffraction diagrams with good accuracy. The approximation works fine when the emitting atom is very close to the surface.
+
In the previous activity, we saw that simple single scattering calculations (SSC) can be used to simulate photodiffraction diagrams with good accuracy. The approximation works fine when the emitting atom is very close to the surface.
However, the SSC approach is no longer suitable for deeper emitter atoms, where multiple scattering effects come into play. In this activity, we will focus on a major consequence of multiple scattering: the defocusing effect.
-
The defocusing effect is presented in the figure below for a chain of nickel atoms. Although purely illustrative, understanding multiple scattering in atomic chains is fundamental because they are found in many situations, such as in particular directions of a crystal or in molecules of various lengths.
+
The defocusing effect is presented in the figure below for a chain of nickel atoms. Although purely illustrative, understanding multiple scattering in atomic chains is fundamental because they are found in many situations, such as in particular directions of a crystal or in molecules of various lengths.
@@ -367,7 +367,7 @@ However, the SSC approach is no longer suitable for deeper emitter atoms, where
Fig. 10 The defocusing effect dur to multiple scattering in an atomic chain of Ni atoms.#
-
In 1989, M.-L Xu, J.J. Barton and M.A. Van Hove studied these multiple scattering effects on atomic chains (see their paper below).
+
In 1989, M.-L Xu, J.J. Barton and M.A. Van Hove studied these multiple scattering effects on atomic chains (see their paper below).
In the spirit of figure 3 of their paper, we will create 3 atomic chains of Ni atoms (2, 3 and 5 atoms) tilted by 45° and we will compare the intensity of the forward scattering peak for single scattering and for full multiple scattering.
See also
@@ -381,7 +381,7 @@ In the spirit of figure 3 of their paper, we will create 3 atomic chains of Ni a
Start by creating a simple chain of 2 Ni atoms: an emitter and a scatterer in the [101] direction.
Tip
-
Nickel is fcc with lattice parameter \(a\)=3.499 Å. Use the Atoms class of ase like in the previous activity…
+
Nickel is fcc with lattice parameter \(a\)=3.499 Å. Use the Atoms class of ase like in the previous activity…
if you need help to start…
frommsspec.calculatorimportMSSPEC
@@ -441,6 +441,32 @@ In the spirit of figure 3 of their paper, we will create 3 atomic chains of Ni a
Fig. 12 Polar scan of a Ni chain of 2-5 atoms for single and full mutliple scattering.#
+
1frommsspec.calculatorimportMSSPEC
+ 2fromaseimportAtoms
+ 3importnumpyasnp
+ 4
+ 5symbol='Ni'# The kind of atom for the chain
+ 6a=3.499*np.sqrt(2)/2# The distance bewteen 2 atoms
+ 7# in [101] direction
+ 8
+ 9chain=Atoms(symbol)
+10data=None
+11foriinrange(1,5):
+12atom=Atoms(symbol,[[0,0,i*a]])
+13atom.rotate('y',45)
+14chain+=atom
+15
+16calc=MSSPEC(spectroscopy='PED',algorithm='inversion')
+17calc.calculation_parameters.scattering_order=1
+18
+19chain.emitter=0
+20calc.set_atoms(chain)
+21
+22data=calc.get_theta_scan(level='3s',theta=np.arange(0,80,0.5),data=data)
+23data[-1].views[0].set_plot_options(ylim=[0,0.045])
+24data.view()
+
Activity 4: From single scattering to multiple scattering
+
+
+
+
+
+
Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
Activity 4: From single scattering to multiple scattering#
+
In the previous activity, we saw that simple single scattering calculations (SSC) can be used to simulate photodiffraction diagrams with good accuracy. The approximation works fine when the emitting atom is very close to the surface.
+However, the SSC approach is no longer suitable for deeper emitter atoms, where multiple scattering effects come into play. In this activity, we will focus on a major consequence of multiple scattering: the defocusing effect.
+
The defocusing effect is presented in the figure below for a chain of nickel atoms. Although purely illustrative, understanding multiple scattering in atomic chains is fundamental because they are found in many situations, such as in particular directions of a crystal or in molecules of various lengths.
The defocusing effect dur to multiple scattering in an atomic chain of Ni atoms.#
+
+
+
In 1989, M.-L Xu, J.J. Barton and M.A. Van Hove studied these multiple scattering effects on atomic chains (see their paper below).
+In the spirit of figure 3 of their paper, we will create 3 atomic chains of Ni atoms (2, 3 and 5 atoms) tilted by 45° and we will compare the intensity of the forward scattering peak for single scattering and for full multiple scattering.
Start by creating a simple chain of 2 Ni atoms: an emitter and a scatterer in the [101] direction.
+
+
Tip
+
Nickel is fcc with lattice parameter \(a\)=3.499 Å. Use the Atoms class of ase like in the previous activity…
+
+
if you need help to start…
+
frommsspec.calculatorimportMSSPEC
+fromaseimportAtoms
+
+symbol=...# The kind of atom for the chain
+a=...# The distance bewteen 2 atoms
+ # in [101] direction
+
+chain=Atoms(...,positions=[...])
+chain.rotate(...)
+chain.edit()
+
+
+
+
+
+
+
+
+
+
Create an MSSPEC calculator with expansion algortithm and set the scattering_order=1 to compute a polar scan of the Ni(3s) in single scattering. How is varying the height of the peak at 45° (along the chain) if you increase the number of atoms in the chain ?
+
Repeat the same experiment with inversion algorithm for having the full multiple scattering result. What do you observe ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity05/Activity05.html b/msspecbook/_build/html/Activity05/Activity05.html
index 48aa649..135c185 100644
--- a/msspecbook/_build/html/Activity05/Activity05.html
+++ b/msspecbook/_build/html/Activity05/Activity05.html
@@ -32,7 +32,7 @@
-
+
@@ -427,23 +427,23 @@ document.write(`
-
Complete the code snipet provided below to create a small TiSe2 cluster with Ti emitter in the 2nd plane:
+
Complete the code snipet provided below (or here) to create a small TiSe2 cluster with Ti emitter in the 2nd plane:
1fromase.buildimportmx2 2fromase.visualizeimportview 3frommsspec.calculatorimportMSSPEC 4frommsspec.utilsimporthemispherical_cluster,get_atom_index 5 6# Some usefull constants (a, c, d, D) for defining the structure
- 7a=...
- 8
+ 7a=...
+ 8 9# Create the TiSe2 trilayer10# use ase help for this function
-11TiSe2=mx2(formula=...)
-12
+11TiSe2=mx2(formula=...)
+1213# The preious cell is 2D, let's define the c-axis to take into account 14# the Van der Waals gap between trilayers
-15TiSe2.cell[2]=[0,0,...]
-16
+15TiSe2.cell[2]=[0,0,...]
+1617# To be aligned like in the paper18TiSe2.rotate(60,'z',rotate_cell=True)19
@@ -453,54 +453,37 @@ document.write(`
23foriinrange(3):24TiSe2[i].tag=i25
-26cluster=hemispherical_cluster(TiSe2,emitter_tag=...,emitter_plane=...,planes=5)
-27cluster.emitter=get_atom_index(cluster,0,0,0)
+26cluster=hemispherical_cluster(TiSe2,emitter_tag=...,emitter_plane=...,planes=5)
+27cluster.emitter=get_atom_index(cluster,0,0,0)2829view(cluster)
-30
fromase.buildimportmx2
-fromase.visualizeimportview
-frommsspec.calculatorimportMSSPEC
-frommsspec.utilsimporthemispherical_cluster,get_atom_index
-
-# Some usefull constants (a, c, d, D) for defining the structure
-a=3.535;c=6.004;d=3.450;D=2.554
-
-# Create the TiSe2 trilayer
-# use ase help for this function
-TiSe2=mx2(formula='TiSe2',kind='1T',a=a,thickness=d,size=(1,1,1),vacuum=None)
-
-# The preious cell is 2D, let's define the c-axis to take into account
-# the Van der Waals gap between trilayers
-TiSe2.cell[2]=[0,0,c]
-
-# To be aligned like in the paper
-TiSe2.rotate(60,'z',rotate_cell=True)
-
-# Since the material is multi-elements, "tag" each inequivalent atom
-# of the unit cell with a number. The "Ti" atom is tagged 0 and "Se"
-# atoms are 1 and 2.
-foriinrange(3):
- TiSe2[i].tag=i
-
-cluster=hemispherical_cluster(TiSe2,emitter_tag=0,emitter_plane=1,planes=5)
-cluster.emitter=get_atom_index(cluster,0,0,0)
+
Activity 5: Multiple scattering in the forward scattering regime
+
+
+
+
+
+
Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
Activity 5: Multiple scattering in the forward scattering regime#
+
In photoelectron diffraction, it is well known that for high photoelectron kinetic energy (typically > 900 eV), the scattering factor is strongly peaked in the forward direction. It means that photoelectrons are almost not deviated after a scattering event.
+
Peaks of intentisity are then usually observed for dense atomic directions of the sample. This is the forward scattering approximation.
+
For such high kinetic energy, multiple scattering is needed to accurately describe the measured intensity, but the matrix inversion algorithm cannot be used since the memory needed for storing the matrix itself would be generally too large. The matrix will contain
+\((N \times (L_{max}+1)^2)^2\) elements of complex type with double precision (64 bits) where \(N\) is the number of atoms and \(L_{max}\) is the number of spherical harmonics used to expand the electron wave around each atomic center. As the kinetic energy increases, the mean free path (MFP) of the photoelectron is larger and the number of atoms in the cluster has to be greater. Lmax also increases with the kinetic energy.
+
+
+
+
Try to evaluate how much memory you would need for this matrix for a hemispherical cluster of copper 15 angströms thick (1 MFP) for \(L_{max} = 25\) ?
importnumpyasnp
+
+# lattice constant of fcc copper
+a=3.6
+# radius of the cluster
+r=15
+# volume of the cluster
+V=.5*(4/3)*np.pi*r**3
+# volume of the cell
+v=a**3
+# number of atoms in the unit cell
+n=4
+# number of atoms in the cluster
+N=int(V/v*n)
+
+Lmax=25
+M=(N*(Lmax+1)**2)**2*2*64/8
+print(f"{N:d} atoms, {M/1e12:.3f} TB")
+
+
+
+
+
606 atoms, 2.685 TB
+
+
+
+
+
+
This is too much memory. We will use another algorithm available in MsSpec: The Rehr-Albers series expansion. We already used that algorithm in activity 3 for the single scattering approach. But this time, we will explore a bit more the effect of the scattering order > 1
Complete the code snipet provided below (or here) to create a small TiSe2 cluster with Ti emitter in the 2nd plane:
+
1fromase.buildimportmx2
+ 2fromase.visualizeimportview
+ 3frommsspec.calculatorimportMSSPEC
+ 4frommsspec.utilsimporthemispherical_cluster,get_atom_index
+ 5
+ 6# Some usefull constants (a, c, d, D) for defining the structure
+ 7a=...
+ 8
+ 9# Create the TiSe2 trilayer
+10# use ase help for this function
+11TiSe2=mx2(formula=...)
+12
+13# The preious cell is 2D, let's define the c-axis to take into account
+14# the Van der Waals gap between trilayers
+15TiSe2.cell[2]=[0,0,...]
+16
+17# To be aligned like in the paper
+18TiSe2.rotate(60,'z',rotate_cell=True)
+19
+20# Since the material is multi-elements, "tag" each inequivalent atom
+21# of the unit cell with a number. The "Ti" atom is tagged 0 and "Se"
+22# atoms are 1 and 2.
+23foriinrange(3):
+24TiSe2[i].tag=i
+25
+26cluster=hemispherical_cluster(TiSe2,emitter_tag=...,emitter_plane=...,planes=5)
+27cluster.emitter=get_atom_index(cluster,0,0,0)
+28
+29view(cluster)
+
Use the line belows to create a calculator and compute a \(\theta\)-\(\phi\) scan of the Ti(2p)
+
# Create a calculator with Rehr-Albers series expansion algorithm
+calc=MSSPEC(spectroscopy='PED',algorithm='expansion')
+calc.set_atoms(cluster)
+
+data=None
+forndifinrange(1,4):
+ calc.calculation_parameters.scattering_order=ndif
+ data=calc.get_theta_phi_scan(level='2p',kinetic_energy=1030,data=data)
+
+data.view()
+
+
+
+
+
+
Compute a scan for an emitter in the first trilayer and in the second trilayer for scattering orders from 1 (single scattering) to 3 in order to complete the figure below.
+What do you conclude about the value of the calc.calculation_parameters.scattering_order ?
\(\theta\)-\(\phi\) scan of Ti(2p) at 1030 eV kinetic energy for an emitter in the first trilayer (left column) and in the second trilayer (right column). Each row correspond to a growing value for the calc.calculation_parameters.scattering_order parameter (from 1 to 5).#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity06/Activity06.html b/msspecbook/_build/html/Activity06/Activity06.html
index 10945cf..f0f55fe 100644
--- a/msspecbook/_build/html/Activity06/Activity06.html
+++ b/msspecbook/_build/html/Activity06/Activity06.html
@@ -32,7 +32,7 @@
-
+
@@ -377,7 +377,7 @@ document.write(`
The create_clusters function will build clusters with increasing number of planes, with the emitter being in the deepest plane for each cluster.
The function compute will compute the azimuthal scan for a given cluster.
-
The analysis function will sum the intensity from each plane for a given temperature. This will be the substrate total signal (more on this in the Activity 7: Large clusters and path filtering section). The function will also compute the anisotropy (equation (1)).
+
The analysis function will sum the intensity from each plane for a given temperature. This will be the substrate total signal (more on this in the Activity 7: Large clusters and path filtering section). The function will also compute the anisotropy (equation ()).
MsSpec can introduce temperature effects in two ways: either by using the Debye Waller model or by doing an average over the phase shifts. We will explore the latter in this example.
Regardless of the option chosen to model temperature effects, we need to define mean square displacement (MSD) values of the atoms in our cluster. We will use the Debye model for this. The MSD is defined as follows:
@@ -389,7 +389,7 @@ document.write(`
-
Fig. 16 Variation of MSD for copper versus temperature using equation (2)#
+
Fig. 16 Variation of MSD for copper versus temperature using equation ()#
@@ -397,7 +397,7 @@ document.write(`
With the help of the MsSpec documentation and the second paragraph p6791 of the article cited above,
-complete the hilighted lines in the following script to compute the anisotropy of Cu(2p) \(\phi\)-scans for polar angle \(\theta\)=45° and 83°.
+complete the hilighted lines in the following script to compute the anisotropy of Cu(2p) \(\phi\)-scans for polar angle \(\theta\)=45° and 83°.
How is varying the anisotropy versus the temperature. How can you qualitatively explain this variation ?
1fromase.buildimportbulk 2importnumpyasnp
@@ -529,7 +529,8 @@ complete the hilighted lines in the following script to compute the anisotropy o
In this example, we will look at the effects of the temperature on the X-Ray photoelectron diffraction from a copper substrate. We will base our python script on a paper published in 1986 by R. Trehan and S. Fadley. In their work, they performed azimutal scans of a copper(001) surface at 2 different polar angles: one at grazing incidence and one at 45° for incresing temperatures from 298K to roughly 1000K.
+
For each azimutal scan, they looked at the anisotropy of the signal, that is:
This value is representative of how clear are the modulations of the signal. They also proposed single scattering calculations that reproduced well these results.
+
We will reproduce this kind of calculations to introduce the parameters that control the vibrational damping.
Since we want to distinguish between bulk (low polar angles, \(\theta = 45°\) in the paper) and surface effects (large polar angles, \(\theta = 83°\) in the paper), we need to compute scans for different emitters and different depths in the cluster.
+
The script contains 3 functions:
+
+
The create_clusters function will build clusters with increasing number of planes, with the emitter being in the deepest plane for each cluster.
+
The function compute will compute the azimuthal scan for a given cluster.
+
The analysis function will sum the intensity from each plane for a given temperature. This will be the substrate total signal (more on this in the Activity 7: Large clusters and path filtering section). The function will also compute the anisotropy (equation ()).
+
+
MsSpec can introduce temperature effects in two ways: either by using the Debye Waller model or by doing an average over the phase shifts. We will explore the latter in this example.
+
Regardless of the option chosen to model temperature effects, we need to define mean square displacement (MSD) values of the atoms in our cluster. We will use the Debye model for this. The MSD is defined as follows:
where \(\hbar\) is the reduce Planck’s constant, \(T\) is the temperature, \(M\) is the mass of the atom, \(k_B\) is the Boltzmann’s constant and \(\Theta_D\) is the Debye temperature of the sample.
+
To get an idea of the typical order of magnitude for MSD, the figure below plots the values of MSD for copper for temperatures ranging from 300 K to 1000 K.
Variation of MSD for copper versus temperature using equation ()#
+
+
+
+
+
+
With the help of the MsSpec documentation and the second paragraph p6791 of the article cited above,
+complete the hilighted lines in the following script to compute the anisotropy of Cu(2p) \(\phi\)-scans for polar angle \(\theta\)=45° and 83°.
+
How is varying the anisotropy versus the temperature. How can you qualitatively explain this variation ?
+
1fromase.buildimportbulk
+ 2importnumpyasnp
+ 3
+ 4frommsspec.calculatorimportMSSPEC,XRaySource
+ 5frommsspec.utilsimporthemispherical_cluster,get_atom_index
+ 6
+ 7defcreate_clusters(nplanes=3):
+ 8copper=bulk('Cu',a=3.6,cubic=True)
+ 9clusters=[]
+ 10foremitter_planeinrange(nplanes):
+ 11cluster=hemispherical_cluster(copper,
+ 12emitter_plane=emitter_plane,
+ 13planes=emitter_plane+1,
+ 14diameter=27,
+ 15shape='cylindrical')
+ 16cluster.absorber=get_atom_index(cluster,0,0,0)
+ 17# This is how to store extra information with your cluster
+ 18cluster.info.update({
+ 19'emitter_plane':emitter_plane,
+ 20})
+ 21clusters.append(cluster)
+ 22returnclusters
+ 23
+ 24
+ 25defcompute(clusters,all_theta=[45.,83.],
+ 26all_T=np.arange(300.,1000.,400.)):
+ 27data=None
+ 28forclusterinclusters:
+ 29# Retrieve emitter's plane from cluster object
+ 30plane=cluster.info['emitter_plane']
+ 31
+ 32calc=MSSPEC(spectroscopy='PED',algorithm='expansion')
+ 33calc.source_parameters.energy=XRaySource.AL_KALPHA
+ 34calc.muffintin_parameters.interstitial_potential=14.1
+ 35
+ 36# In simple scattering, it is common practice to use a real potential and
+ 37# manually define a mean free path arbitrarily lower than the actual physical
+ 38# value in an attempt to reproduce multiple scattering effects.
+ 39calc.tmatrix_parameters.exchange_correlation='x_alpha_real'
+ 40calc.calculation_parameters.mean_free_path=...# -> half of the mean free
+ 41# path (see p6785)
+ 42# Parameters for temperature effects
+ 43calc.calculation_parameters.vibrational_damping='averaged_tl'
+ 44calc.calculation_parameters.use_debye_model=.....# Use the MsSpec help
+ 45calc.calculation_parameters.debye_temperature=...# and p6791 of the paper
+ 46calc.calculation_parameters.vibration_scaling=...# -> How much more do
+ 47# surface atoms vibrate
+ 48# than bulk atoms?
+ 49calc.detector_parameters.average_sampling='low'
+ 50calc.detector_parameters.angular_acceptance=5.7
+ 51
+ 52calc.calculation_parameters.scattering_order=1
+ 53
+ 54
+ 55forTinall_T:
+ 56# Define the sample temperature
+ 57calc.calculation_parameters.temperature=T
+ 58# Set the atoms and compute an azimuthal scan
+ 59calc.set_atoms(cluster)
+ 60data=calc.get_phi_scan(level='2p',theta=all_theta,
+ 61phi=np.linspace(0,100,51),
+ 62kinetic_energy=560,data=data)
+ 63# Small changes to add some details in both the title of the dataset
+ 64# and the figure
+ 65view=data[-1].views[-1]
+ 66t=view._plotopts['title']+f" (plane #{plane:d}, T={T:.0f} K)"
+ 67data[-1].title=t
+ 68view.set_plot_options(autoscale=True,title=t)
+ 69calc.shutdown()
+ 70returndata
+ 71
+ 72
+ 73defanalysis(data,all_theta,all_T,nplanes):
+ 74# Sum cross_section for all emitter's plane at a given T
+ 75# Compute the anisotropy
+ 76results=dict.fromkeys(all_T,[])
+ 77anisotropy=[]
+ 78fordsetindata:
+ 79# Retrieve temperature
+ 80T=float(dset.get_parameter('CalculationParameters','temperature')['value'])
+ 81# Update the sum in results
+ 82iflen(results[T])==0:
+ 83results[T]=dset.cross_section
+ 84else:
+ 85results[T]+=dset.cross_section
+ 86
+ 87anisotropy_dset=data.add_dset("Anisotropies")
+ 88anisotropy_dset.add_columns(temperature=all_T)
+ 89forthetainall_theta:
+ 90col_name=f"theta{theta:.0f}"
+ 91col_values=[]
+ 92i=np.where(dset.theta==theta)[0]
+ 93forTinall_T:
+ 94cs=results[T][i]
+ 95Imax=np.max(cs)
+ 96Imin=np.min(cs)
+ 97A=(Imax-Imin)/Imax
+ 98col_values.append(A)
+ 99anisotropy_dset.add_columns(**{col_name:col_values/np.max(col_values)})
+100
+101
+102anisotropy_view=anisotropy_dset.add_view('Anisotropies',
+103title='Relative anisotropies for Cu(2p)',
+104marker='o',
+105xlabel='T (K)',
+106ylabel=r'$\frac{\Delta I / I_{max}(T)}{\Delta I_{300}'
+107r'/ I_{max}(300)} (\%)$',
+108autoscale=True)
+109forthetainall_theta:
+110col_name=f"theta{theta:.0f}"
+111anisotropy_view.select('temperature',col_name,
+112legend=r'$\theta = {:.0f} \degree$'.format(theta))
+113
+114returndata
+115
+116
+117
+118if__name__=="__main__":
+119nplanes=4
+120all_theta=np.array([45,83])
+121all_theta=np.array([300.,1000.])
+122
+123clusters=create_clusters(nplanes=nplanes)
+124data=compute(clusters,all_T=all_T,all_theta=all_theta)
+125data=analysis(data,all_T=all_T,all_theta=all_theta,nplanes=nplanes)
+126data.view()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity07/Activity07.html b/msspecbook/_build/html/Activity07/Activity07.html
index fe97d2f..16825ee 100644
--- a/msspecbook/_build/html/Activity07/Activity07.html
+++ b/msspecbook/_build/html/Activity07/Activity07.html
@@ -32,7 +32,7 @@
-
+
@@ -369,7 +369,7 @@ document.write(`
Quiz
Create a cluster of Si(001) with the emitter in the subsurface, 40 Å diameter with 2 planes (since atoms below the emitter can be ignored at high kinetic energies).
The following script is almost completed, try to define path filtering options (no backscattering, accept all paths with forward angles < 40° and reject paths longer than the diameter of the cluster).
+
The following script is almost completed, try to define path filtering options (no backscattering, accept all paths with forward angles < 40° and reject paths longer than the diameter of the cluster).
So far you have seen that multiple scattering calculations with MsSpec can use two different algorithms: matrix inversion or Rehr Albers series expansion. When matrix inversion becomes impossible because the kinetic energy is too high and the number of atoms is too large, serial expansion is the alternative. This algorithm requires very little memory but it processes the scattering paths sequentially, which can lead to very long calculation times.
+
In this activity, we will explore how to configure MsSpec to reduce this calculation time to compute the signal from a deep emitter in Si(001).
To fix the idea, we will first evaluate how many scattering paths we need to compute for an emitter in the subsurface (2nd plane) or in the bulk (7th plane) of a Si(001) cluster.
+
+
+
+
Create a cluster of Si(001) with the emitter in the subsurface, 40 Å diameter with 2 planes (since atoms below the emitter can be ignored at high kinetic energies).
As you may expect, not all paths contribute significantly to the total intensity. This is why we can filter out some scattering paths and drastically reduce the computation time. MsSpec offers several filters for this. The 3 most common filters are:
+
+
the forward_scattering filter which allows all paths where each scattering angle is within a cone of defined aperture
+
the backward_scattering filter which is similar to the previous one but for backscattering direction
+
the distance filter which rejects all paths longer than a threshold distance
+
+
The following figure illustrate the effect of theses filters on scattering paths
Some examples of scattering paths with forward_scattering, backward_scattering and distance filters selected. The accepted forward angle is 45°, the accepted backscattering angle is 20° and the threshold distance is \(6a_0\) where \(a_0\) is the lattice parameter. Note that the yellow path is rejected but if the off_cone_events option is set to a value > 1, then it could have been accepted.#
The following script is almost completed, try to define path filtering options (no backscattering, accept all paths with forward angles < 40° and reject paths longer than the diameter of the cluster).
+
1# coding: utf8
+ 2
+ 3importnumpyasnp
+ 4fromase.buildimportbulk
+ 5
+ 6frommsspec.calculatorimportMSSPEC,XRaySource
+ 7frommsspec.iodataimportData
+ 8frommsspec.utilsimporthemispherical_cluster,get_atom_index
+ 9
+10
+11# Create the cluster
+12a=5.43
+13Si=bulk('Si',a=a,cubic=True)
+14cluster=hemispherical_cluster(Si,
+15diameter=30,planes=4,
+16emitter_plane=3,
+17shape='cylindrical',
+18)
+19foratomincluster:
+20atom.set('mean_square_vibration',0.006)
+21atom.set('mt_radius',1.1)
+22cluster.emitter=get_atom_index(cluster,0,0,0)
+23
+24# Create a calculator and set parameters
+25calc=MSSPEC(spectroscopy='PED',algorithm='expansion')
+26
+27calc.source_parameters.energy=XRaySource.AL_KALPHA
+28calc.source_parameters.theta=-54.7
+29calc.source_parameters.phi=90
+30calc.spectroscopy_parameters.final_state=1
+31
+32calc.calculation_parameters.scattering_order=3
+33calc.tmatrix_parameters.tl_threshold=1e-4
+34calc.calculation_parameters.vibrational_damping='averaged_tl'
+35calc.calculation_parameters.RA_cutoff=2
+36
+37# Define path filtering options such that you only
+38# accept scattering paths with a forward cone <= 40°
+39# and whose length are <= cluster diameter
+40#
+41#
+42
+43calc.set_atoms(cluster)
+44
+45# Compute and add previous data for comparison
+46data=calc.get_theta_scan(level='2p',
+47theta=np.arange(-30.,80.,0.5),
+48phi=0,
+49kinetic_energy=1382.28)
+50no_filters=Data.load('path_filtering.hdf5')
+51data[0].add_columns(**{'no_filters':no_filters[0].cross_section})
+52view=data[0].views[0]
+53view.select('theta','cross_section',index=0,legend="With path filtering")
+54view.select('theta','no_filters',legend="Without path filtering")
+55
+56data.view()
+
+
+
+
How long was your calculation ?
+
How does it compare to the calculation with all scattering paths up to order 3 ?
+
What is the proportion of scattering paths of order 3 that were actually taken into account ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity08/Activity08.html b/msspecbook/_build/html/Activity08/Activity08.html
index 45acdc5..e85f416 100644
--- a/msspecbook/_build/html/Activity08/Activity08.html
+++ b/msspecbook/_build/html/Activity08/Activity08.html
@@ -32,7 +32,7 @@
-
+
@@ -354,14 +354,14 @@ document.write(`
Activity 8: Inequivalent emitters and the XPD of a substrate#
-
XPD can be used to study the adsorption of atoms or molecules on surfaces (Activity 3), or atomic substitutions on surfaces (Activity 2). In this case, modeling is relatively straightforward, since only one emitter atom is involved.
-
We have seen from previous examples that, for kinetic energies \(\gtrsim\) 500 eV, the use of Rehr-Albers series expansion and scattering path filtering give access to the intensity of deeper emitter atoms (Activity 7).
+
XPD can be used to study the adsorption of atoms or molecules on surfaces (Activity 3), or atomic substitutions on surfaces (Activity 2). In this case, modeling is relatively straightforward, since only one emitter atom is involved.
+
We have seen from previous examples that, for kinetic energies \(\gtrsim\) 500 eV, the use of Rehr-Albers series expansion and scattering path filtering give access to the intensity of deeper emitter atoms (Activity 7).
This is the key to computing the total photodiffraction signal of a substrate. As emitted photoelectrons originate from highly localized core levels around the atoms, the total signal corresponds to the (incoherent) sum of the intensities of all inequivalent emitters in the probed volume.
Let’s take a look at how this is done on the following example.
In this example, we will compute polar diagrams of an aluminum nitride substrate.
-
In a work published in 1999, Lebedev et al. demonstrated that Photoelectron diffraction can be used as a non invasive tool to unambiguously state the polarity of an AlN surface. Aluminium nitride cristallizes in an hexagonal cell and the authors experimentally showed that the polarity of the surface can be controlled by the annealing temperature during the growth. Both polarities are sketched in the figure below.
+
In a work published in 1999, Lebedev et al. demonstrated that Photoelectron diffraction can be used as a non invasive tool to unambiguously state the polarity of an AlN surface. Aluminium nitride cristallizes in an hexagonal cell and the authors experimentally showed that the polarity of the surface can be controlled by the annealing temperature during the growth. Both polarities are sketched in the figure below.
See also
based on this paper from V. Lebedev et al.
@@ -374,7 +374,7 @@ This is the key to computing the total photodiffraction signal of a substrat
Fig. 21 AlN hexagonal lattice. Left) N polarity with nitrogen terminated surface and AlN4 tetrahedrons pointing downward. Right) Al polarity with aluminium terminated surface and AlN4 tetrahedrons pointing upward#
-
The AlN(0001) and (00.-1) faces share the same crystallograpphic symmetry and the Al and N atoms have the same geometrical surrounding differing only in the exchange of Al and N atoms (Fig. 22).
+
The AlN(0001) and (00.-1) faces share the same crystallograpphic symmetry and the Al and N atoms have the same geometrical surrounding differing only in the exchange of Al and N atoms (Fig.%s).
It is thus expected that Al(2p) and N(1s) XPD patterns exhibit almost the same features with only small differences due to the contrast between Al and N scattering amplitudes.
The strongest differences in photoemission intensities suitable for a quick and unambiguous determination of polarity were found in the (10-10) azimuthal plane at 32° and 59° (polar scans in the inset of Fig. 22).
+
The strongest differences in photoemission intensities suitable for a quick and unambiguous determination of polarity were found in the (10-10) azimuthal plane at 32° and 59° (polar scans in the inset of Fig.%s).
These are the directions of short neighbor distances between the atoms of the same element (32°) and between Al and N atoms (58.5°), respectively.
-
Using the crystal view in Fig. 21 and assuming that we want to compute Al(2p) and N(1s) intensities for emitters located in 3 different planes to get a substrate signal. How many clusters do we need to build ?
+
Using the crystal view in Fig.%s and assuming that we want to compute Al(2p) and N(1s) intensities for emitters located in 3 different planes to get a substrate signal. How many clusters do we need to build ?
-
+
+
Solution…
@@ -401,16 +402,15 @@ This is the key to computing the total photodiffraction signal of a substrat
-
-
-
Download this script and fill in the lines indicated by the comments “FILL HERE”. Run the calculation and check that you are reproducing polar scan of Fig. 22.
+
Download this script and fill in the lines indicated by the comments “FILL HERE”. Run the calculation and check that you are reproducing polar scan of Fig.%s.
Activity 8: Inequivalent emitters and the XPD of a substrate
+
+
+
+
+
+
Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
Activity 8: Inequivalent emitters and the XPD of a substrate#
+
XPD can be used to study the adsorption of atoms or molecules on surfaces (Activity 3), or atomic substitutions on surfaces (Activity 2). In this case, modeling is relatively straightforward, since only one emitter atom is involved.
+
We have seen from previous examples that, for kinetic energies \(\gtrsim\) 500 eV, the use of Rehr-Albers series expansion and scattering path filtering give access to the intensity of deeper emitter atoms (Activity 7).
+This is the key to computing the total photodiffraction signal of a substrate. As emitted photoelectrons originate from highly localized core levels around the atoms, the total signal corresponds to the (incoherent) sum of the intensities of all inequivalent emitters in the probed volume.
+
Let’s take a look at how this is done on the following example.
In this example, we will compute polar diagrams of an aluminum nitride substrate.
+
In a work published in 1999, Lebedev et al. demonstrated that Photoelectron diffraction can be used as a non invasive tool to unambiguously state the polarity of an AlN surface. Aluminium nitride cristallizes in an hexagonal cell and the authors experimentally showed that the polarity of the surface can be controlled by the annealing temperature during the growth. Both polarities are sketched in the figure below.
AlN hexagonal lattice. Left) N polarity with nitrogen terminated surface and AlN4 tetrahedrons pointing downward. Right) Al polarity with aluminium terminated surface and AlN4 tetrahedrons pointing upward#
+
+
+
The AlN(0001) and (00.-1) faces share the same crystallograpphic symmetry and the Al and N atoms have the same geometrical surrounding differing only in the exchange of Al and N atoms (Fig.%s).
+
It is thus expected that Al(2p) and N(1s) XPD patterns exhibit almost the same features with only small differences due to the contrast between Al and N scattering amplitudes.
Side views of N- or Al- terminated surfaces showing nearest neighbours main polar crystallographic directions. The inset shows the experimental Al(2p)/N(1s) ratio versus polar angle for both AlN polarities (taken from Lebedev et al.).#
+
+
+
The strongest differences in photoemission intensities suitable for a quick and unambiguous determination of polarity were found in the (10-10) azimuthal plane at 32° and 59° (polar scans in the inset of Fig.%s).
+
These are the directions of short neighbor distances between the atoms of the same element (32°) and between Al and N atoms (58.5°), respectively.
+
+
+
+
Using the crystal view in Fig.%s and assuming that we want to compute Al(2p) and N(1s) intensities for emitters located in 3 different planes to get a substrate signal. How many clusters do we need to build ?
+
+
+
+
+
+
Download this script and fill in the lines indicated by the comments “FILL HERE”. Run the calculation and check that you are reproducing polar scan of Fig.%s.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity09/Activity09.html b/msspecbook/_build/html/Activity09/Activity09.html
index f0fa62f..deba493 100644
--- a/msspecbook/_build/html/Activity09/Activity09.html
+++ b/msspecbook/_build/html/Activity09/Activity09.html
@@ -32,7 +32,7 @@
-
+
@@ -377,7 +377,7 @@ document.write(`
Download this script and write the body of the function create_cluster. The function should return a
-small cluster of 5 Fe atoms with the CO molecule adsorbed like in figure Fig. 27 below. The function
+small cluster of 5 Fe atoms with the CO molecule adsorbed like in figure Fig.%s below. The function
will accept 4 keyword arguments to control the adsorption geometry.
defcreate_cluster(height=1.,theta=45,phi=0,bond_length=1.15):# Fill the body of this function. The 'cluster' object in built according to
@@ -440,7 +441,8 @@ Finally there is the Main part that is built in two sections:
-
+
+
Solution…
Here are the code of the nested for loops
################################################################################ Main part
@@ -490,7 +492,8 @@ Finally there is the Main part that is built in two sections:
How many R-Factors do agree that \((\theta,\phi)=(55,0)\) gives the best agreement ?
-
+
+
Solution…
6 R-factors out of 12 do agree that variable set n°30 gives the best agreement. The set n°30 corresponds to
\(\theta=55°\) and \(\phi=0°\).
Activity 9: Comparing simulation and experiment with R-factors
+
+
+
+
+
+
Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
Activity 9: Comparing simulation and experiment with R-factors#
+
In order to extract precise crystallographic information from electronic spectroscopy, we need to compare MsSpec calculations with experimental results and adjust the modelling parameters to simulate the experiment as accurately as possible.
+
R-factors (reliability factors) are commonly used for this task. In the following example, we will see how MsSpec can extract the adsorption geometry of a molecule.
The carbon monoxide molecule can be adsorbed onto a Fe(001) surface in the hollow site. It was experimentally demonstrated that the CO molecule is tilted by 55\(\pm\)2° in <100> azimuthal directions. The molecule is bonded to the Fe surface by the carbon atom and the adsorption height was estimated to be \(\sim\) 0.6 Å.
We will try to reproduce the polar scan of the figure below of CO adsorbed in the hollow site of the Fe(001) surface with simple single scattering calculations with MsSpec and by using R-Factors to find the best adsorption geometry. We will use the simple cluster displayed on the left hand side of the figure.
Small cluster used for SSC calculations (left) and (right) Normalized polar scan of the C(1s) at 1202 eV for [100] and [1-10] azimths.#
+
+
+
+
+
+
Download this script and write the body of the function create_cluster. The function should return a
+small cluster of 5 Fe atoms with the CO molecule adsorbed like in figure Fig.%s below. The function
+will accept 4 keyword arguments to control the adsorption geometry.
Now that the create_cluster function is done, look at the rest of the script. The next function is called compute_polar_scan and will obviously be used to compute the \(\theta\)-scan of the C1s for a given cluster geometry.
+Finally there is the Main part that is built in two sections:
+
+
A section containing nested for loops
+
A final section for R-Factor analysis
+
+
+
+
+
+
Complete the nested for loops in section 1) in order to compute polar scans for CO molecule tilted from 45° to 60° with a 1° step and aligned either along the [100] direction of Fe, 30° from this direction or along [110]. The adsorption height is 0.6 Å and the bond length is 1.157 Å.
+
What is the best \((\theta, \phi)\) according to the R-Factor analysis
+
+
+
+
MsSpec uses 12 different R-Factors formula to compare the calculted curve to the experimental data. The set of parameters giving the best agreement according to the majority of those 12 R-factors is assumed to be the best solution. Here are the R-factors formula used in MsSpec
The 12 R-Factors used in MsSpec. The Pendry’s R-Factor is n°11.#
+
+
+
+
+
+
How many R-Factors do agree that \((\theta,\phi)=(55,0)\) gives the best agreement ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity10/Activity10.html b/msspecbook/_build/html/Activity10/Activity10.html
index a6f3936..2d40df8 100644
--- a/msspecbook/_build/html/Activity10/Activity10.html
+++ b/msspecbook/_build/html/Activity10/Activity10.html
@@ -32,7 +32,7 @@
-
+
@@ -405,9 +405,11 @@ can be changed).
-
In the paper discussed in Activity 9: Comparing simulation and experiment with R-factors, experimental values of the anisotropy suggest an adsorption height between 0.2 and 0.6 Å. Modify the script to add another sweep for variying the adsorption height of the CO molecule.
+
In the paper discussed in Activity 9: Comparing simulation and experiment with R-factors, experimental values of the anisotropy suggest an adsorption height between 0.2 and 0.6 Å. Modify the script to add another sweep for variying the adsorption height of the CO molecule.
+
+
Solution…
63# 1) Multiprocess calculations 64theta=Sweep(key='theta',comments="The molecule tilt angle",65start=50,stop=60,step=1,unit='degree')
@@ -434,21 +436,6 @@ can be changed).
86results=np.reshape(parameters.pop('output'),(df.shape[0]*2,-1))
-
-
-
fromIPython.displayimportMarkdown
-
-Markdown("""
-
-Hello world
-
-""")
-
Activity 10: Parallelization and multi-processing in MsSpec
+
+
+
+
+
+
Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
Activity 10: Parallelization and multi-processing in MsSpec#
+
As you can see from the previous examples, a complete simulation may require several multiple scattering calculations, for instance to calculate the total intensity of a substrate or to optimize the geometry of a system. As the calculations are often time consuming, it can be useful to distribute these tasks over several processors to make the most of hardware resources.
+Although MsSpec is not fully parallelized, the code does offer a number of features, which we will explore here.
When available during installation, MsSpec will link with the system lapack library. It will be used to invert the matrix in the inversion option of the MsSpec calculator. To allow MsSpec to use this shared memory parallelism, you need to set the number of cores to be used in the OMP_NUM_THREADS environment variable.
+
You can set this variable just for the execution of your script. For example:
+
$OMP_NUM_THREADS=12pythonmy_script.py
+
+
+
will use 12 cores for inverting the matrix in your script.
+
It is also possible to set environment variable inside your python script.
+
importos
+
+os.environ['OMP_NUM_THREADS']=12
+
+
+
It may be useful for technical reasons or to use different number of cores in some parts of your script.
Another kind of parallelization used in MsSpec is multiprocessing. Quite often, you need to run different independent calculations. MsSpec provides a simple looper that can be useful for multiprocessing. Let’s demonstrate it with the previous example CO/Fe(001).
+
This script is the multiprocessed version of the previous one. You can see that the previous nested for loops are now replaced by some declarative content (lines 63-67) and the definition of a process function (whose name
+can be changed).
+
With the msspec.looper package, the user define Sweep objects that are parameters of the calculation or of the cluster. The process function must accept as many arguments as parameters to sweep (+ the **kwargs).
+
A Looper object is created (line 76) and the process function is set to its pipeline attribute (line 77). When MsSpec will run the looper, it will combine all parameters values to unique individual sets and MsSpec will distribute the calculations over the number of processors specified in the ncpu option.
+
63# 1) Multiprocess calculations
+64theta=Sweep(key='theta',comments="The molecule tilt angle",
+65start=50,stop=60,step=1,unit='degree')
+66phi=Sweep(key='phi',comments="The molecule azimuthal angle",
+67values=[0,45],unit='degree')
+68
+69defprocess(theta,phi,**kwargs):
+70cluster=create_cluster(theta=theta,phi=phi,height=0.6,bond_length=1.157)
+71i=kwargs.get('sweep_index')
+72data=compute_polar_scan(cluster,folder=f'calc_{i:d}')
+73dset=data[-1]
+74returndset.theta,dset.cross_section
+75
+76looper=Looper()
+77looper.pipeline=process
+78df=looper.run(theta,phi,ncpu=4)
+79
+80# Black magic to convert the pandas dataframe object 'df' to the
+81# parameters dict and the resulst list (will be easier in a future
+82# version ;-) ).
+83parameters=df.to_dict('list')
+84results=np.reshape(parameters.pop('output'),(df.shape[0]*2,-1))
+
+
+
+
+
+
In the paper discussed in Activity 9: Comparing simulation and experiment with R-factors, experimental values of the anisotropy suggest an adsorption height between 0.2 and 0.6 Å. Modify the script to add another sweep for variying the adsorption height of the CO molecule.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/msspecbook/_build/html/Activity11/Activity11.html b/msspecbook/_build/html/Activity11/Activity11.html
index 2d4ae80..3b854cd 100644
--- a/msspecbook/_build/html/Activity11/Activity11.html
+++ b/msspecbook/_build/html/Activity11/Activity11.html
@@ -32,7 +32,7 @@
-
+
diff --git a/msspecbook/_build/html/_downloads/1294d44b079d2ab82b330376a2530741/SbAg.py b/msspecbook/_build/html/_downloads/1294d44b079d2ab82b330376a2530741/SbAg.py
new file mode 100644
index 0000000..d376ab5
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/1294d44b079d2ab82b330376a2530741/SbAg.py
@@ -0,0 +1,55 @@
+from ase.build import bulk
+from ase.visualize import view
+
+from msspec.calculator import MSSPEC
+from msspec.utils import hemispherical_cluster, get_atom_index, cut_plane
+import numpy as np
+from matplotlib import pyplot as plt
+
+# Create the silver cell
+Ag = bulk('Ag', cubic=True)
+# Orientate the cell in the [111] direction
+Ag.rotate((1,1,1), (0,0,1), rotate_cell=True)
+# Align the azimuth to match experimental reference
+Ag.rotate(15, 'z', rotate_cell=True)
+
+# Create a cluster
+cluster = hemispherical_cluster(Ag, diameter=20, emitter_plane=0)
+cluster = cut_plane(cluster, z=-4.8)
+cluster.emitter = get_atom_index(cluster, 0,0,0)
+cluster[cluster.emitter].symbol = 'Sb'
+
+# Create a calculator
+calc = MSSPEC(spectroscopy='PED', algorithm='inversion')
+calc.set_atoms(cluster)
+
+# Define parameters
+calc.source_parameters.theta = 0
+calc.source_parameters.phi = 0
+
+calc.detector_parameters.angular_acceptance = 1
+calc.detector_parameters.average_sampling = 'low'
+
+calc.muffintin_parameters.interstitial_potential = 0
+
+# Compute an azimuthal scan
+data = calc.get_phi_scan(level='4d', theta=40, phi=np.linspace(0,240,121), kinetic_energy=45)
+
+# Normalize data between [0,1] (to ease comparison with experimental data)
+dset = data[0]
+dset.cross_section -= dset.cross_section.min()
+dset.cross_section /= dset.cross_section.max()
+
+# Add experimental data points in the dataset
+x, y = np.loadtxt('data.txt').T
+dset.add_columns(experiment=y)
+
+# Add points to view
+view = dset.views[0]
+view.select('phi', 'experiment', legend='Exp. data')
+
+# Popup GUI
+data.view()
+
+# Remove temp. files
+calc.shutdown()
diff --git a/msspecbook/_build/html/_downloads/3fdd553b457dd9aab1086c697e8ad08e/Cu_temperature.py b/msspecbook/_build/html/_downloads/3fdd553b457dd9aab1086c697e8ad08e/Cu_temperature.py
new file mode 100644
index 0000000..caac050
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/3fdd553b457dd9aab1086c697e8ad08e/Cu_temperature.py
@@ -0,0 +1,126 @@
+from ase.build import bulk
+import numpy as np
+
+from msspec.calculator import MSSPEC, XRaySource
+from msspec.utils import hemispherical_cluster, get_atom_index
+
+def create_clusters(nplanes=3):
+ copper = bulk('Cu', a=3.6, cubic=True)
+ clusters = []
+ for emitter_plane in range(nplanes):
+ cluster = hemispherical_cluster(copper,
+ emitter_plane=emitter_plane,
+ planes=emitter_plane+1,
+ diameter=27,
+ shape='cylindrical')
+ cluster.absorber = get_atom_index(cluster, 0, 0, 0)
+ # This is how to store extra information with your cluster
+ cluster.info.update({
+ 'emitter_plane': emitter_plane,
+ })
+ clusters.append(cluster)
+ return clusters
+
+
+def compute(clusters, all_theta=[45., 83.],
+ all_T=np.arange(300., 1000., 400.)):
+ data = None
+ for cluster in clusters:
+ # Retrieve emitter's plane from cluster object
+ plane = cluster.info['emitter_plane']
+
+ calc = MSSPEC(spectroscopy='PED', algorithm='expansion')
+ calc.source_parameters.energy = XRaySource.AL_KALPHA
+ calc.muffintin_parameters.interstitial_potential = 14.1
+
+ # In simple scattering, it is common practice to use a real potential and
+ # manually define a mean free path arbitrarily lower than the actual physical
+ # value in an attempt to reproduce multiple scattering effects.
+ calc.tmatrix_parameters.exchange_correlation = 'x_alpha_real'
+ calc.calculation_parameters.mean_free_path = ... # -> half of the mean free
+ # path (see p6785)
+ # Parameters for temperature effects
+ calc.calculation_parameters.vibrational_damping = 'averaged_tl'
+ calc.calculation_parameters.use_debye_model = ..... # Use the MsSpec help
+ calc.calculation_parameters.debye_temperature = ... # and p6791 of the paper
+ calc.calculation_parameters.vibration_scaling = ... # -> How much more do
+ # surface atoms vibrate
+ # than bulk atoms?
+ calc.detector_parameters.average_sampling = 'low'
+ calc.detector_parameters.angular_acceptance = 5.7
+
+ calc.calculation_parameters.scattering_order = 1
+
+
+ for T in all_T:
+ # Define the sample temperature
+ calc.calculation_parameters.temperature = T
+ # Set the atoms and compute an azimuthal scan
+ calc.set_atoms(cluster)
+ data = calc.get_phi_scan(level='2p', theta=all_theta,
+ phi=np.linspace(0, 100, 51),
+ kinetic_energy=560, data=data)
+ # Small changes to add some details in both the title of the dataset
+ # and the figure
+ view = data[-1].views[-1]
+ t = view._plotopts['title'] + f" (plane #{plane:d}, T={T:.0f} K)"
+ data[-1].title = t
+ view.set_plot_options(autoscale=True, title=t)
+ calc.shutdown()
+ return data
+
+
+def analysis(data, all_theta, all_T, nplanes):
+ # Sum cross_section for all emitter's plane at a given T
+ # Compute the anisotropy
+ results = dict.fromkeys(all_T, [])
+ anisotropy = []
+ for dset in data:
+ # Retrieve temperature
+ T = float(dset.get_parameter('CalculationParameters', 'temperature')['value'])
+ # Update the sum in results
+ if len(results[T]) == 0:
+ results[T] = dset.cross_section
+ else:
+ results[T] += dset.cross_section
+
+ anisotropy_dset = data.add_dset("Anisotropies")
+ anisotropy_dset.add_columns(temperature=all_T)
+ for theta in all_theta:
+ col_name = f"theta{theta:.0f}"
+ col_values = []
+ i = np.where(dset.theta == theta)[0]
+ for T in all_T:
+ cs = results[T][i]
+ Imax = np.max(cs)
+ Imin = np.min(cs)
+ A = (Imax - Imin)/Imax
+ col_values.append(A)
+ anisotropy_dset.add_columns(**{col_name:col_values/np.max(col_values)})
+
+
+ anisotropy_view = anisotropy_dset.add_view('Anisotropies',
+ title='Relative anisotropies for Cu(2p)',
+ marker='o',
+ xlabel='T (K)',
+ ylabel=r'$\frac{\Delta I / I_{max}(T)}{\Delta I_{300}'
+ r'/ I_{max}(300)} (\%)$',
+ autoscale=True)
+ for theta in all_theta:
+ col_name = f"theta{theta:.0f}"
+ anisotropy_view.select('temperature', col_name,
+ legend=r'$\theta = {:.0f} \degree$'.format(theta))
+
+ return data
+
+
+
+if __name__ == "__main__":
+ nplanes = 4
+ all_theta = np.array([45, 83])
+ all_theta = np.array([300., 1000.])
+
+ clusters = create_clusters(nplanes=nplanes)
+ data = compute(clusters, all_T=all_T, all_theta=all_theta)
+ data = analysis(data, all_T=all_T, all_theta=all_theta, nplanes=nplanes)
+ data.view()
diff --git a/msspecbook/_build/html/_downloads/54a8452b27a8c6284cf1a8a05665f3a4/copper.cif b/msspecbook/_build/html/_downloads/54a8452b27a8c6284cf1a8a05665f3a4/copper.cif
new file mode 100644
index 0000000..0490639
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/54a8452b27a8c6284cf1a8a05665f3a4/copper.cif
@@ -0,0 +1,51 @@
+data_image0
+_chemical_formula_structural Cu26
+_chemical_formula_sum "Cu26"
+_cell_length_a 14.4
+_cell_length_b 14.4
+_cell_length_c 7.2
+_cell_angle_alpha 90.0
+_cell_angle_beta 90.0
+_cell_angle_gamma 90.0
+
+_space_group_name_H-M_alt "P 1"
+_space_group_IT_number 1
+
+loop_
+ _space_group_symop_operation_xyz
+ 'x, y, z'
+
+loop_
+ _atom_site_type_symbol
+ _atom_site_label
+ _atom_site_symmetry_multiplicity
+ _atom_site_fract_x
+ _atom_site_fract_y
+ _atom_site_fract_z
+ _atom_site_occupancy
+ Cu Cu1 1.0 0.25 0.5 0.37500000000000017 1.0000
+ Cu Cu2 1.0 0.25 0.5 0.8750000000000001 1.0000
+ Cu Cu3 1.0 0.3750000000000001 0.37500000000000017 0.37500000000000017 1.0000
+ Cu Cu4 1.0 0.5 0.24999999999999992 0.37500000000000017 1.0000
+ Cu Cu5 1.0 0.5 0.37500000000000017 0.12499999999999996 1.0000
+ Cu Cu6 1.0 0.3750000000000001 0.37500000000000017 0.8750000000000001 1.0000
+ Cu Cu7 1.0 0.5 0.24999999999999992 0.8750000000000001 1.0000
+ Cu Cu8 1.0 0.5 0.37500000000000017 0.625 1.0000
+ Cu Cu9 1.0 0.3750000000000001 0.5 0.12499999999999996 1.0000
+ Cu Cu10 1.0 0.3750000000000001 0.6249999999999999 0.37500000000000017 1.0000
+ Cu Cu11 1.0 0.5 0.5 0.37500000000000017 1.0000
+ Cu Cu12 1.0 0.5 0.6249999999999999 0.12499999999999996 1.0000
+ Cu Cu13 1.0 0.3750000000000001 0.5 0.625 1.0000
+ Cu Cu14 1.0 0.3750000000000001 0.6249999999999999 0.8750000000000001 1.0000
+ Cu Cu15 1.0 0.5 0.5 0.8750000000000001 1.0000
+ Cu Cu16 1.0 0.5 0.6249999999999999 0.625 1.0000
+ Cu Cu17 1.0 0.5 0.7500000000000003 0.37500000000000017 1.0000
+ Cu Cu18 1.0 0.5 0.7500000000000003 0.8750000000000001 1.0000
+ Cu Cu19 1.0 0.6249999999999999 0.37500000000000017 0.37500000000000017 1.0000
+ Cu Cu20 1.0 0.6249999999999999 0.37500000000000017 0.8750000000000001 1.0000
+ Cu Cu21 1.0 0.6249999999999999 0.5 0.12499999999999996 1.0000
+ Cu Cu22 1.0 0.6249999999999999 0.6249999999999999 0.37500000000000017 1.0000
+ Cu Cu23 1.0 0.7500000000000003 0.5 0.37500000000000017 1.0000
+ Cu Cu24 1.0 0.6249999999999999 0.5 0.625 1.0000
+ Cu Cu25 1.0 0.6249999999999999 0.6249999999999999 0.8750000000000001 1.0000
+ Cu Cu26 1.0 0.7500000000000003 0.5 0.8750000000000001 1.0000
diff --git a/msspecbook/_build/html/_downloads/79fef44b9d7fb8ae298952070d9ba3ce/RhO_tofill.py b/msspecbook/_build/html/_downloads/79fef44b9d7fb8ae298952070d9ba3ce/RhO_tofill.py
new file mode 100644
index 0000000..b0ed36a
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/79fef44b9d7fb8ae298952070d9ba3ce/RhO_tofill.py
@@ -0,0 +1,23 @@
+from msspec.calculator import MSSPEC
+from ase.build import fcc111, add_adsorbate
+import numpy as np
+
+data = None
+all_z = ... # -> Define a list of z values for the adsorbate
+
+for ... # -> Complete this for-loop over z values
+ # construct the cluster
+ cluster = fcc111('Rh', size = (2,2,1))
+ cluster.pop(3)
+ add_adsorbate(... # -> Put the oxygen atom on the fcc site
+ cluster.emitter = ... # -> Oxygen is the last atom we added, so the indice is...
+
+ # Define a calculator for single scattering calculations
+ calc = MSSPEC(spectroscopy='PED', algorithm='expansion')
+ calc.calculation_parameters.scattering_order = 1
+ calc.set_atoms(cluster)
+
+ # Compute
+ data = calc.get_theta_phi_scan(level='1s', kinetic_energy=723, data=data)
+
+data.view()
diff --git a/msspecbook/_build/html/_downloads/7cc7f59f1ea682f79421b71b98d87b23/TiSe2_1_tofill.py b/msspecbook/_build/html/_downloads/7cc7f59f1ea682f79421b71b98d87b23/TiSe2_1_tofill.py
new file mode 100644
index 0000000..60bac32
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/7cc7f59f1ea682f79421b71b98d87b23/TiSe2_1_tofill.py
@@ -0,0 +1,40 @@
+from ase.build import mx2
+from ase.visualize import view
+from msspec.calculator import MSSPEC
+from msspec.utils import hemispherical_cluster, get_atom_index
+
+# Some usefull constants (a, c, d, D) for defining the structure
+a=...
+
+# Create the TiSe2 trilayer
+# use ase help for this function
+TiSe2 = mx2(formula=...)
+
+# The preious cell is 2D, let's define the c-axis to take into account
+# the Van der Waals gap between trilayers
+TiSe2.cell[2] = [0, 0, ...]
+
+# To be aligned like in the paper
+TiSe2.rotate(60, 'z', rotate_cell=True)
+
+# Since the material is multi-elements, "tag" each inequivalent atom
+# of the unit cell with a number. The "Ti" atom is tagged 0 and "Se"
+# atoms are 1 and 2.
+for i in range(3):
+ TiSe2[i].tag = i
+
+cluster = hemispherical_cluster(TiSe2, emitter_tag=..., emitter_plane=..., planes=5)
+cluster.emitter = get_atom_index(cluster, 0, 0, 0)
+
+view(cluster)
+
+# Create a calculator with Rehr-Albers series expansion algorithm
+calc = MSSPEC(spectroscopy='PED', algorithm='expansion')
+calc.set_atoms(cluster)
+
+data = None
+for ndif in range(1,4):
+ calc.calculation_parameters.scattering_order = ndif
+ data = calc.get_theta_phi_scan(level='2p', kinetic_energy=1030, data=data)
+
+data.view()
\ No newline at end of file
diff --git a/msspecbook/_build/html/_downloads/a4639febc8162e65b41b0e03dfeeaa17/cu.py b/msspecbook/_build/html/_downloads/a4639febc8162e65b41b0e03dfeeaa17/cu.py
new file mode 100644
index 0000000..749851d
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/a4639febc8162e65b41b0e03dfeeaa17/cu.py
@@ -0,0 +1,24 @@
+from ase.io import read
+from msspec.calculator import MSSPEC
+
+
+cluster = read('copper.cif')
+# view the cluster
+cluster.edit()
+
+# The "emitter" atom is located in the middle of the 3rd plane
+cluster.emitter = 10
+
+# Create a "calculator"
+calc = MSSPEC(spectroscopy='PED', algorithm='inversion')
+calc.set_atoms(cluster)
+
+data = calc.get_theta_scan(level='2p3/2')
+
+# Plot the result with the interactive GUI
+data.view()
+
+# Or plot using matplotlib directly
+from matplotlib import pyplot as plt
+data[0].views[0].plot()
+plt.show()
diff --git a/msspecbook/_build/html/_downloads/aa51bfc01de3fe879c2507956d0a2b8c/data.txt b/msspecbook/_build/html/_downloads/aa51bfc01de3fe879c2507956d0a2b8c/data.txt
new file mode 100644
index 0000000..19f61b8
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/aa51bfc01de3fe879c2507956d0a2b8c/data.txt
@@ -0,0 +1,121 @@
+0.000000000000000000e+00 2.273853352828327234e-01
+2.000000000000000000e+00 2.135876322898652424e-01
+4.000000000000000000e+00 1.925265592281927285e-01
+6.000000000000000000e+00 1.852631891594877511e-01
+8.000000000000000000e+00 1.852631891594877511e-01
+1.000000000000000000e+01 1.831705825411805155e-01
+1.200000000000000000e+01 1.636929472985219347e-01
+1.400000000000000000e+01 1.279608696063064543e-01
+1.600000000000000000e+01 1.040430509934481690e-01
+1.800000000000000000e+01 3.015378633541379930e-02
+2.000000000000000000e+01 4.106459224097607462e-03
+2.200000000000000000e+01 1.971550450495464929e-02
+2.400000000000000000e+01 7.007532033757153667e-02
+2.600000000000000000e+01 1.904879553613253451e-01
+2.800000000000000000e+01 3.101513022088481231e-01
+3.000000000000000000e+01 4.052906495585950619e-01
+3.200000000000000000e+01 3.678644926959027672e-01
+3.400000000000000000e+01 3.036757937102613214e-01
+3.600000000000000000e+01 2.214720340001324062e-01
+3.800000000000000000e+01 2.247878029385593501e-01
+4.000000000000000000e+01 2.837024903561691791e-01
+4.200000000000000000e+01 3.445713059080361962e-01
+4.400000000000000000e+01 4.114147115795538934e-01
+4.600000000000000000e+01 5.600722856829548624e-01
+4.800000000000000000e+01 6.969212581381016847e-01
+5.000000000000000000e+01 8.189179738707677014e-01
+5.200000000000000000e+01 9.080765164985155069e-01
+5.400000000000000000e+01 9.562807225028111535e-01
+5.600000000000000000e+01 9.888241305894533983e-01
+5.800000000000000000e+01 9.881336668388966959e-01
+6.000000000000000000e+01 9.873660563005683954e-01
+6.200000000000000000e+01 9.916558998680982118e-01
+6.400000000000000000e+01 9.856319679487668406e-01
+6.600000000000000000e+01 9.620117644994009565e-01
+6.800000000000000000e+01 8.930029985027734263e-01
+7.000000000000000000e+01 8.002870246239043306e-01
+7.200000000000000000e+01 6.744921153732785779e-01
+7.400000000000000000e+01 5.336319385472689802e-01
+7.600000000000000000e+01 3.958859203876436417e-01
+7.800000000000000000e+01 3.306385960364682242e-01
+8.000000000000000000e+01 2.830681723233798852e-01
+8.200000000000000000e+01 2.157622815497834690e-01
+8.400000000000000000e+01 2.239956241155102445e-01
+8.600000000000000000e+01 3.126826811826061703e-01
+8.800000000000000000e+01 3.836092948935748703e-01
+9.000000000000000000e+01 3.974940023194180050e-01
+9.200000000000000000e+01 2.890294760518045125e-01
+9.400000000000000000e+01 1.681544424688440620e-01
+9.600000000000000000e+01 5.857273428081174321e-02
+9.800000000000000000e+01 1.843518927289370876e-02
+1.000000000000000000e+02 3.948951199063644064e-03
+1.020000000000000000e+02 5.411750728699640106e-02
+1.040000000000000000e+02 1.168717046133502524e-01
+1.060000000000000000e+02 1.428170265275016670e-01
+1.080000000000000000e+02 1.770817723162995683e-01
+1.100000000000000000e+02 1.852631891594877511e-01
+1.120000000000000000e+02 1.827670619818080600e-01
+1.140000000000000000e+02 1.840805289029476266e-01
+1.160000000000000000e+02 2.023203439358092770e-01
+1.180000000000000000e+02 2.289994175203227400e-01
+1.200000000000000000e+02 2.320430725945487604e-01
+1.220000000000000000e+02 2.174983315399919570e-01
+1.240000000000000000e+02 1.903085890797567015e-01
+1.260000000000000000e+02 1.848716692115463522e-01
+1.280000000000000000e+02 1.870838533508997481e-01
+1.300000000000000000e+02 1.808923414647976846e-01
+1.320000000000000000e+02 1.656061876352601381e-01
+1.340000000000000000e+02 1.324214968752658039e-01
+1.360000000000000000e+02 8.695118016262873284e-02
+1.380000000000000000e+02 1.854769500506061805e-02
+1.400000000000000000e+02 0.000000000000000000e+00
+1.420000000000000000e+02 2.910410785429527400e-02
+1.440000000000000000e+02 1.010188969127969877e-01
+1.460000000000000000e+02 2.301799776698615074e-01
+1.480000000000000000e+02 3.527565800906127258e-01
+1.500000000000000000e+02 3.915987019538648140e-01
+1.520000000000000000e+02 3.464073994570029402e-01
+1.540000000000000000e+02 2.694669793425982229e-01
+1.560000000000000000e+02 2.158017450989128672e-01
+1.580000000000000000e+02 2.275203421614326316e-01
+1.600000000000000000e+02 3.068773854027863068e-01
+1.620000000000000000e+02 3.571336959618095497e-01
+1.640000000000000000e+02 4.706879815526597843e-01
+1.660000000000000000e+02 6.409924085632153767e-01
+1.680000000000000000e+02 7.767958277474236173e-01
+1.700000000000000000e+02 8.699880758924664059e-01
+1.720000000000000000e+02 9.465309757532142099e-01
+1.740000000000000000e+02 9.812603702158622099e-01
+1.760000000000000000e+02 9.992196602416892892e-01
+1.780000000000000000e+02 9.917162779443612353e-01
+1.800000000000000000e+02 9.978245891628175768e-01
+1.820000000000000000e+02 1.000000000000000000e+00
+1.840000000000000000e+02 9.875604662057533289e-01
+1.860000000000000000e+02 9.483868703110428511e-01
+1.880000000000000000e+02 8.713195437307523772e-01
+1.900000000000000000e+02 7.743174871902573919e-01
+1.920000000000000000e+02 6.499028625508473933e-01
+1.940000000000000000e+02 5.133872820820232219e-01
+1.960000000000000000e+02 3.854633893596886574e-01
+1.980000000000000000e+02 3.197097892137605313e-01
+2.000000000000000000e+02 2.625546271582531732e-01
+2.020000000000000000e+02 2.180674059888806082e-01
+2.040000000000000000e+02 2.313545375136863425e-01
+2.060000000000000000e+02 3.256001393270981925e-01
+2.080000000000000000e+02 3.901136262892592188e-01
+2.100000000000000000e+02 4.105052902445402441e-01
+2.120000000000000000e+02 3.039702372835895727e-01
+2.140000000000000000e+02 1.592176621398869174e-01
+2.160000000000000000e+02 6.314946746536785616e-02
+2.180000000000000000e+02 1.766902523683577114e-02
+2.200000000000000000e+02 1.012551589503468512e-02
+2.220000000000000000e+02 5.641599939516841328e-02
+2.240000000000000000e+02 1.259411667024434578e-01
+2.260000000000000000e+02 1.520177453041229865e-01
+2.280000000000000000e+02 1.775272950156810414e-01
+2.300000000000000000e+02 1.829980737518577261e-01
+2.320000000000000000e+02 1.838471170106117103e-01
+2.340000000000000000e+02 1.827520612175190795e-01
+2.360000000000000000e+02 2.068282879012685871e-01
+2.380000000000000000e+02 2.265482926355094906e-01
+2.400000000000000000e+02 2.403459956284773325e-01
diff --git a/msspecbook/_build/html/_downloads/b820873b74a9711a6b5f02470505cc1a/Si001.py b/msspecbook/_build/html/_downloads/b820873b74a9711a6b5f02470505cc1a/Si001.py
new file mode 100644
index 0000000..af37f6f
--- /dev/null
+++ b/msspecbook/_build/html/_downloads/b820873b74a9711a6b5f02470505cc1a/Si001.py
@@ -0,0 +1,56 @@
+# coding: utf8
+
+import numpy as np
+from ase.build import bulk
+
+from msspec.calculator import MSSPEC, XRaySource
+from msspec.iodata import Data
+from msspec.utils import hemispherical_cluster, get_atom_index
+
+
+# Create the cluster
+a = 5.43
+Si = bulk('Si', a=a, cubic=True)
+cluster = hemispherical_cluster(Si,
+ diameter=30, planes=4,
+ emitter_plane=3,
+ shape = 'cylindrical',
+ )
+for atom in cluster:
+ atom.set('mean_square_vibration', 0.006)
+ atom.set('mt_radius', 1.1)
+cluster.emitter = get_atom_index(cluster, 0, 0, 0)
+
+# Create a calculator and set parameters
+calc = MSSPEC(spectroscopy='PED', algorithm='expansion')
+
+calc.source_parameters.energy = XRaySource.AL_KALPHA
+calc.source_parameters.theta = -54.7
+calc.source_parameters.phi = 90
+calc.spectroscopy_parameters.final_state = 1
+
+calc.calculation_parameters.scattering_order = 3
+calc.tmatrix_parameters.tl_threshold = 1e-4
+calc.calculation_parameters.vibrational_damping = 'averaged_tl'
+calc.calculation_parameters.RA_cutoff = 2
+
+# Define path filtering options such that you only
+# accept scattering paths with a forward cone <= 40°
+# and whose length are <= cluster diameter
+#
+#
+
+calc.set_atoms(cluster)
+
+# Compute and add previous data for comparison
+data = calc.get_theta_scan(level='2p',
+ theta=np.arange(-30., 80., 0.5),
+ phi=0,
+ kinetic_energy=1382.28)
+no_filters = Data.load('path_filtering.hdf5')
+data[0].add_columns(**{'no_filters': no_filters[0].cross_section})
+view = data[0].views[0]
+view.select('theta', 'cross_section', index=0, legend="With path filtering")
+view.select('theta', 'no_filters', legend="Without path filtering")
+
+data.view()
diff --git a/msspecbook/_build/html/_images/Ni_SSCvsMI.png b/msspecbook/_build/html/_images/Ni_SSCvsMI.png
deleted file mode 100644
index 5bdb0fd..0000000
Binary files a/msspecbook/_build/html/_images/Ni_SSCvsMI.png and /dev/null differ
diff --git a/msspecbook/_build/html/_images/Ni_fig1.png b/msspecbook/_build/html/_images/Ni_fig1.png
deleted file mode 100644
index 9064059..0000000
Binary files a/msspecbook/_build/html/_images/Ni_fig1.png and /dev/null differ
diff --git a/msspecbook/_build/html/_sources/Activity01/Activity01.ipynb b/msspecbook/_build/html/_sources/Activity01/Activity01.ipynb
index 1f18d31..e71953e 100644
--- a/msspecbook/_build/html/_sources/Activity01/Activity01.ipynb
+++ b/msspecbook/_build/html/_sources/Activity01/Activity01.ipynb
@@ -208,7 +208,15 @@
"2. Create an ASE *calculator*\n",
"3. Run the simulation\n",
"\n",
- "### PED polar scan for Cu(001)"
+ "### PED polar scan for Cu(001)\n",
+ "\n",
+ "download the [cu.py](cu.py \"download\") python script and the [copper.cif](copper.cif \"download\") file. Put those files in the same folder. You can run your first MsSpec calculation by typing in a terminal:\n",
+ "\n",
+ "```shell\n",
+ "$ python cu.py\n",
+ "```\n",
+ "\n",
+ "Here is the content of the script file:"
]
},
{
@@ -597,6 +605,8 @@
"Based on the previous *.cif file, create a new cluster without the deepest plane and run the same calculation for the same emitter\n",
"\n",
"```{note}\n",
+ "Use the `cluster.edit()` method to interactively remove atoms...\n",
+ "\n",
"As the cluster will contain fewer atoms, the emitter index will be different\n",
"```\n",
"\n",
@@ -617,7 +627,9 @@
"tags": []
},
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{figure-md} Cu-4planes3planes\n",
"\n",
@@ -913,20 +925,6 @@
"Cu(2p) polar scan for the hemispherical cluster.\n",
":::"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "e86ab1b3-fcf3-46e7-9cc7-f5e80becea9d",
- "metadata": {
- "editable": true,
- "slideshow": {
- "slide_type": ""
- },
- "tags": []
- },
- "outputs": [],
- "source": []
}
],
"metadata": {
@@ -945,7 +943,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.13"
+ "version": "3.11.3"
}
},
"nbformat": 4,
diff --git a/msspecbook/_build/html/_sources/Activity01/Activity01_light.ipynb b/msspecbook/_build/html/_sources/Activity01/Activity01_light.ipynb
new file mode 100644
index 0000000..2dc9bae
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity01/Activity01_light.ipynb
@@ -0,0 +1,926 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "7e31b322-df55-44ed-9f29-6f6efa71eafe",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Activity 1: Getting started\n",
+ "\n",
+ "MsSpec is a Fortran code with two components: Phagen (Written by R. Natoli) and Spec (written by D. Sébilleau). Phagen computes the phase shifts of the electronic wave propagating in the matter on a spherical harmonics basis. Spec uses those phase shifts to compute the multiple scattering process and simulate the intensity of different electronic spectroscopies.\n",
+ "\n",
+ "In the most recent version of MsSpec, the program is interfaced with python (https://msspec.cnrs.fr/), allowing for much more flexibility and interplay with other simulation techniques.\n",
+ "\n",
+ "## Building atomic systems\n",
+ "\n",
+ "MsSpec works in the *cluster* approach. Building such a cluster for a calculation is a fundamental step.\n",
+ "We use the [python Atomic Simulation Environment (ASE)](https://wiki.fysik.dtu.dk/ase/) for this.\n",
+ "\n",
+ "ASE is a set of tools and Python modules for setting up, manipulating, running, visualizing and analyzing atomistic simulations.\n",
+ "Building atomic systems, structures... is pretty straightforward:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "07a04c8c-a268-481a-8f1b-14878ed771b5",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-output"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# To build a molecule with ASE\n",
+ "from ase.build import molecule\n",
+ "# To view\n",
+ "from ase.visualize import view\n",
+ "\n",
+ "# Create a water molecule\n",
+ "water = molecule('H2O')\n",
+ "# Display it\n",
+ "view(water)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "e09c7d97-eb35-49a7-b74a-9fb21a9a3aaf",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " ASE atomic visualization\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "view(water, viewer='x3d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "94b690a2-52f0-43e4-953d-6e7519ac4e9c",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## Barebone script for MsSpec\n",
+ "\n",
+ "MsSpec can simulate different electronic spectroscopies like PED, AED, LEED, EXAFS, APECS and more will be included in the forthcoming version. However, it is really well-suited for PhotoElectron Diffraction simulation, and the python interface is only fully available for it at the moment. Since PED covers all the MsSpec features and concepts, we will focus on this technique.\n",
+ "\n",
+ "There are typically 3 steps to follow to get a result with MsSpec:\n",
+ "\n",
+ "1. Create a *cluster*\n",
+ "2. Create an ASE *calculator*\n",
+ "3. Run the simulation\n",
+ "\n",
+ "### PED polar scan for Cu(001)\n",
+ "\n",
+ "download the [cu.py](cu.py \"download\") python script and the [copper.cif](copper.cif \"download\") file. Put those files in the same folder. You can run your first MsSpec calculation by typing in a terminal:\n",
+ "\n",
+ "```shell\n",
+ "$ python cu.py\n",
+ "```\n",
+ "\n",
+ "Here is the content of the script file:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "da96a735-a028-4fe8-89ac-96f707323ae9",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "```{literalinclude} cu.py\n",
+ ":end-before: The \"emitter\"\n",
+ ":linenos:\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "6ddd72a9-8f32-484f-9a3e-9ab3a85945a4",
+ "metadata": {
+ "editable": true,
+ "scrolled": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " ASE atomic visualization\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from ase.io import read\n",
+ "from ase.visualize import view\n",
+ "from msspec.calculator import MSSPEC\n",
+ "\n",
+ "\n",
+ "cluster = read('copper.cif')\n",
+ "# view the cluster\n",
+ "view(cluster, viewer='x3d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a51b9284-ce53-48e2-bd4b-65fe3998cc33",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "```{literalinclude} cu.py\n",
+ ":start-at: The \"emitter\"\n",
+ ":lineno-match:\n",
+ "```\n",
+ ":::{figure-md} Cu-XPD\n",
+ "\n",
+ "\n",
+ "Cu(2p) polar scan for the copper cluster above\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "85c7dcac-9f0e-4a56-8077-c96f89865dcb",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## Shaping a cluster"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ff63b7cb-5e31-44f8-b81b-d05bf0c775c0",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Based on the previous *.cif file, create a new cluster without the deepest plane and run the same calculation for the same emitter\n",
+ "\n",
+ "```{note}\n",
+ "Use the `cluster.edit()` method to interactively remove atoms...\n",
+ "\n",
+ "As the cluster will contain fewer atoms, the emitter index will be different\n",
+ "```\n",
+ "\n",
+ "What do you conclude ?\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "102bfad0-f8ed-44ab-990f-9fb2eb5662b0",
+ "metadata": {
+ "editable": true,
+ "scrolled": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "hide-input"
+ ]
+ },
+ "source": [
+ "The number of atoms used for the calculation greatly impact the calculation time and memory. Most of the time, a cluster is shaped as an hemisphere to minimize the number of atoms to take into account"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "f7ecc1d0-097d-4199-822a-c564e9e94337",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-output"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from msspec.calculator import MSSPEC\n",
+ "from msspec.utils import hemispherical_cluster, get_atom_index\n",
+ "from ase.build import bulk\n",
+ "from ase.visualize import view\n",
+ "\n",
+ "copper = bulk('Cu', cubic=True)\n",
+ "cluster = hemispherical_cluster(copper, planes=3, emitter_plane=2)\n",
+ "cluster.emitter = get_atom_index(cluster, 0,0,0)\n",
+ "\n",
+ "view(cluster)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "076f617d-599f-483d-b22c-38cebf41b28a",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " ASE atomic visualization\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "view(cluster, viewer='x3d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a71c734-8c73-49a2-9f27-12157841405c",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ ":::{figure-md} Cu-hemi\n",
+ "\n",
+ "\n",
+ "Cu(2p) polar scan for the hemispherical cluster.\n",
+ ":::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity02/Activity02.ipynb b/msspecbook/_build/html/_sources/Activity02/Activity02.ipynb
index ff2f9b1..c4afc51 100644
--- a/msspecbook/_build/html/_sources/Activity02/Activity02.ipynb
+++ b/msspecbook/_build/html/_sources/Activity02/Activity02.ipynb
@@ -42,7 +42,7 @@
"\n",
"### Building the cluster\n",
"\n",
- "Let's start by building the cluster"
+ "Let's start by building the cluster. You can copy/paste directly the code from this page to your text editor or you can download the script [SbAg.py](SbAg.py \"download\"). You will also need the [data.txt](data.txt \"download\") file."
]
},
{
@@ -1164,7 +1164,9 @@
"tags": []
},
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{figure-md} SbAg-fig2\n",
"\n",
@@ -1200,7 +1202,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.13"
+ "version": "3.11.3"
}
},
"nbformat": 4,
diff --git a/msspecbook/_build/html/_sources/Activity02/Activity02_light.ipynb b/msspecbook/_build/html/_sources/Activity02/Activity02_light.ipynb
new file mode 100644
index 0000000..68864fb
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity02/Activity02_light.ipynb
@@ -0,0 +1,1178 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "88b65284-bdd1-4140-af28-526e77b9b4b6",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "(exp-setup)=\n",
+ "# Activity 2: Setting up the \"experiment\"\n",
+ "\n",
+ "To model a spectroscopy experiment, some parameters need to be correctly defined. In MsSpec, parameters are grouped in different categories (`detector_parameters`, `source_parameters`, `calculation_parameters`...). Each category is an attribute of your calculator object and contains different parameters.\n",
+ "For example, to define the angle of the incoming light with respect to the sample normal direction, you will use\n",
+ "\n",
+ "```\n",
+ "# (assuming your calculator variable is calc)\n",
+ "# e.g: Incoming X-Ray light is 30° from the sample normal\n",
+ "calc.source_parameters.theta = 30\n",
+ "```\n",
+ "\n",
+ "\n",
+ "## Sb-induced smooth growth of Ag on Ag(111) example\n",
+ "\n",
+ "To see how some parameters - not related to the cluster shape - may change the results, we will look at the effect of two parameters:\n",
+ "\n",
+ "1. The source direction\n",
+ "2. The inner potential of the sample\n",
+ "\n",
+ "The inner potential is material specific. It will add to the photoelectron kinetic energy inside the material. When the photoelectron escapes the sample, this internal potential is missing and this will create an energy step that will act as a refraction for the photoelectron intensity. The effect will be significant for large polar angles and for small kinetic energy of the photoelectron.\n",
+ "\n",
+ "Let's look at the effect of those parameters on the following example.\n",
+ "The idea is to use low energy photoelectron diffraction to see the substitution of Ag by Sb atoms on the surface plane.\n",
+ "\n",
+ ":::{seealso}\n",
+ "based on this paper from H. Cruguel *et al.* [Phys. Rev. B **55** R16061](https://doi.org/10.1103/PhysRevB.55.R16061)\n",
+ ":::\n",
+ "\n",
+ "### Building the cluster\n",
+ "\n",
+ "Let's start by building the cluster. You can copy/paste directly the code from this page to your text editor or you can download the script [SbAg.py](SbAg.py \"download\"). You will also need the [data.txt](data.txt \"download\") file."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7e10211-80ea-49e3-99a4-c57fc3b39539",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "```{literalinclude} SbAg.py\n",
+ ":end-at: symbol = 'Sb' \n",
+ ":lineno-match:\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "0b0a420f-7074-443b-8cb4-1f609f5b123e",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " ASE atomic visualization\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from ase.build import bulk\n",
+ "from ase.visualize import view\n",
+ "\n",
+ "from msspec.calculator import MSSPEC\n",
+ "from msspec.utils import hemispherical_cluster, get_atom_index, cut_plane\n",
+ "import numpy as np\n",
+ "from matplotlib import pyplot as plt\n",
+ "\n",
+ "# Create the silver cell\n",
+ "Ag = bulk('Ag', cubic=True)\n",
+ "# Orientate the cell in the [111] direction\n",
+ "Ag.rotate((1,1,1), (0,0,1), rotate_cell=True)\n",
+ "# Align the azimuth to match experimental reference\n",
+ "Ag.rotate(15, 'z', rotate_cell=True)\n",
+ "\n",
+ "# Create a cluster\n",
+ "cluster = hemispherical_cluster(Ag, diameter=20, emitter_plane=0)\n",
+ "cluster = cut_plane(cluster, z=-4.8)\n",
+ "cluster.emitter = get_atom_index(cluster, 0,0,0)\n",
+ "cluster[cluster.emitter].symbol = 'Sb'\n",
+ "\n",
+ "view(cluster, viewer='x3d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ae74eedc-5ea4-4782-a49a-dcc2feac6c7c",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "### Compute an azimuthal scan\n",
+ "\n",
+ "Now create a calculator and configure experimental parameters"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a4fed04e-e209-4cdd-822d-dc03a0f65caa",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "```{literalinclude} SbAg.py\n",
+ ":start-after: set_atoms\n",
+ ":end-before: Compute\n",
+ ":lineno-match:\n",
+ ":emphasize-lines: 3,9\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c36f5501-ddc7-41d2-b846-57d34e077d96",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "Finally, add those lines to compute the $\\phi$-scan (in orange) and compare it to the experimental data (in blue).\n",
+ "\n",
+ "```{literalinclude} SbAg.py\n",
+ ":start-after: interstitial_potential\n",
+ ":lineno-match:\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "41723719-be45-4fa8-a824-4ccc4c6dd6c0",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ ":::{figure-md} SbAg-fig1\n",
+ "\n",
+ "\n",
+ "Azimuthal ($\\phi$) scan for Sb(4d) emitter in the top layer of Ag(111) at 45 eV kinetic energy.\n",
+ ":::\n",
+ "\n",
+ "The agreement is not satisfactory although most of the features may be identified."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0332a072-90b0-4d3e-8ee9-06cd16bb2608",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Try to change the source direction and the inner potential of Ag to better match the experiment...\n",
+ "\n",
+ "```{note}\n",
+ "The cluster is smaller than it should for size convergence, but the calculation would take too much memory for this example\n",
+ "```\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity03/Activity03.ipynb b/msspecbook/_build/html/_sources/Activity03/Activity03.ipynb
index 19f5b9c..c44ab25 100644
--- a/msspecbook/_build/html/_sources/Activity03/Activity03.ipynb
+++ b/msspecbook/_build/html/_sources/Activity03/Activity03.ipynb
@@ -266,7 +266,9 @@
"tags": []
},
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{literalinclude} RhO_sf.py\n",
":start-at: Compute\n",
@@ -333,7 +335,7 @@
"::::{tab-set}\n",
"\n",
":::{tab-item} Quiz\n",
- "Complete the script below to compute the ($\\theta,\\phi$) scan of the photodiffraction of O(1s) adsorbed on a *fcc* site on Rh(111) surface.\n",
+ "Complete the [script below](RhO_tofill.py \"download\") to compute the ($\\theta,\\phi$) scan of the photodiffraction of O(1s) adsorbed on a *fcc* site on Rh(111) surface.\n",
"\n",
"```{literalinclude} RhO_tofill.py\n",
":lineno-match:\n",
@@ -358,7 +360,9 @@
"tags": []
},
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{literalinclude} RhO_completed.py\n",
":lineno-match:\n",
diff --git a/msspecbook/_build/html/_sources/Activity03/Activity03_light.ipynb b/msspecbook/_build/html/_sources/Activity03/Activity03_light.ipynb
new file mode 100644
index 0000000..3632534
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity03/Activity03_light.ipynb
@@ -0,0 +1,346 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "2aebc88d-0bb4-4d56-b7f6-977a66814229",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "(ssc)=\n",
+ "# Activity 3: Adsorbates and the single scattering approach\n",
+ "\n",
+ "Photoelectron diffraction is widely used to study the adsorption of atoms or molecules on a crystalline surface. Photoelectrons from adsorbates are scattered by the underlying surface, carrying information about the adsorption site, bond length and/or molecule orientation…. Thanks to a simulation, such information becomes quantitative with a high degree of accuracy.\n",
+ "\n",
+ "Calculations of the multiple scattering using matrix inversion have the great advantage of being exact, including all scattering paths. On the other hand, memory consumption soon becomes a problem as the kinetic energy and number of atoms to be considered increase. As an approximation, it is possible to only consider a single scattering from the emitter to any atom in the cluster. This approximation is extremely computationally fast and can give satisfactory results for adsorbates. We’ll see later that this approach is rather too simplistic for most cases.\n",
+ "\n",
+ "## Oxygen on Rh(001)\n",
+ "In a paper published in 1998, T. Gerber *et al.* used the quite high backscattering factor of Rhodium atoms to probe the distance of Oxygen atoms adsorbed on a Rhodium surface. Some electrons coming from Oxygen atoms are ejected toward the Rhodium surface. They are then backscattered and interfere with the direct signal comming from Oxygen atoms (see the figure below). They demonstrated both experimentally and numerically with a sinle scattering computation that this lead to a very accurate probe of adsorbed species that can be sensitive to bond length changes of the order of {math}`\\pm 0.02 \\mathring{A}`.\n",
+ "\n",
+ ":::{seealso}\n",
+ "based on this paper from T. Greber *et al.* [Phys. Rev. Lett. **81**(8) p1654 (1998)](https://doi.org/10.1103/PhysRevLett.81.1654)\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a4cd32cd-b480-44b5-af38-b38e5979ce00",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ ":::{figure-md} RhO-fig\n",
+ "\n",
+ "\n",
+ "Interferences produced by the backscattering effect\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4f6bcc08-a54c-424a-a20c-cbdd0ce13ae2",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "### Computing the scattering factor\n",
+ "\n",
+ "To illustrate that photoelectrons emitted by Oxygen adsorbates towards the Rhodium surface can be backscattered, we will start by computing the scattering factor for both O and Rh atoms.\n",
+ "\n",
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "By using the [`Atoms`](https://wiki.fysik.dtu.dk/ase/ase/atoms.html#ase.Atoms) class of the `ase` package, try to build a O-Rh chain where atoms are 4 Å apart. Here is the begining of the script. Try to complete the line of code and view your two-atoms chain.\n",
+ "\n",
+ "```python\n",
+ "from ase import Atoms\n",
+ "from ase.visualize import view\n",
+ "\n",
+ "# Create an atomic chain O-Rh\n",
+ "cluster = Atoms(... # Fill this line\n",
+ "```\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "55929980-7394-4a60-b554-376adce57dbf",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [],
+ "source": [
+ "from ase import Atoms\n",
+ "from ase.visualize import view\n",
+ "\n",
+ "# Create an atomic chain O-Rh\n",
+ "cluster = Atoms(['O', 'Rh'], positions = [(0,0,0), (0,0,4.)])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "2f296e2c-2a34-4266-98a8-362ede072659",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " ASE atomic visualization\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "view(cluster, viewer='x3d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "736d6d08-930e-4b4f-a3fd-599ef8463035",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "As previously, we create a calculator, we attach our 2 atoms cluster to this calculator and we define the first atom in the chain as the emitter\n",
+ "\n",
+ ":::{literalinclude} RhO_sf.py\n",
+ ":start-at: calc =\n",
+ ":end-at: emitter =\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21763c63-9bd1-4e80-944a-9cf313894b89",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "We use the `get_scattering_factors` method [(see its documentation)](https://msspec.cnrs.fr/modules/calculator.html#calculator._PED.get_scattering_factors) to compute the scattering factors at 723 eV.\n",
+ "\n",
+ "How large is the backscattering factor of Rhodium with respect to that of Oxygen ?\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7da60a3-b4e3-45ec-9d0e-62cb592f0687",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "### Interferences due to backscattering\n",
+ "\n",
+ "Let an Oxygen atom (in red) being adsorbed at a distance $z_0$ of an *fcc* site of the Rh(111) surface."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "68048f33-318d-400e-a815-769660f2b6c5",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "source": [
+ ":::{figure-md} Rho-fig2a\n",
+ "\n",
+ "\n",
+ "Small cluster used for the calculation.\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d6145250-5548-49a6-8b50-0bb7c5b454da",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "We will compute for different values of the adsorption height $z_0$.\n",
+ "\n",
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Complete the [script below](RhO_tofill.py \"download\") to compute the ($\\theta,\\phi$) scan of the photodiffraction of O(1s) adsorbed on a *fcc* site on Rh(111) surface.\n",
+ "\n",
+ "```{literalinclude} RhO_tofill.py\n",
+ ":lineno-match:\n",
+ ":emphasize-lines: 6,8,12,13\n",
+ "```\n",
+ "\n",
+ "As proposed in the comments, add a loop to vary the adsorption height of Oxygen between 1.10 and 1.65 Å.\n",
+ "What is the bond length difference between to intensity maxima ?\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity04/Activity04.ipynb b/msspecbook/_build/html/_sources/Activity04/Activity04.ipynb
index 22d2654..7ce3972 100644
--- a/msspecbook/_build/html/_sources/Activity04/Activity04.ipynb
+++ b/msspecbook/_build/html/_sources/Activity04/Activity04.ipynb
@@ -97,7 +97,13 @@
{
"cell_type": "markdown",
"id": "3ed73f46-c12f-452f-a584-00d142f2e133",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"```{admonition} *Solution...*\n",
":class: tip\n",
@@ -136,7 +142,13 @@
{
"cell_type": "markdown",
"id": "626708d9-c421-4bf0-bd70-f32113360f9c",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"```{admonition} *Solution...*\n",
":class: tip\n",
@@ -150,6 +162,10 @@
"Polar scan of a Ni chain of 2-5 atoms for single and full mutliple scattering.\n",
":::\n",
"\n",
+ ":::{literalinclude} Ni_chain2.py\n",
+ ":linenos: true\n",
+ ":::\n",
+ "\n",
"```"
]
}
diff --git a/msspecbook/_build/html/_sources/Activity04/Activity04_light.ipynb b/msspecbook/_build/html/_sources/Activity04/Activity04_light.ipynb
new file mode 100644
index 0000000..46c64a8
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity04/Activity04_light.ipynb
@@ -0,0 +1,147 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "d053c16f-22ca-44ce-a58d-03e73c1a5554",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "(ssc2ms)=\n",
+ "# Activity 4: From single scattering to multiple scattering\n",
+ "\n",
+ "In the [previous activity](ssc), we saw that simple single scattering calculations (SSC) can be used to simulate photodiffraction diagrams with good accuracy. The approximation works fine when the emitting atom is very close to the surface.\n",
+ "However, the SSC approach is no longer suitable for deeper emitter atoms, where multiple scattering effects come into play. In this activity, we will focus on a major consequence of multiple scattering: *the defocusing effect*.\n",
+ "\n",
+ "The defocusing effect is presented in the [figure below](Ni-fig1) for a chain of nickel atoms. Although purely illustrative, understanding multiple scattering in atomic chains is fundamental because they are found in many situations, such as in particular directions of a crystal or in molecules of various lengths."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "12b10290-0b9b-497a-baba-e7ecb6543788",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ ":::{figure-md} Ni-fig1\n",
+ "\n",
+ "\n",
+ "The defocusing effect dur to multiple scattering in an atomic chain of Ni atoms.\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b1b4c789-e62c-40cc-92a3-053e6a90d315",
+ "metadata": {},
+ "source": [
+ "In 1989, M.-L Xu, J.J. Barton and M.A. Van Hove studied these multiple scattering effects on atomic chains ([see their paper below](defocusing-paper)).\n",
+ "In the spirit of figure 3 of their paper, we will create 3 atomic chains of Ni atoms (2, 3 and 5 atoms) tilted by 45° and we will compare the intensity of the forward scattering peak for single scattering and for full multiple scattering."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4988e7d3-2ba3-470f-9676-8116348c30a1",
+ "metadata": {},
+ "source": [
+ "(defocusing-paper)=\n",
+ ":::{seealso}\n",
+ "based on this paper from M.-L. Xu *et al.*\n",
+ "[Phys. Rev. B **39** p8275 (1989)](https://doi.org/10.1103/PhysRevB.39.8275) \n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "011ef23b-5a76-410d-8d44-1c4a899e2a23",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## Polar scans of Ni atomic chains\n",
+ "\n",
+ "### Building a chain of atoms\n",
+ "\n",
+ "Start by creating a simple chain of 2 Ni atoms: an emitter and a scatterer in the [101] direction.\n",
+ "\n",
+ ":::{tip}\n",
+ "Nickel is *fcc* with lattice parameter $a$=3.499 Å. Use the [`Atoms`](https://wiki.fysik.dtu.dk/ase/ase/atoms.html#ase.Atoms) class of `ase` like in the [previous activity](ssc)...\n",
+ "\n",
+ ":::{admonition} if you need help to start...\n",
+ ":class: dropdown\n",
+ "\n",
+ ":::{code} python\n",
+ "from msspec.calculator import MSSPEC\n",
+ "from ase import Atoms\n",
+ "\n",
+ "symbol = ... # The kind of atom for the chain\n",
+ "a = ... # The distance bewteen 2 atoms\n",
+ " # in [101] direction\n",
+ "\n",
+ "chain = Atoms(..., positions=[...])\n",
+ "chain.rotate(...)\n",
+ "chain.edit()\n",
+ ":::\n",
+ "\n",
+ ":::\n",
+ "\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5c57f951-bfa7-435e-8e74-b3de11909768",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Create an `MSSPEC` calculator with `expansion` algortithm and set the `scattering_order`=1 to compute a polar scan of the Ni(3s) in single scattering. How is varying the height of the peak at 45° (along the chain) if you increase the number of atoms in the chain ?\n",
+ "\n",
+ "Repeat the same experiment with `inversion` algorithm for having the full multiple scattering result. What do you observe ?\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity05/Activity05.ipynb b/msspecbook/_build/html/_sources/Activity05/Activity05.ipynb
index ca3f110..993f94c 100644
--- a/msspecbook/_build/html/_sources/Activity05/Activity05.ipynb
+++ b/msspecbook/_build/html/_sources/Activity05/Activity05.ipynb
@@ -181,12 +181,12 @@
"::::{tab-set}\n",
"\n",
":::{tab-item} Quiz\n",
- "Complete the code snipet provided below to create a small TiSe{sub}`2` cluster with Ti emitter in the 2{sup}`nd` plane:\n",
+ "Complete the code snipet provided below (or [here](TiSe2_1_tofill.py \"download\")) to create a small TiSe{sub}`2` cluster with Ti emitter in the 2{sup}`nd` plane:\n",
"\n",
"```{literalinclude} TiSe2_1_tofill.py\n",
- ":start-at: from\n",
- ":end-before: Create a calculator\n",
- ":lineno-match:\n",
+ ":lines: 1-29\n",
+ ":linenos:\n",
+ ":emphasize-lines: 7,11,15,26 \n",
"```\n",
"\n",
":::\n",
@@ -195,53 +195,32 @@
]
},
{
- "cell_type": "code",
- "execution_count": 14,
- "id": "b65b569e-242b-4fe9-9c87-ea90d80d9b44",
+ "cell_type": "markdown",
+ "id": "1f2e014f-8963-4ae6-bbf5-7f4ebde3b16a",
"metadata": {
"editable": true,
"slideshow": {
"slide_type": ""
},
- "tags": [
- "hide-cell"
- ]
+ "tags": []
},
- "outputs": [],
"source": [
- "from ase.build import mx2\n",
- "from ase.visualize import view\n",
- "from msspec.calculator import MSSPEC\n",
- "from msspec.utils import hemispherical_cluster, get_atom_index\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
- "# Some usefull constants (a, c, d, D) for defining the structure\n",
- "a=3.535;c=6.004;d=3.450;D=2.554\n",
+ ":::{literalinclude} TiSe2_1_completed.py\n",
+ ":linenos: true\n",
+ ":lines: 1-18\n",
+ ":::\n",
"\n",
- "# Create the TiSe2 trilayer\n",
- "# use ase help for this function\n",
- "TiSe2 = mx2(formula='TiSe2', kind='1T', a=a, thickness=d, size=(1, 1, 1), vacuum=None)\n",
- "\n",
- "# The preious cell is 2D, let's define the c-axis to take into account \n",
- "# the Van der Waals gap between trilayers\n",
- "TiSe2.cell[2] = [0, 0, c]\n",
- "\n",
- "# To be aligned like in the paper\n",
- "TiSe2.rotate(60, 'z', rotate_cell=True)\n",
- "\n",
- "# Since the material is multi-elements, \"tag\" each inequivalent atom \n",
- "# of the unit cell with a number. The \"Ti\" atom is tagged 0 and \"Se\" \n",
- "# atoms are 1 and 2.\n",
- "for i in range(3): \n",
- " TiSe2[i].tag = i\n",
- "\n",
- "cluster = hemispherical_cluster(TiSe2, emitter_tag=0, emitter_plane=1, planes=5)\n",
- "cluster.emitter = get_atom_index(cluster, 0, 0, 0)"
+ "```"
]
},
{
"cell_type": "code",
- "execution_count": 15,
- "id": "515064d0-3751-4fae-af0c-c4b15ea221b3",
+ "execution_count": 1,
+ "id": "b65b569e-242b-4fe9-9c87-ea90d80d9b44",
"metadata": {
"editable": true,
"slideshow": {
@@ -777,12 +756,39 @@
""
]
},
- "execution_count": 15,
+ "execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
+ "from ase.build import mx2\n",
+ "from ase.visualize import view\n",
+ "from msspec.calculator import MSSPEC\n",
+ "from msspec.utils import hemispherical_cluster, get_atom_index\n",
+ "\n",
+ "# Some usefull constants (a, c, d, D) for defining the structure\n",
+ "a=3.535;c=6.004;d=3.450;D=2.554\n",
+ "\n",
+ "# Create the TiSe2 trilayer\n",
+ "# use ase help for this function\n",
+ "TiSe2 = mx2(formula='TiSe2', kind='1T', a=a, thickness=d, size=(1, 1, 1), vacuum=None)\n",
+ "\n",
+ "# The preious cell is 2D, let's define the c-axis to take into account \n",
+ "# the Van der Waals gap between trilayers\n",
+ "TiSe2.cell[2] = [0, 0, c]\n",
+ "\n",
+ "# To be aligned like in the paper\n",
+ "TiSe2.rotate(60, 'z', rotate_cell=True)\n",
+ "\n",
+ "# Since the material is multi-elements, \"tag\" each inequivalent atom \n",
+ "# of the unit cell with a number. The \"Ti\" atom is tagged 0 and \"Se\" \n",
+ "# atoms are 1 and 2.\n",
+ "for i in range(3): \n",
+ " TiSe2[i].tag = i\n",
+ "\n",
+ "cluster = hemispherical_cluster(TiSe2, emitter_tag=0, emitter_plane=1, planes=5)\n",
+ "cluster.emitter = get_atom_index(cluster, 0, 0, 0)\n",
"view(cluster, viewer='x3d')"
]
},
@@ -847,7 +853,9 @@
]
},
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{figure-md} results-completed-fig\n",
"\n",
diff --git a/msspecbook/_build/html/_sources/Activity05/Activity05_light.ipynb b/msspecbook/_build/html/_sources/Activity05/Activity05_light.ipynb
new file mode 100644
index 0000000..4cdd460
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity05/Activity05_light.ipynb
@@ -0,0 +1,842 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "ff0fc2d9-b53e-4d29-883b-6d6303d76eb2",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "(forward-scattering)=\n",
+ "# Activity 5: Multiple scattering in the forward scattering regime"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7f10b898-4fc8-40fd-a477-05e736a5a255",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "In photoelectron diffraction, it is well known that for high photoelectron kinetic energy (typically > 900 eV), the scattering factor is strongly peaked in the forward direction. It means that photoelectrons are almost not deviated after a scattering event.\n",
+ "\n",
+ "Peaks of intentisity are then usually observed for dense atomic directions of the sample. This is the **forward scattering approximation**.\n",
+ "\n",
+ "For such high kinetic energy, multiple scattering is needed to accurately describe the measured intensity, but the matrix inversion algorithm cannot be used since the memory needed for storing the matrix itself would be generally too large. The matrix will contain\n",
+ "$(N \\times (L_{max}+1)^2)^2$ elements of complex type with double precision (64 bits) where $N$ is the number of atoms and $L_{max}$ is the number of spherical harmonics used to expand the electron wave around each atomic center. As the kinetic energy increases, the mean free path (MFP) of the photoelectron is larger and the number of atoms in the cluster has to be greater. Lmax also increases with the kinetic energy."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "cc78443a-1d06-408a-91eb-33a56fe25ba3",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Try to evaluate how much memory you would need for this matrix for a hemispherical cluster of copper 15 angströms thick (1 MFP) for $L_{max} = 25$ ?\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "e6f5b739-bcbf-4a2f-9c51-5e409079392a",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "hide-cell"
+ ]
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "606 atoms, 2.685 TB\n"
+ ]
+ }
+ ],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "# lattice constant of fcc copper\n",
+ "a = 3.6\n",
+ "# radius of the cluster\n",
+ "r = 15\n",
+ "# volume of the cluster\n",
+ "V = .5 * (4/3) * np.pi * r**3\n",
+ "# volume of the cell\n",
+ "v = a**3\n",
+ "# number of atoms in the unit cell\n",
+ "n = 4\n",
+ "# number of atoms in the cluster\n",
+ "N = int(V/v * n)\n",
+ "\n",
+ "Lmax = 25\n",
+ "M = (N * (Lmax+1)**2 )**2 * 2 * 64 / 8\n",
+ "print(f\"{N:d} atoms, {M/1e12:.3f} TB\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f53ecd7a-9202-40ec-a472-c5a2146587c9",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "This is too much memory. We will use another algorithm available in MsSpec: The *Rehr-Albers series expansion*. We already used that algorithm in activity 3 for the single scattering approach. But this time, we will explore a bit more the effect of the scattering order > 1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7e215cd-3468-4316-901d-27731ec3e61d",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## PED of the 1T-TiSe2 surface"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ed46b9b8-cd37-4531-9686-5c1d804e868e",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "Let us try to model the Ti2p XPD pattern of the transition metal dichalcogenide 1T-TiSe2.\n",
+ "\n",
+ ":::{seealso}\n",
+ "based on this paper from M.V. Kuznetsov *et al.*\n",
+ "[Surf. Sci. **606** p1760–70 (2012)](https://doi.org/10.1016/j.susc.2012.06.008)\n",
+ ":::\n",
+ "\n",
+ "### Creating the TiSe{sub}`2` cluster\n",
+ "\n",
+ "Start by creating a small cluster of 1T-TiSe2 using the `mx2` function of `ase.build` and the `hemispherical_cluster` function of `msspec.utils`."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "65562913-1336-476c-8dd7-0ade7a8a1b8b",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ ":::{figure-md} TiSe2-fig\n",
+ "\n",
+ "\n",
+ "Structure of 1T-TiSe2 ($a_0=b_0=3.535$ Å, $c_0=6.004$ Å, $d=3.450$ Å, $D=2.554$ Å)\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "849041c9-513f-4593-a4dd-fb3a495094fa",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Complete the code snipet provided below (or [here](TiSe2_1_tofill.py \"download\")) to create a small TiSe{sub}`2` cluster with Ti emitter in the 2{sup}`nd` plane:\n",
+ "\n",
+ "```{literalinclude} TiSe2_1_tofill.py\n",
+ ":lines: 1-29\n",
+ ":linenos:\n",
+ ":emphasize-lines: 7,11,15,26 \n",
+ "```\n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "b65b569e-242b-4fe9-9c87-ea90d80d9b44",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": [
+ "remove-input"
+ ]
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " ASE atomic visualization\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ " \n",
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from ase.build import mx2\n",
+ "from ase.visualize import view\n",
+ "from msspec.calculator import MSSPEC\n",
+ "from msspec.utils import hemispherical_cluster, get_atom_index\n",
+ "\n",
+ "# Some usefull constants (a, c, d, D) for defining the structure\n",
+ "a=3.535;c=6.004;d=3.450;D=2.554\n",
+ "\n",
+ "# Create the TiSe2 trilayer\n",
+ "# use ase help for this function\n",
+ "TiSe2 = mx2(formula='TiSe2', kind='1T', a=a, thickness=d, size=(1, 1, 1), vacuum=None)\n",
+ "\n",
+ "# The preious cell is 2D, let's define the c-axis to take into account \n",
+ "# the Van der Waals gap between trilayers\n",
+ "TiSe2.cell[2] = [0, 0, c]\n",
+ "\n",
+ "# To be aligned like in the paper\n",
+ "TiSe2.rotate(60, 'z', rotate_cell=True)\n",
+ "\n",
+ "# Since the material is multi-elements, \"tag\" each inequivalent atom \n",
+ "# of the unit cell with a number. The \"Ti\" atom is tagged 0 and \"Se\" \n",
+ "# atoms are 1 and 2.\n",
+ "for i in range(3): \n",
+ " TiSe2[i].tag = i\n",
+ "\n",
+ "cluster = hemispherical_cluster(TiSe2, emitter_tag=0, emitter_plane=1, planes=5)\n",
+ "cluster.emitter = get_atom_index(cluster, 0, 0, 0)\n",
+ "view(cluster, viewer='x3d')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3b029e1b-6871-42ac-9cdd-65c583404e3d",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "### Effect of the scattering order\n",
+ "\n",
+ "Use the line belows to create a calculator and compute a $\\theta$-$\\phi$ scan of the Ti(2p)\n",
+ "\n",
+ "```{literalinclude} TiSe2_1_tofill.py\n",
+ " :start-at: Create a\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8169ad09-36b4-4f0a-b737-378e2f78b3df",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Compute a scan for an emitter in the first trilayer and in the second trilayer for scattering orders from 1 (single scattering) to 3 in order to complete the figure below.\n",
+ "What do you conclude about the value of the `calc.calculation_parameters.scattering_order` ?\n",
+ "\n",
+ "```{figure-md} results-fig\n",
+ "\n",
+ "\n",
+ "$\\theta$-$\\phi$ scan of Ti(2p) at 1030 eV kinetic energy for an emitter in the first trilayer (left column) and in the second trilayer (right column). Each row correspond to a growing value for the `calc.calculation_parameters.scattering_order` parameter (from 1 to 5).\n",
+ "```\n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity06/Activity06.ipynb b/msspecbook/_build/html/_sources/Activity06/Activity06.ipynb
index a95699d..7a06cfd 100644
--- a/msspecbook/_build/html/_sources/Activity06/Activity06.ipynb
+++ b/msspecbook/_build/html/_sources/Activity06/Activity06.ipynb
@@ -3,7 +3,13 @@
{
"cell_type": "markdown",
"id": "c0a860db-0f72-4785-81f4-831e48b3a49f",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"# Activity 6: Effect of the temperature\n",
"\n",
@@ -73,7 +79,7 @@
"\n",
":::{tab-item} Quiz\n",
"With the help of the [MsSpec documentation](https://msspec.cnrs.fr/parameters.html) and the second paragraph p6791 of the [article cited above](#msd-paper),\n",
- "complete the hilighted lines in the following script to compute the anisotropy of Cu(2p) $\\phi$-scans for polar angle $\\theta$=45° and 83°.\n",
+ "complete the hilighted lines in the [following script](Cu_temperature.py \"download\") to compute the anisotropy of Cu(2p) $\\phi$-scans for polar angle $\\theta$=45° and 83°.\n",
"\n",
"How is varying the anisotropy versus the temperature. How can you qualitatively explain this variation ?\n",
"\n",
@@ -98,7 +104,9 @@
"tags": []
},
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{literalinclude} Cu_temperature_completed.py\n",
":lineno-match:\n",
@@ -133,7 +141,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.11.13"
+ "version": "3.11.3"
}
},
"nbformat": 4,
diff --git a/msspecbook/_build/html/_sources/Activity06/Activity06_light.ipynb b/msspecbook/_build/html/_sources/Activity06/Activity06_light.ipynb
new file mode 100644
index 0000000..5c00252
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity06/Activity06_light.ipynb
@@ -0,0 +1,118 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "c0a860db-0f72-4785-81f4-831e48b3a49f",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Activity 6: Effect of the temperature\n",
+ "\n",
+ "\n",
+ "## Surface and bulk effects of the temperature\n",
+ "\n",
+ "In this example, we will look at the effects of the temperature on the X-Ray photoelectron diffraction from a copper substrate. We will base our python script on a paper published in 1986 by R. Trehan and S. Fadley. In their work, they performed azimutal scans of a copper(001) surface at 2 different polar angles: one at grazing incidence and one at 45° for incresing temperatures from 298K to roughly 1000K.\n",
+ "\n",
+ "For each azimutal scan, they looked at the anisotropy of the signal, that is:\n",
+ "\n",
+ "```{math}\n",
+ ":label: eq-anisotropy\n",
+ "\\frac{I_{max} - I_{min}}{I_{max}}=\\frac{\\Delta I}{I_{max}}\n",
+ "```\n",
+ "\n",
+ "This value is representative of how clear are the *modulations* of the signal. They also proposed single scattering calculations that reproduced well these results.\n",
+ "\n",
+ "We will reproduce this kind of calculations to introduce the parameters that control the vibrational damping.\n",
+ "\n",
+ "(msd-paper)=\n",
+ ":::{seealso}\n",
+ "based on this paper from R. Trehan and C.S. Fadley\n",
+ "[Phys. Rev. B **34** p6784–98 (2012)](https://doi.org/10.1103/PhysRevB.34.6784)\n",
+ ":::\n",
+ "\n",
+ "### The script\n",
+ "\n",
+ "Since we want to distinguish between bulk (low polar angles, $\\theta = 45°$ in the paper) and surface effects (large polar angles, $\\theta = 83°$ in the paper), we need to compute scans for different emitters and different depths in the cluster.\n",
+ "\n",
+ "The script contains 3 functions:\n",
+ "1. The `create_clusters` function will build clusters with increasing number of planes, with the emitter being in the deepest plane for each cluster.\n",
+ "2. The function `compute` will compute the azimuthal scan for a given cluster.\n",
+ "3. The `analysis` function will sum the intensity from each plane for a given temperature. This will be the *substrate total signal* (more on this in the {ref}`path-filtering` section). The function will also compute the anisotropy (equation {eq}`eq-anisotropy`).\n",
+ "\n",
+ "MsSpec can introduce temperature effects in two ways: either by using the Debye Waller model or by doing an average over the phase shifts. We will explore the latter in this example.\n",
+ "\n",
+ "Regardless of the option chosen to model temperature effects, we need to define mean square displacement (MSD) values of the atoms in our cluster. We will use the Debye model for this. The MSD is defined as follows:\n",
+ "\n",
+ ":::{math}\n",
+ ":label: eq-debye\n",
+ " = \\frac{3\\hbar^2 T}{M K_B \\Theta_D^2}\n",
+ ":::\n",
+ "\n",
+ "where $\\hbar$ is the reduce Planck's constant, $T$ is the temperature, $M$ is the mass of the atom, $k_B$ is the Boltzmann's constant and $\\Theta_D$ is the Debye temperature of the sample.\n",
+ "\n",
+ "To get an idea of the typical order of magnitude for MSD, the figure below plots the values of MSD for copper for temperatures ranging from 300 K to 1000 K.\n",
+ "\n",
+ ":::{figure-md} msd-fig\n",
+ "\n",
+ "\n",
+ "Variation of MSD for copper versus temperature using equation {eq}`eq-debye`\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "69b8c17d-ab66-4092-a492-005f05d80495",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "With the help of the [MsSpec documentation](https://msspec.cnrs.fr/parameters.html) and the second paragraph p6791 of the [article cited above](#msd-paper),\n",
+ "complete the hilighted lines in the [following script](Cu_temperature.py \"download\") to compute the anisotropy of Cu(2p) $\\phi$-scans for polar angle $\\theta$=45° and 83°.\n",
+ "\n",
+ "How is varying the anisotropy versus the temperature. How can you qualitatively explain this variation ?\n",
+ "\n",
+ "```{literalinclude} Cu_temperature.py\n",
+ ":lineno-match:\n",
+ ":emphasize-lines: 40-41,44-48\n",
+ "```\n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity07/Activity07.ipynb b/msspecbook/_build/html/_sources/Activity07/Activity07.ipynb
index 29d05a8..ffb6f1a 100644
--- a/msspecbook/_build/html/_sources/Activity07/Activity07.ipynb
+++ b/msspecbook/_build/html/_sources/Activity07/Activity07.ipynb
@@ -3,7 +3,13 @@
{
"cell_type": "markdown",
"id": "42cfa8b1-20d2-47e4-a1f0-161c4517df2c",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"(path-filtering)=\n",
"# Activity 7: Large clusters and path filtering"
@@ -42,7 +48,13 @@
{
"cell_type": "markdown",
"id": "0f78af28-335e-4f6b-9b98-929f9e6965f8",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"::::{tab-set}\n",
"\n",
@@ -66,16 +78,24 @@
{
"cell_type": "markdown",
"id": "a83ee1b8-dc25-4db9-a3bd-c5ba8443f758",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- ":::{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
"To get the total number of paths generated by a cluster of $N$ atoms up to order $M$, use the following formula:\n",
"\n",
- "```{math}\n",
+ ":::{math}\n",
":label: eq-nbpaths\n",
"\\sum_{i=0}^{i=M} (N-1)^i\n",
- "```\n",
+ ":::\n",
"\n",
":::{figure-md} nbpaths-fig\n",
"\n",
@@ -83,7 +103,7 @@
"The time for computing all scattering path for increasing cluster size and scattering order (up to 6{sup}`th` order with 739 atoms. (One path is assumed to be calculated within 1 µs)\n",
":::\n",
"\n",
- ":::"
+ "```"
]
},
{
@@ -110,7 +130,13 @@
{
"cell_type": "markdown",
"id": "28aae2f7-2af9-4630-b89d-ab634725ad79",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"## Application to a deep plane in a Si(001) sample\n",
"\n",
@@ -129,7 +155,7 @@
"\n",
":::{tab-item} Quiz\n",
"\n",
- "The following script is almost completed, try to define path filtering options (no backscattering, accept all paths with forward angles < 40° and reject paths longer than the diameter of the cluster).\n",
+ "The [following script](Si001.py \"download\") is almost completed, try to define path filtering options (no backscattering, accept all paths with forward angles < 40° and reject paths longer than the diameter of the cluster).\n",
"\n",
"```{literalinclude} Si001.py\n",
":lineno-match:\n",
@@ -148,9 +174,18 @@
{
"cell_type": "markdown",
"id": "19fbd486-b0c1-450c-a00d-79984945aefd",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
+ "\n",
"The calculation took few seconds and the result is very close to the calculation with all scattering paths.\n",
"\n",
"Only 0.01% of 3{sup}`rd` order paths were actually taken into account\n",
diff --git a/msspecbook/_build/html/_sources/Activity07/Activity07_light.ipynb b/msspecbook/_build/html/_sources/Activity07/Activity07_light.ipynb
new file mode 100644
index 0000000..a768777
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity07/Activity07_light.ipynb
@@ -0,0 +1,171 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "42cfa8b1-20d2-47e4-a1f0-161c4517df2c",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "(path-filtering)=\n",
+ "# Activity 7: Large clusters and path filtering"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2f802e59-3ebc-4c5d-a034-42a706044d87",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "So far you have seen that multiple scattering calculations with MsSpec can use two different algorithms: *matrix inversion* or *Rehr Albers series expansion*. When matrix inversion becomes impossible because the kinetic energy is too high and the number of atoms is too large, serial expansion is the alternative. This algorithm requires very little memory but it processes the scattering paths sequentially, which can lead to very long calculation times.\n",
+ "\n",
+ "In this activity, we will explore how to configure MsSpec to reduce this calculation time to compute the signal from a deep emitter in Si(001).\n",
+ "\n",
+ "\n",
+ "\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2a2f7c01-3a7e-46d4-90aa-6ba2eada6337",
+ "metadata": {},
+ "source": [
+ "## The number of scattering paths\n",
+ "\n",
+ "To fix the idea, we will first evaluate how many scattering paths we need to compute for an emitter in the subsurface (2{sup}`nd` plane) or in the bulk (7{sup}`th` plane) of a Si(001) cluster."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f78af28-335e-4f6b-9b98-929f9e6965f8",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Create a cluster of Si(001) with the emitter in the subsurface, 40 Å diameter with 2 planes (since atoms below the emitter can be ignored at high kinetic energies).\n",
+ "\n",
+ "1. For an emitter in the subsurface, we can use single scattering (see {ref}`forward-scattering`). How many paths would be generated for this calculation ?\n",
+ "\n",
+ "2. Same question for an emitter in the 7{sup}`th` plane. If we were able to treat each scattering path within only 1 µs. How long would be such calculation ?\n",
+ "\n",
+ "```{note}\n",
+ "Remember that \n",
+ "1. for an emitter in plane $p$, the scattering order has to be at least the number of planes `above` the emitter\n",
+ "2. The number of scattering paths of order $n$ corresponds to the number of possibilities of arranging up to $n$ atoms (taking order into account).\n",
+ "```\n",
+ "\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5de975f5-8f3d-432e-bfcc-8455bc50a862",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## Paths filtering in MsSpec\n",
+ "\n",
+ "As you may expect, not all paths contribute significantly to the total intensity. This is why we can filter out some scattering paths and drastically reduce the computation time. MsSpec offers several filters for this. The 3 most common filters are:\n",
+ "1. the `forward_scattering` filter which allows all paths where each scattering angle is within a cone of defined aperture\n",
+ "2. the `backward_scattering` filter which is similar to the previous one but for backscattering direction\n",
+ "3. the `distance` filter which rejects all paths longer than a threshold distance\n",
+ "\n",
+ "The following figure illustrate the effect of theses filters on scattering paths\n",
+ "\n",
+ ":::{figure-md} filters-fig\n",
+ "\n",
+ "\n",
+ "Some examples of scattering paths with `forward_scattering`, `backward_scattering` and `distance` filters selected. The accepted forward angle is 45°, the accepted backscattering angle is 20° and the threshold distance is $6a_0$ where $a_0$ is the lattice parameter. Note that the yellow path is rejected but if the `off_cone_events` option is set to a value > 1, then it could have been accepted.\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "28aae2f7-2af9-4630-b89d-ab634725ad79",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "## Application to a deep plane in a Si(001) sample\n",
+ "\n",
+ "The following script will compute the contribution of a Si(2p) atom in the 4{sup}`th` plane of a Si(001) cluster at scattering order 3.\n",
+ "\n",
+ "Taking into account all scattering paths took 15 minutes to compute.\n",
+ "\n",
+ "(msd-paper)=\n",
+ ":::{seealso}\n",
+ "based on this paper from S. Tricot *et al.*\n",
+ "[J. Electron. Spectrosc. Relat. Phenom. **256** 147176 (2022)](https://doi.org/10.1016/j.elspec.2022.147176)\n",
+ ":::\n",
+ "\n",
+ "\n",
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "\n",
+ "The [following script](Si001.py \"download\") is almost completed, try to define path filtering options (no backscattering, accept all paths with forward angles < 40° and reject paths longer than the diameter of the cluster).\n",
+ "\n",
+ "```{literalinclude} Si001.py\n",
+ ":lineno-match:\n",
+ ":emphasize-lines: 37-41\n",
+ "```\n",
+ "\n",
+ "1. How long was your calculation ?\n",
+ "2. How does it compare to the calculation with **all** scattering paths up to order 3 ?\n",
+ "3. What is the proportion of scattering paths of order 3 that were actually taken into account ?\n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity08/Activity08.ipynb b/msspecbook/_build/html/_sources/Activity08/Activity08.ipynb
index 658c800..49a80aa 100644
--- a/msspecbook/_build/html/_sources/Activity08/Activity08.ipynb
+++ b/msspecbook/_build/html/_sources/Activity08/Activity08.ipynb
@@ -3,7 +3,13 @@
{
"cell_type": "markdown",
"id": "2ff5929f-c066-496f-b078-0bbc2ab49428",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"# Activity 8: Inequivalent emitters and the XPD of a substrate"
]
@@ -92,9 +98,17 @@
{
"cell_type": "markdown",
"id": "8a3a48ef-196f-435a-b342-3a73e62160f8",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- ":::{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{figure-md} AlN-fig3\n",
"\n",
@@ -102,7 +116,7 @@
"Number of different clusters to build for Al(2p) and N(1s) in 3 planes\n",
":::\n",
"\n",
- ":::"
+ "```"
]
},
{
@@ -123,9 +137,17 @@
{
"cell_type": "markdown",
"id": "abc64fdb-5895-4112-a987-66b3420d78eb",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
":::{figure-md} AlN-fig4\n",
"\n",
diff --git a/msspecbook/_build/html/_sources/Activity08/Activity08_light.ipynb b/msspecbook/_build/html/_sources/Activity08/Activity08_light.ipynb
new file mode 100644
index 0000000..427e495
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity08/Activity08_light.ipynb
@@ -0,0 +1,147 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "2ff5929f-c066-496f-b078-0bbc2ab49428",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Activity 8: Inequivalent emitters and the XPD of a substrate"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "394b0c02-f28e-4074-86e5-9dfdf0447adb",
+ "metadata": {},
+ "source": [
+ "XPD can be used to study the adsorption of atoms or molecules on surfaces ([Activity 3](#ssc)), or atomic substitutions on surfaces ([Activity 2](#exp-setup)). In this case, modeling is relatively straightforward, since only one emitter atom is involved.\n",
+ "\n",
+ "We have seen from previous examples that, for kinetic energies $\\gtrsim$ 500 eV, the use of Rehr-Albers series expansion and scattering path filtering give access to the intensity of deeper emitter atoms ([Activity 7](#path-filtering)).\n",
+ "This is the key to computing the total photodiffraction signal of a *substrate*. As emitted photoelectrons originate from highly localized core levels around the atoms, the total signal corresponds to the (incoherent) sum of the intensities of all inequivalent emitters in the probed volume.\n",
+ "\n",
+ "Let's take a look at how this is done on the following example. \n",
+ "\n",
+ "\n",
+ "## The Aluminium Nitride (AlN) polarity\n",
+ "\n",
+ "In this example, we will compute polar diagrams of an aluminum nitride substrate.\n",
+ "\n",
+ "In a work published in 1999, Lebedev *et al.* demonstrated that Photoelectron diffraction can be used as a non invasive tool to unambiguously state the polarity of an AlN surface. Aluminium nitride cristallizes in an hexagonal cell and the authors experimentally showed that the polarity of the surface can be controlled by the annealing temperature during the growth. Both polarities are sketched in the [figure](#AlN-fig1) below.\n"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "5a4036dc-d087-419f-9a44-749a8b313d5c",
+ "metadata": {},
+ "source": [
+ "(aln-paper)=\n",
+ ":::{seealso}\n",
+ "based on this paper from V. Lebedev *et al.*\n",
+ "[J. Cryst. Growth. **207(4)** p266-72 (1999)](https://doi.org/10.1016/S0022-0248(99)00375-9)\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc1cf08e-77ba-49ea-99a9-8a7bac7c98c7",
+ "metadata": {},
+ "source": [
+ ":::{figure-md} AlN-fig1\n",
+ "\n",
+ "\n",
+ "AlN hexagonal lattice. Left) N polarity with nitrogen terminated surface and AlN{sub}`4` tetrahedrons pointing downward. Right) Al polarity with aluminium terminated surface and AlN{sub}`4` tetrahedrons pointing upward\n",
+ ":::"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "fc180c7b-eb23-47c6-8d18-e092bc777843",
+ "metadata": {},
+ "source": [
+ "The AlN(0001) and (00.-1) faces share the same crystallograpphic symmetry and the Al and N atoms have the same geometrical surrounding differing only in the exchange of Al and N atoms ({numref}`Fig. %s `).\n",
+ "\n",
+ "It is thus expected that Al(2p) and N(1s) XPD patterns exhibit almost the same features with only small differences due to the contrast between Al and N scattering amplitudes.\n",
+ "\n",
+ ":::{figure-md} AlN-fig2\n",
+ "\n",
+ "\n",
+ "Side views of N- or Al- terminated surfaces showing nearest neighbours main polar crystallographic directions. The inset shows the experimental Al(2p)/N(1s) ratio versus polar angle for both AlN polarities (taken from [Lebedev *et al.*](#aln-paper)).\n",
+ ":::\n",
+ "\n",
+ "The strongest differences in photoemission intensities suitable for a quick and unambiguous determination of polarity were found in the (10-10) azimuthal plane at **32°** and **59°** (polar scans in the inset of {numref}`Fig. %s `).\n",
+ "\n",
+ "These are the directions of short neighbor distances between the atoms of the same element (32°) and between Al and N atoms (58.5°), respectively.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86c20245-abca-4587-bccf-90e0fb09f73c",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Using the crystal view in {numref}`Fig. %s ` and assuming that we want to compute Al(2p) and N(1s) intensities for emitters located in 3 different planes to get a *substrate* signal. How many clusters do we need to build ? \n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "82973b9c-bf0c-462a-8114-17ac1e83b799",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Download [this script](AlN.py) and fill in the lines indicated by the comments “FILL HERE”. Run the calculation and check that you are reproducing polar scan of {numref}`Fig. %s `.\n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity09/Activity09.ipynb b/msspecbook/_build/html/_sources/Activity09/Activity09.ipynb
index e72a966..2b35a1c 100644
--- a/msspecbook/_build/html/_sources/Activity09/Activity09.ipynb
+++ b/msspecbook/_build/html/_sources/Activity09/Activity09.ipynb
@@ -4,7 +4,13 @@
"attachments": {},
"cell_type": "markdown",
"id": "aa43e0e7-0c18-4750-9e2b-3a48f106d2ca",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"(RFactor)=\n",
"# Activity 9: Comparing simulation and experiment with R-factors\n",
@@ -33,7 +39,13 @@
{
"cell_type": "markdown",
"id": "91c03801-b46b-4844-8c89-655700419063",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"::::{tab-set}\n",
"\n",
@@ -61,9 +73,18 @@
{
"cell_type": "markdown",
"id": "d1be5047-fb75-4e98-a6a2-fc6f678e68ff",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
+ "\n",
"Here is the code of the `create_cluster` function\n",
"\n",
":::{literalinclude} COFe_completed.py\n",
@@ -98,9 +119,18 @@
{
"cell_type": "markdown",
"id": "670cbd24-efd4-4c51-89e2-f1d96c53908d",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
+ "\n",
"Here are the code of the nested *for loops*\n",
"\n",
":::{literalinclude} COFe_completed.py\n",
@@ -144,9 +174,17 @@
{
"cell_type": "markdown",
"id": "aa8d2dc4-286a-441d-9c21-dab6bac8145c",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
- "```{toggle}\n",
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
"\n",
"6 R-factors out of 12 do agree that *variable set n°30* gives the best agreement. The set n°30 corresponds to\n",
"$\\theta=55°$ and $\\phi=0°$.\n",
diff --git a/msspecbook/_build/html/_sources/Activity09/Activity09_light.ipynb b/msspecbook/_build/html/_sources/Activity09/Activity09_light.ipynb
new file mode 100644
index 0000000..d6c71d1
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity09/Activity09_light.ipynb
@@ -0,0 +1,150 @@
+{
+ "cells": [
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "id": "aa43e0e7-0c18-4750-9e2b-3a48f106d2ca",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "(RFactor)=\n",
+ "# Activity 9: Comparing simulation and experiment with R-factors\n",
+ "In order to extract precise crystallographic information from electronic spectroscopy, we need to compare MsSpec calculations with experimental results and adjust the modelling parameters to simulate the experiment as accurately as possible.\n",
+ "\n",
+ "*R-factors* (reliability factors) are commonly used for this task. In the following example, we will see how MsSpec can extract the adsorption geometry of a molecule.\n",
+ "\n",
+ "## The unusual tilt of CO molecule on Fe(001)\n",
+ "The carbon monoxide molecule can be adsorbed onto a Fe(001) surface in the hollow site. It was experimentally demonstrated that the CO molecule is tilted by 55$\\pm$2° in <100> azimuthal directions. The molecule is bonded to the Fe surface by the carbon atom and the adsorption height was estimated to be $\\sim$ 0.6 Å.\n",
+ "\n",
+ "(COFe-paper)=\n",
+ ":::{seealso}\n",
+ "based on this paper from R. S. Saiki *et al.*\n",
+ "[Phys. Rev. Lett. **63(3)** p283-6 (1989)](https://doi.org/10.1103/PhysRevLett.63.283)\n",
+ ":::\n",
+ "\n",
+ "We will try to reproduce the polar scan of the figure below of CO adsorbed in the hollow site of the Fe(001) surface with simple single scattering calculations with MsSpec and by using R-Factors to find the best adsorption geometry. We will use the simple cluster displayed on the left hand side of the figure.\n",
+ "\n",
+ ":::{figure-md} COFe-fig1\n",
+ "\n",
+ "\n",
+ "Small cluster used for SSC calculations (left) and (right) Normalized polar scan of the C(1s) at 1202 eV for [100] and [1-10] azimths.\n",
+ ":::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "91c03801-b46b-4844-8c89-655700419063",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "Download [this script](./COFe.py) and write the body of the function `create_cluster`. The function should return a \n",
+ "small cluster of 5 Fe atoms with the CO molecule adsorbed like in figure {numref}`Fig. %s ` below. The function\n",
+ "will accept 4 keyword arguments to control the adsorption geometry.\n",
+ "\n",
+ "```{figure-md} COFe-fig2\n",
+ "\n",
+ "\n",
+ "Adsorption geometry of carbon monoxide on Fe(001).\n",
+ "```\n",
+ "\n",
+ "```{note}\n",
+ "Remember to use the [`ase.build.bulk`](https://wiki.fysik.dtu.dk/ase/ase/build/build.html#ase.build.bulk), the [`msspec.utils.hemispherical_cluster`](https://msspec.cnrs.fr/faq/hemispherical_cluster/hemispherical_cluster.html#hemispherical-cluster-faq) and the [`ase.build.add_adsorbate`](https://wiki.fysik.dtu.dk/ase/ase/build/surface.html#ase.build.add_adsorbate) \n",
+ "functions.\n",
+ "```\n",
+ "\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c7697c4f-949b-4261-abaf-96eefaa9a6ba",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "Now that the `create_cluster` function is done, look at the rest of the script. The next function is called `compute_polar_scan` and will obviously be used to compute the $\\theta$-scan of the C1s for a given cluster geometry.\n",
+ "Finally there is the *Main part* that is built in two sections:\n",
+ "\n",
+ "1. A section containing nested *for loops*\n",
+ "2. A final section for *R-Factor analysis*\n",
+ "\n",
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "1. Complete the nested for loops in section 1) in order to compute polar scans for CO molecule tilted from 45° to 60° with a 1° step and aligned either along the [100] direction of Fe, 30° from this direction or along [110]. The adsorption height is 0.6 Å and the bond length is 1.157 Å.\n",
+ "2. What is the best $(\\theta, \\phi)$ according to the R-Factor analysis\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f7827b3c-0cac-42e2-a587-8b30ee3632b4",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "MsSpec uses 12 different R-Factors formula to compare the calculted curve to the experimental data. The set of parameters giving the best agreement according to the majority of those 12 R-factors is assumed to be the best solution. Here are the R-factors formula used in MsSpec\n",
+ "\n",
+ ":::{figure-md} rfactors-formula\n",
+ "\n",
+ "\n",
+ "The 12 R-Factors used in MsSpec. The Pendry's R-Factor is n°11.\n",
+ ":::\n",
+ "\n",
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "How many R-Factors do agree that $(\\theta,\\phi)=(55,0)$ gives the best agreement ?\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/_sources/Activity10/Activity10.ipynb b/msspecbook/_build/html/_sources/Activity10/Activity10.ipynb
index d491448..9f9ce29 100644
--- a/msspecbook/_build/html/_sources/Activity10/Activity10.ipynb
+++ b/msspecbook/_build/html/_sources/Activity10/Activity10.ipynb
@@ -3,7 +3,13 @@
{
"cell_type": "markdown",
"id": "38d3e621-e866-43e1-9c92-f473d1e755c0",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"# Activity 10: Parallelization and multi-processing in MsSpec"
]
@@ -11,7 +17,13 @@
{
"cell_type": "markdown",
"id": "1dccb5e3-1cd3-4732-a7ba-81a8a94c89dc",
- "metadata": {},
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
"source": [
"As you can see from the previous examples, a complete simulation may require several multiple scattering calculations, for instance to calculate the total intensity of a substrate or to optimize the geometry of a system. As the calculations are often time consuming, it can be useful to distribute these tasks over several processors to make the most of hardware resources.\n",
"Although MsSpec is not fully parallelized, the code does offer a number of features, which we will explore here.\n",
@@ -76,37 +88,18 @@
"tags": []
},
"source": [
+ "```{admonition} *Solution...*\n",
+ ":class: tip\n",
+ ":class: dropdown\n",
+ "\n",
":::{literalinclude} COFe_mp_completed.py\n",
":lineno-start: 63\n",
":linenos: true\n",
":lines: 63-86\n",
":emphasize-lines: 6,7, 9,10, 18\n",
- ":::"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1b25de5e-4402-4746-8082-9f7d8362b3f6",
- "metadata": {
- "editable": true,
- "slideshow": {
- "slide_type": ""
- },
- "tags": [
- "answer",
- "hide"
- ]
- },
- "outputs": [],
- "source": [
- "from IPython.display import Markdown\n",
+ ":::\n",
"\n",
- "Markdown(\"\"\"\n",
- "\n",
- "Hello world\n",
- "\n",
- "\"\"\")"
+ "```"
]
}
],
diff --git a/msspecbook/_build/html/_sources/Activity10/Activity10_light.ipynb b/msspecbook/_build/html/_sources/Activity10/Activity10_light.ipynb
new file mode 100644
index 0000000..f762b0e
--- /dev/null
+++ b/msspecbook/_build/html/_sources/Activity10/Activity10_light.ipynb
@@ -0,0 +1,102 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "38d3e621-e866-43e1-9c92-f473d1e755c0",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "# Activity 10: Parallelization and multi-processing in MsSpec"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1dccb5e3-1cd3-4732-a7ba-81a8a94c89dc",
+ "metadata": {
+ "editable": true,
+ "slideshow": {
+ "slide_type": ""
+ },
+ "tags": []
+ },
+ "source": [
+ "As you can see from the previous examples, a complete simulation may require several multiple scattering calculations, for instance to calculate the total intensity of a substrate or to optimize the geometry of a system. As the calculations are often time consuming, it can be useful to distribute these tasks over several processors to make the most of hardware resources.\n",
+ "Although MsSpec is not fully parallelized, the code does offer a number of features, which we will explore here.\n",
+ "\n",
+ "## Matrix inversion parallelization\n",
+ "\n",
+ "When available during installation, MsSpec will link with the system lapack library. It will be used to invert the matrix in the `inversion` option of the MsSpec `calculator`. To allow MsSpec to use this shared memory parallelism, you need to set the number of cores to be used in the `OMP_NUM_THREADS` environment variable.\n",
+ "\n",
+ "You can set this variable just for the execution of your script. For example:\n",
+ "\n",
+ "```sh\n",
+ "$ OMP_NUM_THREADS=12 python my_script.py\n",
+ "```\n",
+ "\n",
+ "will use 12 cores for inverting the matrix in your script.\n",
+ "\n",
+ "It is also possible to set environment variable inside your python script.\n",
+ "\n",
+ "```python\n",
+ "import os\n",
+ "\n",
+ "os.environ['OMP_NUM_THREADS'] = 12\n",
+ "```\n",
+ "\n",
+ "It may be useful for technical reasons or to use different number of cores in some parts of your script.\n",
+ "\n",
+ "## Process-based parallelism\n",
+ "\n",
+ "Another kind of parallelization used in MsSpec is multiprocessing. Quite often, you need to run different *independent* calculations. MsSpec provides a simple *looper* that can be useful for multiprocessing. Let's demonstrate it with the previous example CO/Fe(001).\n",
+ "\n",
+ "[This script](COFe_mp.py) is the multiprocessed version of the previous one. You can see that the previous nested for loops are now replaced by some declarative content (lines 63-67) and the definition of a `process` function (whose name \n",
+ "can be changed).\n",
+ "\n",
+ "With the `msspec.looper` package, the user define `Sweep` objects that are parameters of the calculation or of the cluster. The `process` function must accept as many arguments as parameters to sweep (+ the `**kwargs`).\n",
+ "\n",
+ "A `Looper` object is created (line 76) and the `process` function is set to its `pipeline` attribute (line 77). When MsSpec will run the `looper`, it will combine all parameters values to unique individual sets and MsSpec will distribute the calculations over the number of processors specified in the `ncpu` option.\n",
+ "\n",
+ ":::{literalinclude} COFe_mp.py\n",
+ ":lineno-start: 63\n",
+ ":linenos: true\n",
+ ":lines: 63-84\n",
+ ":::\n",
+ "\n",
+ "\n",
+ "::::{tab-set}\n",
+ "\n",
+ ":::{tab-item} Quiz\n",
+ "In the paper discussed in {ref}`RFactor`, experimental values of the anisotropy suggest an adsorption height between 0.2 and 0.6 Å. Modify the script to add another sweep for variying the adsorption height of the CO molecule.\n",
+ ":::\n",
+ "\n",
+ "::::"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/msspecbook/_build/html/backmatter.html b/msspecbook/_build/html/backmatter.html
index 179d249..3d37122 100644
--- a/msspecbook/_build/html/backmatter.html
+++ b/msspecbook/_build/html/backmatter.html
@@ -32,7 +32,7 @@
-
+
diff --git a/msspecbook/_build/html/genindex.html b/msspecbook/_build/html/genindex.html
index fee843d..5ae814b 100644
--- a/msspecbook/_build/html/genindex.html
+++ b/msspecbook/_build/html/genindex.html
@@ -31,7 +31,7 @@
-
+
diff --git a/msspecbook/_build/html/intro.html b/msspecbook/_build/html/intro.html
index a665820..0396a08 100644
--- a/msspecbook/_build/html/intro.html
+++ b/msspecbook/_build/html/intro.html
@@ -32,7 +32,7 @@
-
+
diff --git a/msspecbook/_build/html/objects.inv b/msspecbook/_build/html/objects.inv
index de57d39..27ef00d 100644
Binary files a/msspecbook/_build/html/objects.inv and b/msspecbook/_build/html/objects.inv differ
diff --git a/msspecbook/_build/html/reports/Activity04/Activity04.err.log b/msspecbook/_build/html/reports/Activity04/Activity04.err.log
deleted file mode 100644
index 98ce639..0000000
--- a/msspecbook/_build/html/reports/Activity04/Activity04.err.log
+++ /dev/null
@@ -1,43 +0,0 @@
-Traceback (most recent call last):
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/jupyter_core/utils/__init__.py", line 154, in wrapped
- asyncio.get_running_loop()
-RuntimeError: no running event loop
-
-During handling of the above exception, another exception occurred:
-
-Traceback (most recent call last):
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/jupyter_cache/executors/utils.py", line 58, in single_nb_execution
- executenb(
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/nbclient/client.py", line 1319, in execute
- return NotebookClient(nb=nb, resources=resources, km=km, **kwargs).execute()
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/jupyter_core/utils/__init__.py", line 158, in wrapped
- return loop.run_until_complete(inner)
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- File "/opt/pyenv/versions/3.11.3/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
- return future.result()
- ^^^^^^^^^^^^^^^
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/nbclient/client.py", line 709, in async_execute
- await self.async_execute_cell(
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/nbclient/client.py", line 1062, in async_execute_cell
- await self._check_raise_for_error(cell, cell_index, exec_reply)
- File "/opt/msspec/msspec_venv/lib/python3.11/site-packages/nbclient/client.py", line 918, in _check_raise_for_error
- raise CellExecutionError.from_cell_and_msg(cell, exec_reply_content)
-nbclient.exceptions.CellExecutionError: An error occurred while executing the following cell:
-------------------
-```{toggle}
-
-:::{literalinclude} Ni_chain1.py
-:lines: 1-9
-:linenos: true
-
-```
-------------------
-
-
- [36mCell[39m[36m [39m[32mIn[1][39m[32m, line 1[39m
-[31m [39m[31m```{toggle}[39m
- ^
-[31mSyntaxError[39m[31m:[39m invalid syntax
-
-
diff --git a/msspecbook/_build/html/search.html b/msspecbook/_build/html/search.html
index faac129..b0b0582 100644
--- a/msspecbook/_build/html/search.html
+++ b/msspecbook/_build/html/search.html
@@ -30,7 +30,7 @@
-
+
diff --git a/msspecbook/_build/html/searchindex.js b/msspecbook/_build/html/searchindex.js
index 4c79c85..1e0a5b4 100644
--- a/msspecbook/_build/html/searchindex.js
+++ b/msspecbook/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"alltitles": {"Activity 10: Parallelization and multi-processing in MsSpec": [[9, null]], "Activity 11: Spectral radius and convergence": [[10, null]], "Activity 1: Getting started": [[0, null]], "Activity 2: Setting up the \u201cexperiment\u201d": [[1, null]], "Activity 3: Adsorbates and the single scattering approach": [[2, null]], "Activity 4: From single scattering to multiple scattering": [[3, null]], "Activity 5: Multiple scattering in the forward scattering regime": [[4, null]], "Activity 6: Effect of the temperature": [[5, null]], "Activity 7: Large clusters and path filtering": [[6, null]], "Activity 8: Inequivalent emitters and the XPD of a substrate": [[7, null]], "Activity 9: Comparing simulation and experiment with R-factors": [[8, null]], "Application to a deep plane in a Si(001) sample": [[6, "application-to-a-deep-plane-in-a-si-001-sample"]], "Barebone script for MsSpec": [[0, "barebone-script-for-msspec"]], "Building a chain of atoms": [[3, "building-a-chain-of-atoms"]], "Building atomic systems": [[0, "building-atomic-systems"]], "Building the cluster": [[1, "building-the-cluster"]], "Compute an azimuthal scan": [[1, "compute-an-azimuthal-scan"]], "Computing the scattering factor": [[2, "computing-the-scattering-factor"]], "Creating the TiSe2 cluster": [[4, "creating-the-tise2-cluster"]], "Effect of the scattering order": [[4, "effect-of-the-scattering-order"]], "Final word": [[11, null]], "Future developpements": [[11, "future-developpements"]], "How to install MsSpec": [[11, "how-to-install-msspec"]], "Interferences due to backscattering": [[2, "interferences-due-to-backscattering"]], "Matrix inversion parallelization": [[9, "matrix-inversion-parallelization"]], "Our work": [[11, "our-work"]], "Oxygen on Rh(001)": [[2, "oxygen-on-rh-001"]], "PED of the 1T-TiSe2 surface": [[4, "ped-of-the-1t-tise2-surface"]], "PED polar scan for Cu(001)": [[0, "ped-polar-scan-for-cu-001"]], "Paths filtering in MsSpec": [[6, "paths-filtering-in-msspec"]], "Polar scans of Ni atomic chains": [[3, "polar-scans-of-ni-atomic-chains"]], "Process-based parallelism": [[9, "process-based-parallelism"]], "Sb-induced smooth growth of Ag on Ag(111) example": [[1, "sb-induced-smooth-growth-of-ag-on-ag-111-example"]], "Shaping a cluster": [[0, "shaping-a-cluster"]], "Solution\u2026": [[3, null], [3, null]], "Surface and bulk effects of the temperature": [[5, "surface-and-bulk-effects-of-the-temperature"]], "The Aluminium Nitride (AlN) polarity": [[7, "the-aluminium-nitride-aln-polarity"]], "The number of scattering paths": [[6, "the-number-of-scattering-paths"]], "The script": [[5, "the-script"]], "The unusual tilt of CO molecule on Fe(001)": [[8, "the-unusual-tilt-of-co-molecule-on-fe-001"]], "Welcome to this small MsSpec tour": [[12, null]], "if you need help to start\u2026": [[3, null]]}, "docnames": ["Activity01/Activity01", "Activity02/Activity02", "Activity03/Activity03", "Activity04/Activity04", "Activity05/Activity05", "Activity06/Activity06", "Activity07/Activity07", "Activity08/Activity08", "Activity09/Activity09", "Activity10/Activity10", "Activity11/Activity11", "backmatter", "intro"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinxcontrib.bibtex": 9}, "filenames": ["Activity01/Activity01.ipynb", "Activity02/Activity02.ipynb", "Activity03/Activity03.ipynb", "Activity04/Activity04.ipynb", "Activity05/Activity05.ipynb", "Activity06/Activity06.ipynb", "Activity07/Activity07.ipynb", "Activity08/Activity08.ipynb", "Activity09/Activity09.ipynb", "Activity10/Activity10.ipynb", "Activity11/Activity11.ipynb", "backmatter.md", "intro.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [1, 4, 5, 6, 7, 8, 9], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "00": 7, "0001": 7, "001": [5, 9], "004": 4, "006": 6, "01": 6, "010": 8, "02": 2, "05": 2, "0f": 5, "1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 12], "10": [0, 1, 2, 7, 8, 12], "100": [5, 8], "1000": 5, "1000k": 5, "101": 3, "1030": 4, "1083": 7, "11": [7, 8], "110": 8, "111": 2, "114": 6, "12": [8, 9], "1202": 8, "121": 1, "13": [], "1382": 6, "14": 5, "1407": 7, "147176": 6, "15": [1, 4, 6, 8], "1525": 6, "157": [8, 9], "16": [], "18": [], "1986": 5, "1989": [3, 8], "1998": 2, "1999": 7, "1e": 6, "1e12": 4, "2": [0, 2, 3, 5, 6, 7, 8, 9, 12], "20": [1, 6, 7], "2012": [4, 5], "2022": 6, "207": 7, "21": 7, "22": [1, 7], "24": [], "240": 1, "25": [4, 7], "256": 6, "26": [], "27": [5, 8], "28": 6, "298k": 5, "2d": 4, "2f": 2, "2p": [0, 4, 5, 6, 7], "2p3": 0, "3": [0, 3, 4, 5, 6, 7, 8, 9, 12], "30": [1, 6, 7, 8], "300": 5, "31": [], "32": 7, "34": 5, "343": 5, "35": [7, 8], "37": [], "39": 3, "3f": 4, "3rd": 0, "4": [0, 1, 2, 4, 5, 6, 7, 8, 9, 12], "40": [1, 6], "400": 5, "41": [], "43": 6, "44": [], "45": [1, 3, 5, 6, 8, 9], "450": 4, "48": [], "499": 3, "4d": 1, "4planes3plan": [], "5": [1, 3, 5, 6, 7, 8, 12], "50": 9, "500": 7, "51": 5, "535": 4, "54": 6, "55": [1, 8], "554": 4, "560": 5, "58": 7, "59": 7, "5th": [], "6": [1, 4, 6, 7, 8, 9, 12], "60": [4, 8, 9], "606": 4, "61": [], "63": [8, 9], "64": 4, "65": 2, "66": [], "67": 9, "68": [], "685": 4, "69": [], "6a_0": 6, "7": [5, 7, 12], "70": [4, 7], "71": [], "72": 7, "723": 2, "739": 6, "76": 9, "77": 9, "79": [], "8": [1, 2, 4, 12], "80": [6, 7], "81": 2, "83": 5, "84": [], "86": [], "9": [5, 9, 12], "90": 6, "900": 4, "945": 6, "975": 7, "98": 5, "A": [2, 3, 5, 8, 9], "AED": 0, "ASE": [0, 1, 2, 4], "As": [0, 2, 4, 6, 7, 9], "But": 4, "By": 2, "For": [1, 3, 4, 5, 6, 9], "If": 6, "In": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "It": [1, 4, 7, 8, 9], "Not": 0, "On": 2, "One": 6, "Or": 0, "The": [0, 1, 2, 3, 4, 9], "There": 0, "These": 7, "To": [0, 1, 2, 4, 5, 6, 9], "With": [5, 6, 9], "_": 7, "__main__": 5, "__name__": 5, "_plotopt": 5, "a_0": [4, 6], "abl": 6, "about": [2, 4], "abov": [0, 2, 4, 5, 6], "abscissa": 8, "absolut": [], "absorb": [5, 7], "accept": [6, 8, 9], "access": 7, "accord": 8, "accordingli": [], "account": [0, 4, 6], "accur": [2, 4, 8], "accuraci": [2, 3], "act": 1, "activ": 12, "actual": [5, 6], "ad": [2, 7], "add": [1, 2, 5, 6, 7, 9], "add_adsorb": [2, 8], "add_column": [1, 5, 6, 7], "add_dset": [5, 7], "add_view": [5, 7], "adjust": 8, "admonit": [], "adsorb": [8, 12], "adsorpt": [2, 7, 8, 9], "advantag": 2, "after": [4, 8], "agit": 5, "agre": 8, "agreement": [1, 8], "al": [1, 2, 3, 4, 6, 7, 8], "al_al": 7, "al_kalpha": [5, 6, 7], "al_n": 7, "al_plan": 7, "al_sid": 7, "alber": [4, 6, 7], "algorithm": [0, 2, 3, 4, 5, 6, 7], "algortithm": 3, "align": [1, 4, 8], "all": [0, 2, 3, 5, 6, 7, 9, 12], "all_data": [], "all_t": 5, "all_theta": 5, "all_z": 2, "allow": [0, 6, 9], "almost": [4, 6, 7], "aln_complet": [], "along": [3, 8], "alreadi": 4, "also": [4, 5, 8, 9], "altern": 6, "although": [1, 3, 9], "altitud": 2, "aluminum": 7, "amplitud": 7, "an": [0, 2, 3, 4, 5, 6, 7, 9], "analysi": [5, 7, 8], "analyz": 0, "angl": [1, 5, 6, 7, 8, 9], "angstrom": 2, "angstr\u00f6m": [4, 8, 9], "angular_accept": [1, 5, 7], "ani": 2, "anisotropi": [5, 9], "anisotropy_dset": 5, "anisotropy_view": 5, "anneal": 7, "annular": 2, "anoth": [4, 9], "answer": [], "apart": 2, "apec": 0, "apertur": 6, "append": [5, 7, 8], "approach": [0, 3, 4, 12], "approxim": [2, 3, 4], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "arang": [2, 5, 6, 7, 8], "arbitrarili": 5, "argument": [8, 9], "aris": 7, "around": [4, 7], "arrai": 5, "arrang": 6, "articl": 5, "ase": [0, 1, 2, 3, 4, 5, 6, 7, 8], "assum": [1, 6, 7, 8], "atom": [1, 2, 4, 5, 6, 7, 8], "atomist": 0, "attach": 2, "attempt": 5, "attribut": [1, 9], "author": 7, "autoscal": [5, 7], "avail": [0, 4, 9], "averag": 5, "average_sampl": [1, 5, 7], "averaged_tl": [5, 6], "axi": 4, "azimth": 8, "azimut": 5, "azimuth": [5, 7, 8, 9], "b": [1, 3, 5], "b_0": 4, "backscatt": [3, 6], "backward_scatt": 6, "bar": 7, "barton": 3, "base": [0, 1, 2, 3, 4, 5, 6, 7, 8], "basi": 0, "beamlin": 1, "becaus": [3, 6], "becom": [2, 6], "been": 6, "begin": 2, "being": [2, 5], "belong": 8, "below": [2, 3, 4, 5, 6, 7, 8], "best": 8, "better": 1, "between": [0, 1, 2, 4, 5, 7, 8, 9], "bewteen": 3, "bit": 4, "black": 9, "blue": [1, 6], "bodi": 8, "boltzmann": 5, "bond": [2, 8], "bond_length": [8, 9], "both": [2, 3, 5, 7], "bright": 2, "bring": 12, "build": [2, 4, 5, 6, 7, 8], "built": 8, "bulk": [0, 1, 6, 7, 8], "c": [4, 5, 7, 8], "c1": 8, "c_0": 4, "calc": [0, 1, 2, 4, 5, 6, 7], "calc_": 9, "calcul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "calculation_paramet": [1, 2, 4, 5, 6, 7], "calculationparamet": 5, "calcult": 8, "call": 8, "can": [0, 2, 3, 5, 6, 7, 8, 9], "cancel": 3, "cannot": 4, "carbon": 8, "carri": 2, "case": [2, 7], "categori": 1, "cell": [1, 4, 7], "center": [2, 4], "chain": 2, "chain_length": [], "chang": [1, 2, 5, 9], "check": 7, "chosen": 5, "cif": 0, "circl": 2, "cite": 5, "class": [2, 3], "clear": 5, "close": [3, 6], "cluster": [2, 5, 7, 8, 9, 12], "cnr": 0, "co": 9, "code": [0, 2, 4, 6, 8, 9], "cofe": [], "cofe_complet": [], "cofe_mp": [], "cofe_mp_complet": [], "col_nam": 5, "col_valu": 5, "column": [4, 7], "com": 2, "combin": 9, "come": [2, 3, 5], "comment": [2, 7, 9], "common": [5, 6], "commonli": 8, "compar": [1, 3, 6, 9, 12], "comparison": [0, 1, 6], "complet": [2, 4, 5, 6, 8, 9], "complex": 4, "compon": 0, "comput": [0, 3, 4, 5, 6, 7, 8], "computation": 2, "compute_polar_scan": [8, 9], "concept": [0, 12], "conclud": [0, 4], "cone": 6, "configur": [1, 6], "consequ": 3, "consid": 2, "constant": [4, 5], "construct": 2, "consum": 9, "consumpt": 2, "contain": [0, 1, 4, 5, 8], "content": 9, "contrast": 7, "contribut": [0, 6], "control": [5, 7, 8], "converg": [1, 4], "convert": 9, "copi": [7, 8], "copper": [0, 4, 5], "core": [7, 9], "correctli": 1, "correspond": [4, 6, 7, 8], "could": 6, "cover": 0, "cp": 8, "creat": [0, 1, 2, 3, 6, 8, 9], "create_clust": [5, 7, 8, 9], "cristal": 7, "cross_sect": [1, 5, 6, 7, 8, 9], "cruguel": 1, "cryst": 7, "crystal": [3, 7], "crystallin": 2, "crystallograph": [7, 8], "crystallograpph": 7, "crystalstructur": 7, "cu": 5, "cu_temperature_complet": [], "cubic": [0, 1, 5, 6, 8], "curv": [6, 8], "custom": [], "cut_plan": 1, "cylindr": [5, 6], "d": [0, 2, 4, 5, 7, 9], "damp": 5, "dark": 2, "data": [0, 1, 2, 4, 5, 6, 7, 8, 9], "datafram": 9, "dataset": [1, 5], "deby": 5, "debye_temperatur": 5, "declar": 9, "decreas": 5, "deeper": [3, 4, 7], "deepest": [0, 5], "def": [5, 7, 8, 9], "default": [], "defin": [1, 2, 4, 5, 6, 9], "definit": 9, "defocus": 3, "degre": [2, 5, 7, 8, 9], "delta": 5, "demonstr": [2, 7, 8, 9], "dens": 4, "depth": 5, "der": 4, "describ": 4, "detail": 5, "detector_paramet": [1, 5, 7], "determin": 7, "deviat": 4, "df": 9, "diagram": [3, 7], "diamet": [1, 5, 6, 7, 8], "dichalcogenid": 4, "dict": [5, 9], "dictionari": 8, "differ": [0, 1, 2, 5, 6, 7, 8, 9], "differnt": [], "difficulti": 12, "diffract": [0, 1, 2, 4, 5, 7, 12], "diffus": [], "direct": [1, 2, 3, 4, 6, 7, 8], "directli": 0, "discreap": 7, "discuss": 9, "disord": 5, "displac": 5, "displai": [0, 8, 9], "distanc": [2, 3, 6, 7, 8], "distance_cutoff": 6, "distinguish": 5, "distribut": 9, "do": [0, 3, 4, 5, 7, 8], "document": [2, 5], "doe": [6, 9], "done": [7, 8], "doubl": 4, "download": [7, 8], "downward": 7, "drastic": 6, "dropdown": [], "dset": [1, 2, 5, 7, 9], "due": [5, 7], "dur": 3, "dure": [7, 9], "e": 1, "e_0": 2, "each": [1, 4, 5, 6, 8], "eas": 1, "easier": 9, "edit": [0, 3, 7], "effect": [1, 2, 3, 6, 12], "either": [5, 8], "eject": 2, "electron": [0, 2, 4, 6, 8, 12], "element": [4, 7], "elif": 7, "els": [5, 7], "emiss": [2, 5], "emit": [2, 3, 7], "emitt": [0, 1, 2, 3, 4, 5, 6, 12], "emitter_plan": [0, 1, 4, 5, 6, 7, 8], "emitter_tag": [4, 7], "emphas": [], "empti": [], "end": 8, "energi": [1, 2, 3, 4, 5, 6, 7], "enlarg": [], "enough": 3, "enumer": [2, 7], "environ": [0, 9], "eq": [], "equal": 0, "equat": 5, "escap": 1, "especi": 7, "estim": [5, 8], "et": [1, 2, 3, 4, 6, 7, 8], "ev": [1, 2, 4, 5, 7, 8], "evalu": [4, 6], "event": 4, "exact": 2, "exaf": 0, "exampl": [5, 6, 7, 8, 9], "except": 7, "exchang": 7, "exchange_correl": 5, "execut": 9, "exhibit": 7, "exit": 7, "exp": 1, "expand": 4, "expans": [2, 3, 4, 5, 6, 7], "expect": [5, 6, 7], "experi": [3, 9, 12], "experiment": [1, 2, 7, 8, 9], "explain": 5, "explor": [4, 5, 6, 9, 12], "extra": 5, "extract": 8, "extrem": 2, "f": [4, 5, 9], "face": 7, "fact": 3, "factor": [4, 9, 12], "fadlei": 5, "far": 6, "fast": 2, "fcc": [2, 3, 4], "fcc111": 2, "fe": 9, "featur": [0, 1, 7, 9, 12], "few": 6, "fewer": 0, "fig": [7, 8], "fig1": [], "fig2": [], "fig2a": [], "fig3": [], "fig4": [], "fig5": [], "figur": [2, 3, 4, 5, 6, 7, 8], "file": [0, 1], "fill": [2, 7, 8], "filter": [5, 7, 12], "final": [1, 8], "final_st": 6, "find": 8, "fine": 3, "first": [2, 4, 6], "fix": 6, "flexibl": 0, "float": 5, "focu": [0, 3, 12], "folder": 9, "follow": [0, 1, 5, 6, 7, 8], "format": [2, 5, 7], "former": 1, "formula": [4, 6, 8], "forthcom": 0, "fortran": 0, "forward": [3, 6, 12], "forward_angl": [6, 7], "forward_scatt": [6, 7], "found": [3, 7], "fr": 0, "frac": 5, "free": [4, 5], "fring": 2, "from": [0, 1, 2, 4, 5, 6, 7, 8, 9, 12], "fromkei": 5, "full": 3, "fulli": [0, 9], "function": [4, 5, 8, 9], "fundament": [0, 3], "futur": 9, "g": 1, "gap": 4, "gener": [1, 4, 6], "geometr": 7, "geometri": [1, 8, 9], "gerber": 2, "get": [5, 6, 7, 9, 12], "get_aln_tags_plan": 7, "get_atom_index": [0, 1, 4, 5, 6, 7], "get_clust": 7, "get_paramet": 5, "get_phi_scan": [1, 5], "get_scattering_factor": 2, "get_theta_phi_scan": [2, 4], "get_theta_scan": [0, 6, 7], "give": [2, 3, 7, 8], "given": [1, 5, 8], "good": 3, "graphic": [], "graze": 5, "great": 2, "greater": 4, "greatli": 0, "greber": 2, "group": 1, "grow": [4, 12], "growth": 7, "gtrsim": 7, "gui": [0, 1], "h": 1, "h2o": 0, "ha": [3, 4, 6], "half": 5, "hand": [2, 8], "hardwar": 9, "harmon": [0, 4], "have": [2, 3, 6, 7], "hbar": 5, "hdf5": 6, "height": [2, 3, 8, 9], "hello": 9, "help": [4, 5], "hemi": [], "hemispher": [0, 4], "hemispherical_clust": [0, 1, 4, 5, 6, 7, 8], "here": [2, 7, 8, 9], "hexagon": 7, "high": [2, 3, 4, 6], "highli": 7, "hilight": 5, "hollow": 8, "hove": 3, "how": [1, 2, 3, 4, 5, 6, 7, 8, 12], "howev": [0, 3], "http": 0, "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "i_": 5, "ic": 7, "idea": [1, 5, 6], "identifi": 1, "ie": 8, "ignor": 6, "illustr": [2, 3, 6], "imax": 5, "imin": 5, "impact": 0, "import": [0, 1, 2, 3, 4, 5, 6, 7, 9], "imposs": 6, "improv": [], "incid": 5, "includ": [0, 2], "incoher": 7, "incom": 1, "increas": [2, 3, 4, 5, 6], "incres": 5, "independ": 9, "index": [0, 6], "indic": [2, 7], "individu": 9, "inequival": [4, 12], "info": [5, 7, 8], "inform": [2, 5, 8], "inner": 1, "inner_potenti": 1, "inset": 7, "insid": [1, 9], "instal": 9, "instanc": 9, "int": 4, "intenisti": 7, "intens": [0, 1, 2, 3, 4, 5, 6, 7, 9], "intentis": 4, "interact": 0, "interfac": 0, "intern": 1, "interplai": 0, "interstitial_potenti": [1, 5], "introduc": 5, "invalid": [], "invas": 7, "invers": [0, 2, 3, 4, 6], "invert": 9, "involv": 7, "io": 0, "iodata": 6, "ipython": 9, "iron": 8, "item": [], "iter": [], "its": [2, 9], "itself": [4, 8], "j": [3, 6, 7], "just": 9, "k": 5, "k_b": 5, "ke": 7, "keep": 8, "kei": [7, 9], "keyerror": 7, "keyword": 8, "kind": [3, 4, 5, 9], "kinet": [1, 2, 3, 4, 6, 7], "kinetic_energi": [1, 2, 4, 5, 6, 7], "known": 4, "kuznetsov": 4, "kwarg": 9, "l": 3, "l_": 4, "label": [], "lambda_": 5, "lapack": 9, "larg": [1, 2, 4, 5, 7, 12], "larger": 4, "last": 2, "later": 2, "latter": 5, "lattic": [3, 4, 6, 7], "layer": [1, 5], "lead": [2, 6], "learn": 12, "least": 6, "lebedev": 7, "leed": 0, "left": [4, 7, 8], "legend": [1, 5, 6, 7], "len": [2, 5], "length": [2, 3, 6, 8], "let": [1, 2, 4, 7, 9], "lett": [2, 8], "level": [0, 1, 2, 4, 5, 6, 7], "librari": 9, "light": 1, "like": [0, 3, 4, 8], "line": [1, 2, 4, 5, 7, 8, 9], "lineno": [], "link": 9, "linspac": [1, 5], "list": [2, 8, 9], "literalinclud": [], "littl": 6, "ll": 2, "lmax": 4, "load": 6, "loadtxt": 1, "local": 7, "locat": [0, 7], "long": 6, "longer": [3, 6], "look": [1, 5, 7, 8], "loop": [2, 8, 9], "looper": 9, "loss": 5, "low": [1, 5], "lower": 5, "lure": 1, "m": [3, 4, 5, 6], "magic": 9, "magnitud": 5, "mai": [1, 6, 7, 9], "main": [7, 8], "major": [3, 8], "make": 9, "mani": [3, 6, 7, 8, 9], "manipul": 0, "manual": 5, "markdown": 9, "marker": 5, "mass": 5, "match": 1, "materi": [1, 4], "math": [], "mathr": 2, "matplotlib": [0, 1], "matrix": [2, 4, 6], "matter": 0, "max": [1, 4, 5, 7], "max_c": [], "maxima": 2, "maximum": [], "md": [], "mean": [4, 5], "mean_free_path": 5, "mean_square_vibr": 6, "measur": 4, "medium": 7, "memori": [0, 1, 2, 4, 6, 9], "metal": 4, "method": 2, "metrial": 1, "mfp": 4, "middl": 0, "min": [1, 5, 7], "min_c": [], "minim": 0, "minimum": [], "minut": 6, "miss": 1, "model": [1, 4, 5, 7, 8, 12], "modifi": 9, "modul": [0, 5], "molecul": [0, 2, 3, 7, 9], "moment": 0, "monoxid": 8, "more": [0, 4, 5], "most": [0, 1, 2, 6, 9], "msc": 3, "msd": 5, "msspec": [1, 2, 3, 4, 5, 7, 8], "mt_radiu": 6, "much": [0, 1, 4, 5], "muffin": [], "muffintin_paramet": [1, 5], "multi": [4, 12], "multipl": [0, 2, 5, 6, 9, 12], "multiprocess": 9, "must": 9, "mutlipl": 3, "mx2": 4, "my_filt": 6, "my_script": 9, "n": [4, 6, 7, 8], "n_al": 7, "n_n": 7, "n_plane": 7, "n_side": 7, "name": 9, "natoli": 0, "nb": [], "nbpath": [], "ncpu": 9, "nd": [4, 6], "ndif": 4, "nearest": 7, "need": [1, 4, 5, 6, 7, 8, 9, 12], "neighbor": 7, "neighbour": 7, "nest": [8, 9], "new": 0, "next": 8, "ni": [], "ni_chain": [], "ni_chain1": [], "nickel": 3, "nitrogen": 7, "no_filt": 6, "non": 7, "none": [2, 4, 5, 7], "normal": [1, 8], "note": 6, "noth": [], "now": [1, 7, 8, 9], "np": [1, 2, 3, 4, 5, 6, 7, 8, 9], "nplane": [5, 7], "num": 9, "number": [0, 2, 3, 4, 5, 7, 8, 9], "numer": 2, "numpi": [1, 2, 3, 4, 5, 6, 7], "o": [2, 5, 8, 9], "object": [1, 5, 7, 8, 9], "observ": [3, 4], "obvious": 8, "off_cone_ev": [6, 7], "offer": [6, 9, 12], "often": 9, "omp_num_thread": 9, "one": [3, 5, 6, 7, 9], "ones": 5, "onli": [0, 2, 3, 6, 7], "onto": 8, "optim": 9, "option": [5, 6, 9], "orang": [1, 6], "order": [2, 5, 6, 8], "orient": [1, 2, 8], "origin": 7, "other": [0, 2], "our": [2, 5], "out": [3, 6, 8], "output": 9, "over": [2, 5, 9], "ow": 3, "p": [6, 8], "p1654": 2, "p1760": 4, "p266": 7, "p283": 8, "p6784": 5, "p6785": 5, "p6791": 5, "p8275": 3, "packag": [2, 9], "panda": 9, "paper": [1, 2, 3, 4, 5, 6, 7, 8, 9], "paragraph": 5, "parallel": 12, "paramet": [1, 3, 4, 5, 6, 8, 9], "part": [8, 9], "particular": 3, "path": [2, 4, 5, 7, 12], "path_filt": [6, 7], "pattern": [4, 7], "peak": [3, 4, 7], "ped": [2, 5, 6, 7], "pendri": 8, "perform": [5, 12], "phagen": 0, "phase": [0, 5], "phenom": 6, "phi": [1, 2, 4, 5, 6, 7, 8, 9], "photodiffract": [2, 3, 7], "photoelectron": [0, 1, 2, 4, 5, 7, 12], "photoemiss": 7, "phy": [1, 2, 3, 5, 8], "physic": 5, "pi": 4, "pipelin": 9, "plai": 3, "planck": 5, "plane": [0, 1, 4, 5, 7, 8], "plot": [0, 5], "plt": [0, 1], "pm": [2, 8], "point": [1, 7], "polar": [1, 2, 5, 6, 8], "pop": [2, 9], "popup": [1, 2], "posit": [2, 3, 8], "possibl": [2, 6, 8, 9], "potenti": [1, 5], "practic": 5, "precis": [4, 8], "preiou": 4, "present": 3, "pretti": 0, "previou": [0, 3, 6, 7, 9], "previous": 2, "print": [4, 7], "probe": [2, 7], "problem": 2, "process": [0, 6, 12], "processor": 9, "produc": 2, "program": 0, "project": 2, "pronounc": 5, "propag": 0, "proport": 6, "propos": [2, 5], "provid": [4, 8, 9], "publish": [2, 5, 7], "pure": 3, "put": 2, "py": 9, "pyplot": [0, 1], "python": [0, 5, 9], "qualit": 5, "quantit": 2, "question": 6, "quick": 7, "quit": [2, 9], "quiz": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "r": [0, 4, 5, 7, 9, 12], "r16061": 1, "ra_cutoff": 6, "radian": 8, "radiu": 4, "rai": [1, 5], "rang": [4, 5, 7], "rather": 2, "ratio": 7, "rd": [0, 6], "read": 0, "real": 5, "realli": 0, "reason": 9, "recent": 0, "red": 2, "reduc": [5, 6], "ref": 1, "refer": 1, "refract": 1, "regardless": 5, "regim": [6, 12], "rehr": [4, 6, 7], "reject": 6, "rel": [5, 7], "relat": [1, 6], "reliabl": 8, "rememb": [6, 8], "remov": [0, 1], "repeat": 3, "replac": 9, "repres": [2, 5], "represent": 2, "reproduc": [5, 7, 8], "requir": [6, 9], "reshap": 9, "resourc": 9, "respect": [1, 2, 7], "rest": 8, "resulst": 9, "result": [0, 1, 2, 3, 5, 6, 8, 9], "retriev": [5, 7], "return": [5, 7, 8, 9], "rev": [1, 2, 3, 5, 8], "rfactor": [], "rho": [], "rho_complet": [], "rho_sf": [], "rhodium": 2, "right": [4, 7, 8], "rotat": [1, 3, 4, 7], "rotate_cel": [1, 4], "roughli": 5, "row": 4, "run": [0, 7, 8, 9], "rune": 8, "sa73": 1, "saiki": 8, "same": [0, 3, 6, 7], "sampl": [1, 4, 5], "satisfactori": [1, 2], "save": 0, "saw": 3, "sbag": [], "scale": [], "scan": [2, 4, 5, 6, 7, 8], "scatter": [0, 5, 7, 8, 9, 12], "scattering_ord": [2, 3, 4, 5, 6, 7], "sci": 4, "script": [2, 6, 7, 8, 9], "se": 4, "second": [4, 5, 6], "section": [5, 8], "see": [1, 2, 3, 5, 6, 8, 9], "seealso": [], "seen": [6, 7], "select": [1, 5, 6, 7], "sensit": 2, "sequenti": 6, "seri": [4, 6, 7], "serial": 6, "set": [0, 3, 5, 6, 7, 8, 9, 12], "set_atom": [0, 2, 4, 5, 6, 7], "set_plot_opt": [5, 7], "sever": [6, 9], "sf": [], "shape": [1, 2, 5, 6, 9], "share": [7, 9], "shift": [0, 5], "short": 7, "should": [1, 4, 8], "show": [0, 7], "shutdown": [1, 5], "si001_complet": [], "side": [7, 8], "signal": [0, 2, 5, 6, 7], "signific": 1, "significantli": 6, "silver": 1, "sim": [5, 8], "similar": 6, "simpl": [3, 5, 8, 9], "simplist": 2, "simul": [0, 2, 3, 7, 9, 12], "sin": [5, 8], "sinc": [0, 4, 5, 6, 7, 12], "singl": [4, 5, 6, 8, 12], "sinl": 2, "site": [2, 8], "situat": 3, "size": [1, 2, 4, 6], "sketch": 7, "small": [1, 2, 4, 5, 7, 8], "smaller": 1, "snipet": 4, "so": [2, 6], "softwar": 12, "solut": 8, "some": [0, 1, 2, 4, 5, 6, 7, 8, 9], "soon": 2, "sourc": 1, "source_paramet": [1, 5, 6, 7], "spec": 0, "speci": 2, "specif": 1, "specifi": 9, "spectrosc": 6, "spectroscopi": [0, 1, 2, 4, 5, 6, 7, 8, 12], "spectroscopy_paramet": 6, "spheric": [0, 4], "spirit": 3, "sqrt": 3, "squar": 5, "ssc": [3, 8], "stack": [], "start": [1, 2, 4, 9, 12], "state": 7, "step": [0, 1, 8, 9], "stereo": [], "stereograph": 2, "stop": 9, "store": [4, 5, 8], "straightforward": [0, 7], "strongest": 7, "strongli": 4, "structur": [0, 4, 5], "studi": [2, 3, 7], "substitut": [1, 7], "substrat": [5, 9, 12], "substrate_dset": 7, "subsurfac": 6, "suggest": 9, "suit": 0, "suitabl": [3, 7], "sum": [5, 7], "sum_": 6, "surf": 4, "surfac": [1, 2, 3, 7, 8], "surround": 7, "sweep": 9, "sweep_index": 9, "symbol": [1, 3], "symmetri": 7, "synchrotron": 1, "syntax": [], "syntaxerror": [], "system": 9, "s\u00e9billeau": 0, "t": [1, 2, 5, 8], "tab": [], "tag": [4, 7], "take": [0, 1, 4, 6, 7], "taken": [6, 7], "task": [8, 9], "tb": 4, "technic": 9, "techniqu": [0, 12], "temp": 1, "temperatur": [7, 12], "temporari": [], "termin": 7, "test": [], "tetrahedron": 7, "th": 6, "than": [1, 5, 6], "thank": 2, "thei": [2, 3, 5], "them": 0, "theori": 12, "thermal": 5, "theses": 6, "theta": [1, 2, 4, 5, 6, 7, 8, 9], "theta_d": 5, "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "thick": 4, "those": [0, 1, 8], "threshold": 6, "through": 12, "thu": 7, "ti": 4, "ti2p": 4, "tilt": [3, 9], "time": [0, 4, 6, 9], "tin": [], "tip": [], "titl": [2, 5, 7], "tl_threshold": 6, "tmatrix_paramet": [5, 6], "tmp_data": 7, "to_dict": 9, "togeth": 12, "toggl": [], "too": [1, 2, 4, 6, 7], "took": 6, "tool": [0, 7], "top": [1, 2], "total": [0, 5, 6, 7, 9], "toward": 2, "transit": 4, "treat": 6, "trehan": 5, "tricot": 6, "trilay": 4, "true": [0, 1, 4, 5, 6, 7, 8], "try": [1, 2, 4, 6, 7, 8], "tweak": [], "two": [0, 1, 2, 5, 6, 8], "txt": 1, "type": 4, "typic": [0, 4, 5], "u": 4, "u0000212b": [], "u_j": 5, "unambigu": 7, "underli": 2, "understand": 3, "uniqu": 9, "unit": [4, 9], "up": [0, 6, 12], "updat": [5, 7, 8], "upward": 7, "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12], "use_debye_model": 5, "useful": 4, "user": 9, "usual": 4, "utf": [], "utf8": 6, "util": [0, 1, 4, 5, 6, 7, 8], "v": [4, 7], "vacuum": 4, "valu": [2, 4, 5, 6, 8, 9], "van": [3, 4], "vari": [2, 3, 5], "variabl": [1, 8, 9], "variat": [2, 5], "varii": 9, "variou": [2, 3, 12], "veri": [2, 3, 6], "version": [0, 9], "versu": [5, 7], "vibrat": 5, "vibration_sc": 5, "vibrational_damp": [5, 6], "view": [0, 1, 2, 4, 5, 6, 7], "visual": [0, 1, 2, 4], "volum": [4, 7], "wa": [6, 8], "waal": 4, "wai": 5, "waller": 5, "want": [5, 7], "water": 0, "wave": [0, 2, 4], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12], "well": [0, 4, 5, 7], "were": [6, 7], "what": [0, 2, 3, 4, 6, 8], "when": [1, 3, 5, 6, 9], "where": [2, 3, 4, 5, 6, 7], "which": [2, 6, 8, 9], "while": [], "whose": [6, 9], "why": 6, "wide": 2, "window": [], "withe": 8, "within": 6, "without": [0, 6], "work": [0, 3, 5, 7], "world": 9, "would": [1, 4, 6], "write": 8, "written": 0, "wurtzit": 7, "x": [1, 5, 8], "x_alpha_r": 5, "xlabel": [5, 7], "xpd": [4, 12], "xraysourc": [5, 6, 7], "xu": 3, "y": [1, 3, 8], "yellow": 6, "yet": [], "ylabel": [5, 7], "ylim": [], "you": [0, 1, 2, 4, 5, 6, 7, 9, 12], "your": [1, 2, 5, 6, 8, 9], "z": [1, 2, 4, 8], "z0": 2, "z_0": 2, "zi": 2, "\u00b5": 6, "\u00e5": [2, 3, 4, 6, 8, 9]}, "titles": ["Activity 1: Getting started", "Activity 2: Setting up the \u201cexperiment\u201d", "Activity 3: Adsorbates and the single scattering approach", "Activity 4: From single scattering to multiple scattering", "Activity 5: Multiple scattering in the forward scattering regime", "Activity 6: Effect of the temperature", "Activity 7: Large clusters and path filtering", "Activity 8: Inequivalent emitters and the XPD of a substrate", "Activity 9: Comparing simulation and experiment with R-factors", "Activity 10: Parallelization and multi-processing in MsSpec", "Activity 11: Spectral radius and convergence", "Final word", "Welcome to this small MsSpec tour"], "titleterms": {"001": [0, 2, 6, 8], "1": 0, "10": 9, "11": 10, "111": 1, "1t": 4, "2": [1, 4], "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "The": [5, 6, 7, 8], "activ": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "adsorb": 2, "ag": 1, "aln": 7, "aluminium": 7, "an": 1, "applic": 6, "approach": 2, "atom": [0, 3], "azimuth": 1, "backscatt": 2, "barebon": 0, "base": 9, "build": [0, 1, 3], "bulk": 5, "chain": 3, "cluster": [0, 1, 4, 6], "co": 8, "compar": 8, "comput": [1, 2], "converg": 10, "creat": 4, "cu": 0, "deep": 6, "developp": 11, "due": 2, "effect": [4, 5], "emitt": 7, "exampl": 1, "experi": [1, 8], "factor": [2, 8], "fe": 8, "filter": 6, "final": 11, "forward": 4, "from": 3, "futur": 11, "get": 0, "growth": 1, "help": 3, "how": 11, "induc": 1, "inequival": 7, "instal": 11, "interfer": 2, "invers": 9, "larg": 6, "matrix": 9, "molecul": 8, "msspec": [0, 6, 9, 11, 12], "multi": 9, "multipl": [3, 4], "nb": [], "need": 3, "ni": 3, "nitrid": 7, "number": 6, "order": 4, "our": 11, "oxygen": 2, "parallel": 9, "path": 6, "ped": [0, 4], "plane": 6, "polar": [0, 3, 7], "process": 9, "r": 8, "radiu": 10, "regim": 4, "rh": 2, "sampl": 6, "sb": 1, "scan": [0, 1, 3], "scatter": [2, 3, 4, 6], "script": [0, 5], "set": 1, "shape": 0, "si": 6, "simul": 8, "singl": [2, 3], "small": 12, "smooth": 1, "solut": 3, "spectral": 10, "start": [0, 3], "sub": 4, "substrat": 7, "surfac": [4, 5], "system": 0, "temperatur": 5, "thi": 12, "tilt": 8, "tise": 4, "tise2": 4, "tour": 12, "unusu": 8, "up": 1, "welcom": 12, "word": 11, "work": 11, "xpd": 7, "you": 3}})
\ No newline at end of file
+Search.setIndex({"alltitles": {"Activity 10: Parallelization and multi-processing in MsSpec": [[18, null], [19, null]], "Activity 11: Spectral radius and convergence": [[20, null]], "Activity 1: Getting started": [[0, null], [1, null]], "Activity 2: Setting up the \u201cexperiment\u201d": [[2, null], [3, null]], "Activity 3: Adsorbates and the single scattering approach": [[4, null], [5, null]], "Activity 4: From single scattering to multiple scattering": [[6, null], [7, null]], "Activity 5: Multiple scattering in the forward scattering regime": [[8, null], [9, null]], "Activity 6: Effect of the temperature": [[10, null], [11, null]], "Activity 7: Large clusters and path filtering": [[12, null], [13, null]], "Activity 8: Inequivalent emitters and the XPD of a substrate": [[14, null], [15, null]], "Activity 9: Comparing simulation and experiment with R-factors": [[16, null], [17, null]], "Application to a deep plane in a Si(001) sample": [[12, "application-to-a-deep-plane-in-a-si-001-sample"], [13, "application-to-a-deep-plane-in-a-si-001-sample"]], "Barebone script for MsSpec": [[0, "barebone-script-for-msspec"], [1, "barebone-script-for-msspec"]], "Building a chain of atoms": [[6, "building-a-chain-of-atoms"], [7, "building-a-chain-of-atoms"]], "Building atomic systems": [[0, "building-atomic-systems"], [1, "building-atomic-systems"]], "Building the cluster": [[2, "building-the-cluster"], [3, "building-the-cluster"]], "Compute an azimuthal scan": [[2, "compute-an-azimuthal-scan"], [3, "compute-an-azimuthal-scan"]], "Computing the scattering factor": [[4, "computing-the-scattering-factor"], [5, "computing-the-scattering-factor"]], "Creating the TiSe2 cluster": [[8, "creating-the-tise2-cluster"], [9, "creating-the-tise2-cluster"]], "Effect of the scattering order": [[8, "effect-of-the-scattering-order"], [9, "effect-of-the-scattering-order"]], "Final word": [[21, null]], "Future developpements": [[21, "future-developpements"]], "How to install MsSpec": [[21, "how-to-install-msspec"]], "Interferences due to backscattering": [[4, "interferences-due-to-backscattering"], [5, "interferences-due-to-backscattering"]], "Matrix inversion parallelization": [[18, "matrix-inversion-parallelization"], [19, "matrix-inversion-parallelization"]], "Our work": [[21, "our-work"]], "Oxygen on Rh(001)": [[4, "oxygen-on-rh-001"], [5, "oxygen-on-rh-001"]], "PED of the 1T-TiSe2 surface": [[8, "ped-of-the-1t-tise2-surface"], [9, "ped-of-the-1t-tise2-surface"]], "PED polar scan for Cu(001)": [[0, "ped-polar-scan-for-cu-001"], [1, "ped-polar-scan-for-cu-001"]], "Paths filtering in MsSpec": [[12, "paths-filtering-in-msspec"], [13, "paths-filtering-in-msspec"]], "Polar scans of Ni atomic chains": [[6, "polar-scans-of-ni-atomic-chains"], [7, "polar-scans-of-ni-atomic-chains"]], "Process-based parallelism": [[18, "process-based-parallelism"], [19, "process-based-parallelism"]], "Sb-induced smooth growth of Ag on Ag(111) example": [[2, "sb-induced-smooth-growth-of-ag-on-ag-111-example"], [3, "sb-induced-smooth-growth-of-ag-on-ag-111-example"]], "Shaping a cluster": [[0, "shaping-a-cluster"], [1, "shaping-a-cluster"]], "Solution\u2026": [[0, null], [2, null], [4, null], [4, null], [6, null], [6, null], [8, null], [8, null], [10, null], [12, null], [12, null], [14, null], [14, null], [16, null], [16, null], [16, null], [18, null]], "Surface and bulk effects of the temperature": [[10, "surface-and-bulk-effects-of-the-temperature"], [11, "surface-and-bulk-effects-of-the-temperature"]], "The Aluminium Nitride (AlN) polarity": [[14, "the-aluminium-nitride-aln-polarity"], [15, "the-aluminium-nitride-aln-polarity"]], "The number of scattering paths": [[12, "the-number-of-scattering-paths"], [13, "the-number-of-scattering-paths"]], "The script": [[10, "the-script"], [11, "the-script"]], "The unusual tilt of CO molecule on Fe(001)": [[16, "the-unusual-tilt-of-co-molecule-on-fe-001"], [17, "the-unusual-tilt-of-co-molecule-on-fe-001"]], "Welcome to this small MsSpec tour": [[22, null]], "if you need help to start\u2026": [[6, null], [7, null]]}, "docnames": ["Activity01/Activity01", "Activity01/Activity01_light", "Activity02/Activity02", "Activity02/Activity02_light", "Activity03/Activity03", "Activity03/Activity03_light", "Activity04/Activity04", "Activity04/Activity04_light", "Activity05/Activity05", "Activity05/Activity05_light", "Activity06/Activity06", "Activity06/Activity06_light", "Activity07/Activity07", "Activity07/Activity07_light", "Activity08/Activity08", "Activity08/Activity08_light", "Activity09/Activity09", "Activity09/Activity09_light", "Activity10/Activity10", "Activity10/Activity10_light", "Activity11/Activity11", "backmatter", "intro"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinxcontrib.bibtex": 9}, "filenames": ["Activity01/Activity01.ipynb", "Activity01/Activity01_light.ipynb", "Activity02/Activity02.ipynb", "Activity02/Activity02_light.ipynb", "Activity03/Activity03.ipynb", "Activity03/Activity03_light.ipynb", "Activity04/Activity04.ipynb", "Activity04/Activity04_light.ipynb", "Activity05/Activity05.ipynb", "Activity05/Activity05_light.ipynb", "Activity06/Activity06.ipynb", "Activity06/Activity06_light.ipynb", "Activity07/Activity07.ipynb", "Activity07/Activity07_light.ipynb", "Activity08/Activity08.ipynb", "Activity08/Activity08_light.ipynb", "Activity09/Activity09.ipynb", "Activity09/Activity09_light.ipynb", "Activity10/Activity10.ipynb", "Activity10/Activity10_light.ipynb", "Activity11/Activity11.ipynb", "backmatter.md", "intro.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "0": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19], "00": [14, 15], "0001": [14, 15], "001": [10, 11, 18, 19], "004": [8, 9], "006": [12, 13], "01": 12, "010": 16, "02": [4, 5], "045": 6, "05": 4, "0f": [10, 11], "1": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "10": [0, 1, 2, 4, 5, 14, 15, 16, 17, 22], "100": [10, 11, 16, 17], "1000": [10, 11], "1000k": [10, 11], "101": [6, 7], "1030": [8, 9], "1083": 14, "11": [14, 16, 17], "110": [16, 17], "111": [4, 5], "114": 12, "12": [16, 17, 18, 19], "1202": [16, 17], "121": [2, 3], "1382": [12, 13], "14": [10, 11], "1407": 14, "147176": [12, 13], "15": [2, 3, 8, 9, 12, 13, 16], "1525": 12, "157": [16, 17, 18, 19], "1986": [10, 11], "1989": [6, 7, 16, 17], "1998": [4, 5], "1999": [14, 15], "1e": [12, 13], "1e12": [8, 9], "2": [0, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "20": [2, 3, 12, 13, 14], "2012": [8, 9, 10, 11], "2022": [12, 13], "207": [14, 15], "22": 2, "240": [2, 3], "25": [8, 9, 14], "256": [12, 13], "27": [10, 11], "28": [12, 13], "298k": [10, 11], "2d": [8, 9], "2f": 4, "2p": [0, 1, 8, 9, 10, 11, 12, 13, 14, 15], "2p3": [0, 1], "3": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 22], "30": [2, 3, 12, 13, 14, 16, 17], "300": [10, 11], "32": [14, 15], "34": [10, 11], "343": 10, "35": [14, 16], "39": [6, 7], "3f": [8, 9], "3rd": [0, 1], "4": [0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "40": [2, 3, 12, 13], "400": [10, 11], "43": [12, 13], "45": [2, 3, 6, 7, 10, 11, 12, 13, 16, 17, 18, 19], "450": [8, 9], "499": [6, 7], "4d": [2, 3], "5": [2, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 22], "50": [18, 19], "500": [14, 15], "51": [10, 11], "535": [8, 9], "54": [12, 13], "55": [2, 3, 16, 17], "554": [8, 9], "560": [10, 11], "58": [14, 15], "59": [14, 15], "6": [2, 8, 9, 12, 14, 16, 17, 18, 19, 22], "60": [8, 9, 16, 17, 18, 19], "606": [8, 9], "63": [16, 17, 18, 19], "64": [8, 9], "65": [4, 5], "67": [18, 19], "685": [8, 9], "6a_0": [12, 13], "7": [10, 11, 14, 15, 22], "70": [8, 9, 14], "72": [14, 15], "723": [4, 5], "739": 12, "76": [18, 19], "77": [18, 19], "8": [2, 3, 4, 5, 8, 9, 22], "80": [6, 12, 13, 14], "81": [4, 5], "83": [10, 11], "9": [10, 18, 19, 22], "90": [12, 13], "900": [8, 9], "945": 12, "975": 14, "98": [10, 11], "A": [4, 5, 6, 7, 10, 11, 16, 17, 18, 19], "AED": [0, 1], "ASE": [0, 1, 2, 3, 4, 5, 8, 9], "As": [0, 1, 4, 5, 8, 9, 12, 13, 14, 15, 18, 19], "But": [8, 9], "By": [4, 5], "For": [2, 3, 6, 8, 9, 10, 11, 12, 13, 18, 19], "If": [12, 13], "In": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "It": [2, 3, 8, 9, 14, 15, 16, 17, 18, 19], "Not": 0, "On": [4, 5], "One": 12, "Or": [0, 1], "The": [0, 1, 2, 3, 4, 6, 7, 8, 9, 18, 19], "There": [0, 1], "These": [14, 15], "To": [0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 18, 19], "With": [10, 11, 12, 13, 18, 19], "_": 14, "__main__": [10, 11], "__name__": [10, 11], "_plotopt": [10, 11], "a_0": [8, 9, 12, 13], "abl": [12, 13], "about": [4, 5, 8, 9], "abov": [0, 1, 4, 8, 10, 11, 12, 13], "abscissa": 16, "absorb": [10, 11, 14], "accept": [12, 13, 16, 17, 18, 19], "access": [14, 15], "accord": [16, 17], "account": [0, 1, 8, 9, 12, 13], "accur": [4, 5, 8, 9, 16, 17], "accuraci": [4, 5, 6, 7], "act": [2, 3], "activ": 22, "actual": [10, 11, 12, 13], "ad": [4, 5, 14], "add": [2, 3, 4, 5, 10, 11, 12, 13, 14, 18, 19], "add_adsorb": [4, 5, 16, 17], "add_column": [2, 3, 10, 11, 12, 13, 14], "add_dset": [10, 11, 14], "add_view": [10, 11, 14], "adjust": [16, 17], "adsorb": [16, 17, 22], "adsorpt": [4, 5, 14, 15, 16, 17, 18, 19], "advantag": [4, 5], "after": [8, 9, 16], "agit": 10, "agre": [16, 17], "agreement": [2, 3, 16, 17], "al": [2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17], "al_al": 14, "al_kalpha": [10, 11, 12, 13, 14], "al_n": 14, "al_plan": 14, "al_sid": 14, "alber": [8, 9, 12, 13, 14, 15], "algorithm": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "algortithm": [6, 7], "align": [2, 3, 8, 9, 16, 17], "all": [0, 1, 4, 5, 6, 10, 11, 12, 13, 14, 15, 18, 19, 22], "all_t": [10, 11], "all_theta": [10, 11], "all_z": [4, 5], "allow": [0, 1, 12, 13, 18, 19], "almost": [8, 9, 12, 13, 14, 15], "along": [6, 7, 16, 17], "alreadi": [8, 9], "also": [2, 3, 8, 9, 10, 11, 16, 18, 19], "altern": [12, 13], "although": [2, 3, 6, 7, 18, 19], "altitud": 4, "aluminum": [14, 15], "amplitud": [14, 15], "an": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19], "analysi": [10, 11, 14, 16, 17], "analyz": [0, 1], "angl": [2, 3, 10, 11, 12, 13, 14, 15, 16, 18, 19], "angstrom": 4, "angstr\u00f6m": [8, 9, 16, 18], "angular_accept": [2, 3, 10, 11, 14], "ani": [4, 5], "anisotropi": [10, 11, 18, 19], "anisotropy_dset": [10, 11], "anisotropy_view": [10, 11], "anneal": [14, 15], "annular": 4, "anoth": [8, 9, 18, 19], "apart": [4, 5], "apec": [0, 1], "apertur": [12, 13], "append": [10, 11, 14, 16], "approach": [0, 1, 6, 7, 8, 9, 22], "approxim": [4, 5, 6, 7, 8, 9], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "arang": [4, 6, 10, 11, 12, 13, 14, 16], "arbitrarili": [10, 11], "argument": [16, 17, 18, 19], "aris": 14, "around": [8, 9, 14, 15], "arrai": [10, 11], "arrang": [12, 13], "articl": [10, 11], "ase": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17], "assum": [2, 3, 12, 14, 15, 16, 17], "atom": [2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "atomist": [0, 1], "attach": [4, 5], "attempt": [10, 11], "attribut": [2, 3, 18, 19], "author": [14, 15], "autoscal": [10, 11, 14], "avail": [0, 1, 8, 9, 18, 19], "averag": [10, 11], "average_sampl": [2, 3, 10, 11, 14], "averaged_tl": [10, 11, 12, 13], "axi": [8, 9], "azimth": [16, 17], "azimut": [10, 11], "azimuth": [10, 11, 14, 15, 16, 17, 18, 19], "b": [2, 3, 6, 7, 10, 11], "b_0": [8, 9], "backscatt": [6, 12, 13], "backward_scatt": [12, 13], "bar": 14, "barton": [6, 7], "base": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "basi": [0, 1], "beamlin": 2, "becaus": [6, 7, 12, 13], "becom": [4, 5, 12, 13], "been": [12, 13], "begin": [4, 5], "being": [4, 5, 10, 11], "belong": 16, "below": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "best": [16, 17], "better": [2, 3], "between": [0, 2, 3, 4, 5, 8, 9, 10, 11, 14, 15, 16, 18, 19], "bewteen": [6, 7], "bit": [8, 9], "black": [18, 19], "blue": [2, 3, 12], "bodi": [16, 17], "boltzmann": [10, 11], "bond": [4, 5, 16, 17], "bond_length": [16, 18, 19], "both": [4, 5, 6, 10, 11, 14, 15], "bright": 4, "bring": 22, "build": [4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "built": [16, 17], "bulk": [0, 1, 2, 3, 12, 13, 14, 16, 17], "c": [8, 9, 10, 11, 14, 16, 17], "c1": [16, 17], "c_0": [8, 9], "calc": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "calc_": [18, 19], "calcul": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "calculation_paramet": [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "calculationparamet": [10, 11], "calcult": [16, 17], "call": [16, 17], "can": [0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "cancel": 6, "cannot": [8, 9], "carbon": [16, 17], "carri": [4, 5], "case": [4, 5, 14, 15], "categori": [2, 3], "cell": [2, 3, 8, 9, 14, 15], "center": [4, 8, 9], "chain": [4, 5], "chang": [2, 3, 4, 5, 10, 11, 18, 19], "check": [14, 15], "chosen": [10, 11], "cif": [0, 1], "circl": 4, "cite": [10, 11], "class": [4, 5, 6, 7], "clear": [10, 11], "close": [6, 7, 12], "cluster": [4, 5, 10, 11, 14, 15, 16, 17, 18, 19, 22], "cnr": [0, 1], "co": [18, 19], "code": [0, 1, 2, 3, 4, 5, 8, 9, 12, 13, 16, 18, 19], "col_nam": [10, 11], "col_valu": [10, 11], "column": [8, 9, 14], "com": [4, 5], "combin": [18, 19], "come": [4, 5, 6, 7, 10], "comment": [4, 5, 14, 15, 18, 19], "common": [10, 11, 12, 13], "commonli": [16, 17], "compar": [2, 3, 6, 7, 12, 13, 18, 19, 22], "comparison": [0, 2, 3, 12, 13], "complet": [4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19], "complex": [8, 9], "compon": [0, 1], "comput": [0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "computation": [4, 5], "compute_polar_scan": [16, 17, 18, 19], "concept": [0, 1, 22], "conclud": [0, 1, 8, 9], "cone": [12, 13], "configur": [2, 3, 12, 13], "consequ": [6, 7], "consid": [4, 5], "constant": [8, 9, 10, 11], "construct": [4, 5], "consum": [18, 19], "consumpt": [4, 5], "contain": [0, 1, 2, 3, 8, 9, 10, 11, 16, 17], "content": [0, 1, 18, 19], "contrast": [14, 15], "contribut": [0, 12, 13], "control": [10, 11, 14, 15, 16, 17], "converg": [2, 3, 8], "convert": [18, 19], "copi": [2, 3, 14, 16], "copper": [0, 1, 8, 9, 10, 11], "core": [14, 15, 18, 19], "correctli": [2, 3], "correspond": [8, 9, 12, 13, 14, 15, 16], "could": [12, 13], "cover": [0, 1], "cp": 16, "creat": [0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 16, 18, 19], "create_clust": [10, 11, 14, 16, 17, 18, 19], "cristal": [14, 15], "cross_sect": [2, 3, 10, 11, 12, 13, 14, 16, 18, 19], "cruguel": [2, 3], "cryst": [14, 15], "crystal": [6, 7, 14, 15], "crystallin": [4, 5], "crystallograph": [14, 15, 16, 17], "crystallograpph": [14, 15], "crystalstructur": 14, "cu": [10, 11], "cubic": [0, 1, 2, 3, 10, 11, 12, 13, 16], "curv": [12, 16, 17], "cut_plan": [2, 3], "cylindr": [10, 11, 12, 13], "d": [0, 1, 4, 8, 9, 10, 11, 14, 18, 19], "damp": [10, 11], "dark": 4, "data": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19], "datafram": [18, 19], "dataset": [2, 3, 10, 11], "deby": [10, 11], "debye_temperatur": [10, 11], "declar": [18, 19], "decreas": 10, "deeper": [6, 7, 8, 14, 15], "deepest": [0, 1, 10, 11], "def": [10, 11, 14, 16, 18, 19], "defin": [2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 18, 19], "definit": [18, 19], "defocus": [6, 7], "degre": [4, 5, 10, 11, 14, 16, 18, 19], "delta": [10, 11], "demonstr": [4, 5, 14, 15, 16, 17, 18, 19], "dens": [8, 9], "depth": [10, 11], "der": [8, 9], "describ": [8, 9], "detail": [10, 11], "detector_paramet": [2, 3, 10, 11, 14], "determin": [14, 15], "deviat": [8, 9], "df": [18, 19], "diagram": [6, 7, 14, 15], "diamet": [2, 3, 10, 11, 12, 13, 14, 16], "dichalcogenid": [8, 9], "dict": [10, 11, 18, 19], "dictionari": 16, "differ": [0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "difficulti": 22, "diffract": [0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 15, 22], "direct": [2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17], "directli": [0, 1, 2, 3], "discreap": 14, "discuss": [18, 19], "disord": 10, "displac": [10, 11], "displai": [0, 1, 16, 17], "distanc": [4, 5, 6, 7, 12, 13, 14, 15, 16], "distance_cutoff": 12, "distinguish": [10, 11], "distribut": [18, 19], "do": [0, 1, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17], "document": [4, 5, 10, 11], "doe": [12, 13, 18, 19], "done": [14, 15, 16, 17], "doubl": [8, 9], "download": [0, 1, 2, 3, 14, 15, 16, 17], "downward": [14, 15], "drastic": [12, 13], "dset": [2, 3, 4, 10, 11, 14, 18, 19], "due": [10, 14, 15], "dur": [6, 7], "dure": [14, 15, 18, 19], "e": [2, 3], "e_0": 4, "each": [2, 3, 8, 9, 10, 11, 12, 13, 16], "eas": [2, 3], "easier": [18, 19], "edit": [0, 1, 6, 7, 14], "editor": [2, 3], "effect": [2, 3, 4, 5, 6, 7, 12, 13, 22], "either": [10, 11, 16, 17], "eject": [4, 5], "electron": [0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 22], "element": [8, 9, 14, 15], "elif": 14, "els": [10, 11, 14], "emiss": [4, 10], "emit": [4, 5, 6, 7, 14, 15], "emitt": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 22], "emitter_plan": [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 16], "emitter_tag": [8, 9, 14], "end": 16, "energi": [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "enough": 6, "enumer": [4, 14], "environ": [0, 1, 18, 19], "equal": 0, "equat": [10, 11], "escap": [2, 3], "especi": 14, "estim": [10, 16, 17], "et": [2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17], "ev": [2, 3, 4, 5, 8, 9, 10, 14, 15, 16, 17], "evalu": [8, 9, 12, 13], "event": [8, 9], "exact": [4, 5], "exaf": [0, 1], "exampl": [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "except": 14, "exchang": [14, 15], "exchange_correl": [10, 11], "execut": [18, 19], "exhibit": [14, 15], "exit": 14, "exp": [2, 3], "expand": [8, 9], "expans": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "expect": [10, 12, 13, 14, 15], "experi": [6, 7, 18, 19, 22], "experiment": [2, 3, 4, 5, 14, 15, 16, 17, 18, 19], "explain": [10, 11], "explor": [8, 9, 10, 11, 12, 13, 18, 19, 22], "extra": [10, 11], "extract": [16, 17], "extrem": [4, 5], "f": [8, 9, 10, 11, 18, 19], "face": [14, 15], "fact": 6, "factor": [8, 9, 18, 19, 22], "fadlei": [10, 11], "far": [12, 13], "fast": [4, 5], "fcc": [4, 5, 6, 7, 8, 9], "fcc111": [4, 5], "fe": [18, 19], "featur": [0, 1, 2, 3, 14, 15, 18, 19, 22], "few": 12, "fewer": [0, 1], "fig": [14, 15, 16, 17], "figur": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "file": [0, 1, 2, 3], "fill": [4, 5, 14, 15, 16], "filter": [10, 11, 14, 15, 22], "final": [2, 3, 16, 17], "final_st": [12, 13], "find": [16, 17], "fine": [6, 7], "first": [0, 1, 4, 5, 8, 9, 12, 13], "fix": [12, 13], "flexibl": [0, 1], "float": [10, 11], "focu": [0, 1, 6, 7, 22], "folder": [0, 1, 18, 19], "follow": [0, 1, 2, 3, 10, 11, 12, 13, 14, 15, 16, 17], "format": [4, 10, 11, 14], "former": 2, "formula": [8, 9, 12, 16, 17], "forthcom": [0, 1], "fortran": [0, 1], "forward": [6, 7, 12, 13, 22], "forward_angl": [12, 14], "forward_scatt": [12, 13, 14], "found": [6, 7, 14, 15], "fr": [0, 1], "frac": [10, 11], "free": [8, 9, 10, 11], "fring": 4, "from": [0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "fromkei": [10, 11], "full": [6, 7], "fulli": [0, 1, 18, 19], "function": [8, 9, 10, 11, 16, 17, 18, 19], "fundament": [0, 1, 6, 7], "futur": [18, 19], "g": [2, 3], "gap": [8, 9], "gener": [2, 8, 9, 12, 13], "geometr": [14, 15], "geometri": [2, 16, 17, 18, 19], "gerber": [4, 5], "get": [10, 11, 12, 14, 15, 18, 19, 22], "get_aln_tags_plan": 14, "get_atom_index": [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14], "get_clust": 14, "get_paramet": [10, 11], "get_phi_scan": [2, 3, 10, 11], "get_scattering_factor": [4, 5], "get_theta_phi_scan": [4, 5, 8, 9], "get_theta_scan": [0, 1, 6, 12, 13, 14], "give": [4, 5, 6, 14, 15, 16, 17], "given": [2, 10, 11, 16, 17], "good": [6, 7], "graze": [10, 11], "great": [4, 5], "greater": [8, 9], "greatli": [0, 1], "greber": [4, 5], "group": [2, 3], "grow": [8, 9, 22], "growth": [14, 15], "gtrsim": [14, 15], "gui": [0, 1, 2, 3], "h": [2, 3], "h2o": [0, 1], "ha": [6, 8, 9, 12, 13], "half": [10, 11], "hand": [4, 5, 16, 17], "hardwar": [18, 19], "harmon": [0, 1, 8, 9], "have": [4, 5, 6, 7, 12, 13, 14, 15], "hbar": [10, 11], "hdf5": [12, 13], "height": [4, 5, 6, 7, 16, 17, 18, 19], "help": [8, 9, 10, 11], "hemispher": [0, 1, 8, 9], "hemispherical_clust": [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 16, 17], "here": [0, 1, 4, 5, 8, 9, 14, 15, 16, 17, 18, 19], "hexagon": [14, 15], "high": [4, 5, 6, 8, 9, 12, 13], "highli": [14, 15], "hilight": [10, 11], "hollow": [16, 17], "hove": [6, 7], "how": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 22], "howev": [0, 1, 6, 7], "http": [0, 1], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "i_": [10, 11], "ic": 14, "idea": [2, 3, 10, 11, 12, 13], "identifi": [2, 3], "ie": 16, "ignor": [12, 13], "illustr": [4, 5, 6, 7, 12, 13], "imax": [10, 11], "imin": [10, 11], "impact": [0, 1], "import": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 19], "imposs": [12, 13], "incid": [10, 11], "includ": [0, 1, 4, 5], "incoher": [14, 15], "incom": [2, 3], "increas": [4, 5, 6, 7, 8, 9, 10, 11, 12], "incres": [10, 11], "independ": [18, 19], "index": [0, 1, 12, 13], "indic": [4, 5, 14, 15], "individu": [18, 19], "inequival": [8, 9, 22], "info": [10, 11, 14, 16], "inform": [4, 5, 10, 11, 16, 17], "inner": [2, 3], "inner_potenti": 2, "inset": [14, 15], "insid": [2, 3, 18, 19], "instal": [18, 19], "instanc": [18, 19], "int": [8, 9], "intenisti": 14, "intens": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19], "intentis": [8, 9], "interact": [0, 1], "interfac": [0, 1], "intern": [2, 3], "interplai": [0, 1], "interstitial_potenti": [2, 3, 10, 11], "introduc": [10, 11], "invas": [14, 15], "invers": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13], "invert": [18, 19], "involv": [14, 15], "io": [0, 1], "iodata": [12, 13], "iron": 16, "its": [4, 5, 18, 19], "itself": [8, 9, 16], "j": [6, 7, 12, 13, 14, 15], "just": [18, 19], "k": [10, 11], "k_b": [10, 11], "ke": 14, "keep": 16, "kei": [14, 15, 18, 19], "keyerror": 14, "keyword": [16, 17], "kind": [6, 7, 8, 10, 11, 18, 19], "kinet": [2, 3, 4, 5, 6, 8, 9, 12, 13, 14, 15], "kinetic_energi": [2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14], "known": [8, 9], "kuznetsov": [8, 9], "kwarg": [18, 19], "l": [6, 7], "l_": [8, 9], "lambda_": 10, "lapack": [18, 19], "larg": [2, 3, 4, 5, 8, 9, 10, 11, 14, 22], "larger": [8, 9], "last": [4, 5], "later": [4, 5], "latter": [10, 11], "lattic": [6, 7, 8, 9, 12, 13, 14, 15], "layer": [2, 3, 10], "lead": [4, 5, 12, 13], "learn": 22, "least": [12, 13], "lebedev": [14, 15], "leed": [0, 1], "left": [8, 9, 14, 15, 16, 17], "legend": [2, 3, 10, 11, 12, 13, 14], "len": [4, 10, 11], "length": [4, 5, 6, 7, 12, 13, 16, 17], "let": [2, 3, 4, 5, 8, 9, 14, 15, 18, 19], "lett": [4, 5, 16, 17], "level": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "librari": [18, 19], "light": [2, 3], "like": [0, 1, 6, 7, 8, 9, 16, 17], "line": [2, 3, 4, 5, 8, 9, 10, 11, 14, 15, 16, 18, 19], "link": [18, 19], "linspac": [2, 3, 10, 11], "list": [4, 5, 16, 18, 19], "littl": [12, 13], "ll": [4, 5], "lmax": [8, 9], "load": [12, 13], "loadtxt": [2, 3], "local": [14, 15], "locat": [0, 1, 14, 15], "long": [12, 13], "longer": [6, 7, 12, 13], "look": [2, 3, 10, 11, 14, 15, 16, 17], "loop": [4, 5, 16, 17, 18, 19], "looper": [18, 19], "loss": 10, "low": [2, 3, 10, 11], "lower": [10, 11], "lure": 2, "m": [6, 7, 8, 9, 10, 11, 12], "magic": [18, 19], "magnitud": [10, 11], "mai": [2, 3, 12, 13, 14, 18, 19], "main": [14, 15, 16, 17], "major": [6, 7, 16, 17], "make": [18, 19], "mani": [6, 7, 12, 13, 14, 15, 16, 17, 18, 19], "manipul": [0, 1], "manual": [10, 11], "marker": [10, 11], "mass": [10, 11], "match": [2, 3], "materi": [2, 3, 8, 9], "mathr": [4, 5], "matplotlib": [0, 1, 2, 3], "matrix": [4, 5, 8, 9, 12, 13], "matter": [0, 1], "max": [2, 3, 8, 9, 10, 11, 14], "maxima": [4, 5], "mean": [8, 9, 10, 11], "mean_free_path": [10, 11], "mean_square_vibr": [12, 13], "measur": [8, 9], "medium": 14, "memori": [0, 1, 2, 3, 4, 5, 8, 9, 12, 13, 18, 19], "metal": [8, 9], "method": [0, 1, 4, 5], "metrial": 2, "mfp": [8, 9], "middl": [0, 1], "min": [2, 3, 10, 11, 14], "minim": [0, 1], "minut": [12, 13], "miss": [2, 3], "model": [2, 3, 8, 9, 10, 11, 14, 15, 16, 17, 22], "modifi": [18, 19], "modul": [0, 1, 10, 11], "molecul": [0, 1, 4, 5, 6, 7, 14, 15, 18, 19], "moment": [0, 1], "monoxid": [16, 17], "more": [0, 1, 8, 9, 10, 11], "most": [0, 1, 2, 3, 4, 5, 12, 13, 18, 19], "msc": 6, "msd": [10, 11], "msspec": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 16, 17], "mt_radiu": [12, 13], "much": [0, 1, 2, 3, 8, 9, 10, 11], "muffintin_paramet": [2, 3, 10, 11], "multi": [8, 9, 22], "multipl": [0, 1, 4, 5, 10, 11, 12, 13, 18, 19, 22], "multiprocess": [18, 19], "must": [18, 19], "mutlipl": 6, "mx2": [8, 9], "my_filt": 12, "my_script": [18, 19], "n": [8, 9, 12, 13, 14, 15, 16, 17], "n_al": 14, "n_n": 14, "n_plane": 14, "n_side": 14, "name": [18, 19], "natoli": [0, 1], "ncpu": [18, 19], "nd": [8, 9, 12, 13], "ndif": [8, 9], "nearest": [14, 15], "need": [2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "neighbor": [14, 15], "neighbour": [14, 15], "nest": [16, 17, 18, 19], "new": [0, 1], "next": [16, 17], "nickel": [6, 7], "nitrogen": [14, 15], "no_filt": [12, 13], "non": [14, 15], "none": [4, 5, 6, 8, 9, 10, 11, 14], "normal": [2, 3, 16, 17], "note": [12, 13], "now": [2, 3, 14, 16, 17, 18, 19], "np": [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19], "nplane": [10, 11, 14], "num": 18, "number": [0, 1, 4, 5, 6, 7, 8, 9, 10, 11, 14, 16, 18, 19], "numer": [4, 5], "numpi": [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "o": [4, 5, 10, 11, 16, 18, 19], "object": [2, 3, 10, 11, 14, 16, 18, 19], "observ": [6, 7, 8, 9], "obvious": [16, 17], "off_cone_ev": [12, 13, 14], "offer": [12, 13, 18, 19, 22], "often": [18, 19], "omp_num_thread": [18, 19], "one": [6, 10, 11, 12, 13, 14, 15, 18, 19], "ones": 10, "onli": [0, 1, 4, 5, 6, 12, 13, 14, 15], "onto": [16, 17], "optim": [18, 19], "option": [10, 11, 12, 13, 18, 19], "orang": [2, 3, 12], "order": [4, 5, 10, 11, 12, 13, 16, 17], "orient": [2, 3, 4, 5, 16], "origin": [14, 15], "other": [0, 1, 4, 5], "our": [4, 5, 10, 11], "out": [6, 12, 13, 16], "output": [18, 19], "over": [4, 5, 10, 11, 18, 19], "ow": 6, "p": [12, 13, 16], "p1654": [4, 5], "p1760": [8, 9], "p266": [14, 15], "p283": [16, 17], "p6784": [10, 11], "p6785": [10, 11], "p6791": [10, 11], "p8275": [6, 7], "packag": [4, 5, 18, 19], "page": [2, 3], "panda": [18, 19], "paper": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "paragraph": [10, 11], "parallel": 22, "paramet": [2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19], "part": [16, 17, 18, 19], "particular": [6, 7], "past": [2, 3], "path": [4, 5, 8, 9, 10, 11, 14, 15, 22], "path_filt": [12, 13, 14], "pattern": [8, 9, 14, 15], "peak": [6, 7, 8, 9, 14], "ped": [4, 5, 6, 10, 11, 12, 13, 14], "pendri": [16, 17], "perform": [10, 11, 22], "phagen": [0, 1], "phase": [0, 1, 10, 11], "phenom": [12, 13], "phi": [2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19], "photodiffract": [4, 5, 6, 7, 14, 15], "photoelectron": [0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 15, 22], "photoemiss": [14, 15], "phy": [2, 3, 4, 5, 6, 7, 10, 11, 16, 17], "physic": [10, 11], "pi": [8, 9], "pipelin": [18, 19], "plai": [6, 7], "planck": [10, 11], "plane": [0, 1, 2, 3, 8, 9, 10, 11, 14, 15, 16], "plot": [0, 1, 10, 11], "plt": [0, 1, 2, 3], "pm": [4, 5, 16, 17], "point": [2, 3, 14, 15], "polar": [2, 3, 4, 10, 11, 12, 16, 17], "pop": [4, 5, 18, 19], "popup": [2, 3, 4], "posit": [4, 6, 7, 16], "possibl": [4, 5, 12, 13, 16, 17, 18, 19], "potenti": [2, 3, 10, 11], "practic": [10, 11], "precis": [8, 9, 16, 17], "preiou": [8, 9], "present": [6, 7], "pretti": [0, 1], "previou": [0, 1, 6, 7, 12, 13, 14, 15, 18, 19], "previous": [4, 5], "print": [8, 9, 14], "probe": [4, 5, 14, 15], "problem": [4, 5], "process": [0, 1, 12, 13, 22], "processor": [18, 19], "produc": [4, 5], "program": [0, 1], "project": 4, "pronounc": 10, "propag": [0, 1], "proport": [12, 13], "propos": [4, 5, 10, 11], "provid": [8, 9, 16, 18, 19], "publish": [4, 5, 10, 11, 14, 15], "pure": [6, 7], "put": [0, 1, 4, 5], "py": [0, 1, 2, 3, 18, 19], "pyplot": [0, 1, 2, 3], "python": [0, 1, 10, 11, 18, 19], "qualit": [10, 11], "quantit": [4, 5], "question": [12, 13], "quick": [14, 15], "quit": [4, 5, 18, 19], "quiz": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "r": [0, 1, 8, 9, 10, 11, 14, 18, 19, 22], "r16061": [2, 3], "ra_cutoff": [12, 13], "radian": 16, "radiu": [8, 9], "rai": [2, 3, 10, 11], "rang": [6, 8, 9, 10, 11, 14], "rather": [4, 5], "ratio": [14, 15], "rd": [0, 12], "read": [0, 1], "real": [10, 11], "realli": [0, 1], "reason": [18, 19], "recent": [0, 1], "red": [4, 5], "reduc": [10, 11, 12, 13], "ref": 2, "refer": [2, 3], "refract": [2, 3], "regardless": [10, 11], "regim": [12, 13, 22], "rehr": [8, 9, 12, 13, 14, 15], "reject": [12, 13], "rel": [10, 11, 14, 15], "relat": [2, 3, 12, 13], "reliabl": [16, 17], "rememb": [12, 13, 16, 17], "remov": [0, 1, 2, 3], "repeat": [6, 7], "replac": [18, 19], "repres": [4, 10, 11], "represent": 4, "reproduc": [10, 11, 14, 15, 16, 17], "requir": [12, 13, 18, 19], "reshap": [18, 19], "resourc": [18, 19], "respect": [2, 3, 4, 5, 14, 15], "rest": [16, 17], "resulst": [18, 19], "result": [0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 16, 17, 18, 19], "retriev": [10, 11, 14], "return": [10, 11, 14, 16, 17, 18, 19], "rev": [2, 3, 4, 5, 6, 7, 10, 11, 16, 17], "rhodium": [4, 5], "right": [8, 9, 14, 15, 16, 17], "rotat": [2, 3, 6, 7, 8, 9, 14], "rotate_cel": [2, 3, 8, 9], "roughli": [10, 11], "row": [8, 9], "run": [0, 1, 14, 15, 16, 18, 19], "rune": 16, "sa73": 2, "saiki": [16, 17], "same": [0, 1, 6, 7, 12, 13, 14, 15], "sampl": [2, 3, 8, 9, 10, 11], "satisfactori": [2, 3, 4, 5], "save": 0, "saw": [6, 7], "sbag": [2, 3], "scan": [4, 5, 8, 9, 10, 11, 12, 14, 15, 16, 17], "scatter": [0, 1, 10, 11, 14, 15, 16, 17, 18, 19, 22], "scattering_ord": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "sci": [8, 9], "script": [2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 18, 19], "se": [8, 9], "second": [8, 9, 10, 11, 12], "section": [10, 11, 16, 17], "see": [2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 16, 17, 18, 19], "seen": [12, 13, 14, 15], "select": [2, 3, 10, 11, 12, 13, 14], "sensit": [4, 5], "sequenti": [12, 13], "seri": [8, 9, 12, 13, 14, 15], "serial": [12, 13], "set": [0, 1, 6, 7, 10, 11, 12, 13, 14, 16, 17, 18, 19, 22], "set_atom": [0, 1, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14], "set_plot_opt": [6, 10, 11, 14], "sever": [12, 13, 18, 19], "shape": [2, 3, 4, 10, 11, 12, 13, 18, 19], "share": [14, 15, 18, 19], "shift": [0, 1, 10, 11], "short": [14, 15], "should": [2, 3, 8, 16, 17], "show": [0, 1, 14, 15], "shutdown": [2, 3, 10, 11], "side": [14, 15, 16, 17], "signal": [0, 4, 5, 10, 11, 12, 13, 14, 15], "signific": [2, 3], "significantli": [12, 13], "silver": [2, 3], "sim": [10, 16, 17], "similar": [12, 13], "simpl": [6, 7, 10, 11, 16, 17, 18, 19], "simplist": [4, 5], "simul": [0, 1, 4, 5, 6, 7, 14, 18, 19, 22], "sin": [10, 16], "sinc": [0, 1, 8, 9, 10, 11, 12, 13, 14, 15, 22], "singl": [8, 9, 10, 11, 12, 13, 16, 17, 22], "sinl": [4, 5], "site": [4, 5, 16, 17], "situat": [6, 7], "size": [2, 3, 4, 5, 8, 12], "sketch": [14, 15], "small": [2, 3, 4, 5, 8, 9, 10, 11, 14, 15, 16, 17], "smaller": [2, 3], "snipet": [8, 9], "so": [4, 5, 12, 13], "softwar": 22, "solut": 17, "some": [0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19], "soon": [4, 5], "sourc": [2, 3], "source_paramet": [2, 3, 10, 11, 12, 13, 14], "spec": [0, 1], "speci": [4, 5], "specif": [2, 3], "specifi": [18, 19], "spectrosc": [12, 13], "spectroscopi": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 22], "spectroscopy_paramet": [12, 13], "spheric": [0, 1, 8, 9], "spirit": [6, 7], "sqrt": 6, "squar": [10, 11], "ssc": [6, 7, 16, 17], "start": [2, 3, 4, 5, 8, 9, 18, 19, 22], "state": [14, 15], "step": [0, 1, 2, 3, 16, 17, 18, 19], "stereograph": 4, "stop": [18, 19], "store": [8, 9, 10, 11, 16], "straightforward": [0, 1, 14, 15], "strongest": [14, 15], "strongli": [8, 9], "structur": [0, 1, 8, 9, 10], "studi": [4, 5, 6, 7, 14, 15], "substitut": [2, 3, 14, 15], "substrat": [10, 11, 18, 19, 22], "substrate_dset": 14, "subsurfac": [12, 13], "suggest": [18, 19], "suit": [0, 1], "suitabl": [6, 7, 14, 15], "sum": [10, 11, 14, 15], "sum_": 12, "surf": [8, 9], "surfac": [2, 3, 4, 5, 6, 7, 14, 15, 16, 17], "surround": [14, 15], "sweep": [18, 19], "sweep_index": [18, 19], "symbol": [2, 3, 6, 7], "symmetri": [14, 15], "synchrotron": 2, "system": [18, 19], "s\u00e9billeau": [0, 1], "t": [2, 3, 4, 5, 10, 11, 16], "tag": [8, 9, 14], "take": [0, 1, 2, 3, 8, 9, 12, 13, 14, 15], "taken": [12, 13, 14, 15], "task": [16, 17, 18, 19], "tb": [8, 9], "technic": [18, 19], "techniqu": [0, 1, 22], "temp": [2, 3], "temperatur": [14, 15, 22], "termin": [0, 1, 14, 15], "tetrahedron": [14, 15], "text": [2, 3], "th": [12, 13], "than": [2, 3, 10, 11, 12, 13], "thank": [4, 5], "thei": [4, 5, 6, 7, 10, 11], "them": 0, "theori": 22, "thermal": 10, "theses": [12, 13], "theta": [2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19], "theta_d": [10, 11], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], "thick": [8, 9], "those": [0, 1, 2, 3, 16, 17], "threshold": [12, 13], "through": 22, "thu": [14, 15], "ti": [8, 9], "ti2p": [8, 9], "tilt": [6, 7, 18, 19], "time": [0, 1, 8, 9, 12, 13, 18, 19], "titl": [4, 10, 11, 14], "tl_threshold": [12, 13], "tmatrix_paramet": [10, 11, 12, 13], "tmp_data": 14, "to_dict": [18, 19], "togeth": 22, "too": [2, 3, 4, 5, 8, 9, 12, 13, 14], "took": [12, 13], "tool": [0, 1, 14, 15], "top": [2, 3, 4], "total": [0, 10, 11, 12, 13, 14, 15, 18, 19], "toward": [4, 5], "transit": [8, 9], "treat": [12, 13], "trehan": [10, 11], "tricot": [12, 13], "trilay": [8, 9], "true": [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 16], "try": [2, 3, 4, 5, 8, 9, 12, 13, 14, 16, 17], "two": [0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 16, 17], "txt": [2, 3], "type": [0, 1, 8, 9], "typic": [0, 1, 8, 9, 10, 11], "u": [8, 9], "u_j": [10, 11], "unambigu": [14, 15], "underli": [4, 5], "understand": [6, 7], "uniqu": [18, 19], "unit": [8, 9, 18, 19], "up": [0, 1, 12, 13, 22], "updat": [10, 11, 14, 16], "upward": [14, 15], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "use_debye_model": [10, 11], "useful": [8, 9], "user": [18, 19], "usual": [8, 9], "utf8": [12, 13], "util": [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 16, 17], "v": [8, 9, 14, 15], "vacuum": 8, "valu": [4, 5, 8, 9, 10, 11, 12, 13, 16, 18, 19], "van": [6, 7, 8, 9], "vari": [4, 5, 6, 7, 10, 11], "variabl": [2, 3, 16, 18, 19], "variat": [4, 10, 11], "varii": [18, 19], "variou": [4, 6, 7, 22], "veri": [4, 5, 6, 7, 12, 13], "version": [0, 1, 18, 19], "versu": [10, 11, 14, 15], "vibrat": [10, 11], "vibration_sc": [10, 11], "vibrational_damp": [10, 11, 12, 13], "view": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15], "visual": [0, 1, 2, 3, 4, 5, 8, 9], "volum": [8, 9, 14, 15], "wa": [12, 13, 16, 17], "waal": [8, 9], "wai": [10, 11], "waller": [10, 11], "want": [10, 11, 14, 15], "water": [0, 1], "wave": [0, 1, 4, 8, 9], "we": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22], "well": [0, 1, 8, 9, 10, 11, 14], "were": [12, 13, 14, 15], "what": [0, 1, 4, 5, 6, 7, 8, 9, 12, 13, 16, 17], "when": [2, 3, 6, 7, 10, 12, 13, 18, 19], "where": [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "which": [4, 12, 13, 16, 18, 19], "whose": [12, 13, 18, 19], "why": [12, 13], "wide": [4, 5], "withe": 16, "within": [12, 13], "without": [0, 1, 12, 13], "work": [0, 1, 6, 7, 10, 11, 14, 15], "would": [2, 3, 8, 9, 12, 13], "write": [16, 17], "written": [0, 1], "wurtzit": 14, "x": [2, 3, 10, 11, 16], "x_alpha_r": [10, 11], "xlabel": [10, 11, 14], "xpd": [8, 9, 22], "xraysourc": [10, 11, 12, 13, 14], "xu": [6, 7], "y": [2, 3, 6, 16], "yellow": [12, 13], "ylabel": [10, 11, 14], "ylim": 6, "you": [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15, 18, 19, 22], "your": [0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 16, 18, 19], "z": [2, 3, 4, 5, 8, 9, 16], "z0": 4, "z_0": [4, 5], "zi": 4, "\u00b5": [12, 13], "\u00e5": [4, 5, 6, 7, 8, 9, 12, 13, 16, 17, 18, 19]}, "titles": ["Activity 1: Getting started", "Activity 1: Getting started", "Activity 2: Setting up the \u201cexperiment\u201d", "Activity 2: Setting up the \u201cexperiment\u201d", "Activity 3: Adsorbates and the single scattering approach", "Activity 3: Adsorbates and the single scattering approach", "Activity 4: From single scattering to multiple scattering", "Activity 4: From single scattering to multiple scattering", "Activity 5: Multiple scattering in the forward scattering regime", "Activity 5: Multiple scattering in the forward scattering regime", "Activity 6: Effect of the temperature", "Activity 6: Effect of the temperature", "Activity 7: Large clusters and path filtering", "Activity 7: Large clusters and path filtering", "Activity 8: Inequivalent emitters and the XPD of a substrate", "Activity 8: Inequivalent emitters and the XPD of a substrate", "Activity 9: Comparing simulation and experiment with R-factors", "Activity 9: Comparing simulation and experiment with R-factors", "Activity 10: Parallelization and multi-processing in MsSpec", "Activity 10: Parallelization and multi-processing in MsSpec", "Activity 11: Spectral radius and convergence", "Final word", "Welcome to this small MsSpec tour"], "titleterms": {"001": [0, 1, 4, 5, 12, 13, 16, 17], "1": [0, 1], "10": [18, 19], "11": 20, "111": [2, 3], "1t": [8, 9], "2": [2, 3, 8, 9], "3": [4, 5], "4": [6, 7], "5": [8, 9], "6": [10, 11], "7": [12, 13], "8": [14, 15], "9": [16, 17], "The": [10, 11, 12, 13, 14, 15, 16, 17], "activ": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "adsorb": [4, 5], "ag": [2, 3], "aln": [14, 15], "aluminium": [14, 15], "an": [2, 3], "applic": [12, 13], "approach": [4, 5], "atom": [0, 1, 6, 7], "azimuth": [2, 3], "backscatt": [4, 5], "barebon": [0, 1], "base": [18, 19], "build": [0, 1, 2, 3, 6, 7], "bulk": [10, 11], "chain": [6, 7], "cluster": [0, 1, 2, 3, 8, 9, 12, 13], "co": [16, 17], "compar": [16, 17], "comput": [2, 3, 4, 5], "converg": 20, "creat": [8, 9], "cu": [0, 1], "deep": [12, 13], "developp": 21, "due": [4, 5], "effect": [8, 9, 10, 11], "emitt": [14, 15], "exampl": [2, 3], "experi": [2, 3, 16, 17], "factor": [4, 5, 16, 17], "fe": [16, 17], "filter": [12, 13], "final": 21, "forward": [8, 9], "from": [6, 7], "futur": 21, "get": [0, 1], "growth": [2, 3], "help": [6, 7], "how": 21, "induc": [2, 3], "inequival": [14, 15], "instal": 21, "interfer": [4, 5], "invers": [18, 19], "larg": [12, 13], "matrix": [18, 19], "molecul": [16, 17], "msspec": [0, 1, 12, 13, 18, 19, 21, 22], "multi": [18, 19], "multipl": [6, 7, 8, 9], "need": [6, 7], "ni": [6, 7], "nitrid": [14, 15], "number": [12, 13], "order": [8, 9], "our": 21, "oxygen": [4, 5], "parallel": [18, 19], "path": [12, 13], "ped": [0, 1, 8, 9], "plane": [12, 13], "polar": [0, 1, 6, 7, 14, 15], "process": [18, 19], "r": [16, 17], "radiu": 20, "regim": [8, 9], "rh": [4, 5], "sampl": [12, 13], "sb": [2, 3], "scan": [0, 1, 2, 3, 6, 7], "scatter": [4, 5, 6, 7, 8, 9, 12, 13], "script": [0, 1, 10, 11], "set": [2, 3], "shape": [0, 1], "si": [12, 13], "simul": [16, 17], "singl": [4, 5, 6, 7], "small": 22, "smooth": [2, 3], "solut": [0, 2, 4, 6, 8, 10, 12, 14, 16, 18], "spectral": 20, "start": [0, 1, 6, 7], "sub": [8, 9], "substrat": [14, 15], "surfac": [8, 9, 10, 11], "system": [0, 1], "temperatur": [10, 11], "thi": 22, "tilt": [16, 17], "tise": [8, 9], "tise2": [8, 9], "tour": 22, "unusu": [16, 17], "up": [2, 3], "welcom": 22, "word": 21, "work": 21, "xpd": [14, 15], "you": [6, 7]}})
\ No newline at end of file