BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ParaCrystalBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/StandardSamples/ParaCrystalBuilder.cpp
6 //! @brief Implements class ParaCrystalBuilder.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
16 #include "Base/Const/Units.h"
17 #include "Base/Utils/Assert.h"
27 
29 {
30  const double m_corr_peak_distance(20.0 * Units::nm);
31  const double m_corr_width(7 * Units::nm);
32  const double m_corr_length(1e3 * Units::nm);
33  const double m_cylinder_height(5 * Units::nm);
34  const double m_cylinder_radius(5 * Units::nm);
35 
36  Layer vacuum_layer(refMat::Vacuum);
37  Layer substrate_layer(refMat::Substrate);
38 
39  InterferenceFunctionRadialParaCrystal iff(m_corr_peak_distance, m_corr_length);
40  FTDistribution1DGauss pdf(m_corr_width);
42  FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
43 
44  Particle particle(refMat::Particle, ff_cylinder);
45  ParticleLayout particle_layout(particle);
46  particle_layout.setInterferenceFunction(iff);
47 
48  vacuum_layer.addLayout(particle_layout);
49 
50  MultiLayer* multi_layer = new MultiLayer();
51  multi_layer->addLayer(vacuum_layer);
52  multi_layer->addLayer(substrate_layer);
53  return multi_layer;
54 }
55 
56 // -----------------------------------------------------------------------------
57 // Basic2DParaCrystalBuilder
58 // -----------------------------------------------------------------------------
59 
61  : m_pdf1(new FTDistribution2DCauchy(0.1 * Units::nm, 0.2 * Units::nm, 0))
62  , m_pdf2(new FTDistribution2DCauchy(0.3 * Units::nm, 0.4 * Units::nm, 0))
63 {
64 }
65 
67 
69 {
70  Layer vacuum_layer(refMat::Vacuum);
71  Layer substrate_layer(refMat::Substrate);
72 
74  BasicLattice2D(10.0 * Units::nm, 20.0 * Units::nm, 30.0 * Units::deg, 45.0 * Units::deg),
75  1000.0 * Units::nm, 20.0 * Units::micrometer, 40.0 * Units::micrometer);
76 
78 
79  FormFactorCylinder ff_cylinder(5.0 * Units::nm, 5.0 * Units::nm);
80 
81  Particle particle(refMat::Particle, ff_cylinder);
82  ParticleLayout particle_layout(particle);
83  particle_layout.setInterferenceFunction(iff);
84 
85  vacuum_layer.addLayout(particle_layout);
86 
87  MultiLayer* multi_layer = new MultiLayer();
88  multi_layer->addLayer(vacuum_layer);
89  multi_layer->addLayer(substrate_layer);
90  return multi_layer;
91 }
92 
94 {
96 
97  auto names = FTDistribution2DComponents().keys();
98  m_pdf2.reset(FTDistribution2DComponents().getItem(names.at(index))->clone());
99 
100  setName(names.at(index));
101 
102  return buildSample();
103 }
104 
105 // -----------------------------------------------------------------------------
106 // HexParaCrystalBuilder
107 // -----------------------------------------------------------------------------
108 
110 {
111  const double m_peak_distance(20.0 * Units::nm);
112  const double m_corr_length(0.0);
113  const double m_domain_size_1(20.0 * Units::micrometer);
114  const double m_domain_size_2(20.0 * Units::micrometer);
115  const double m_cylinder_height(5 * Units::nm);
116  const double m_cylinder_radius(5 * Units::nm);
117 
118  Layer vacuum_layer(refMat::Vacuum);
119  Layer substrate_layer(refMat::Substrate);
120 
121  InterferenceFunction2DParaCrystal iff(HexagonalLattice2D(m_peak_distance, 0.0), m_corr_length,
122  m_domain_size_1, m_domain_size_2);
123  iff.setIntegrationOverXi(true);
124  FTDistribution2DCauchy pdf(1.0 * Units::nm, 1.0 * Units::nm, 0);
125  iff.setProbabilityDistributions(pdf, pdf);
126 
127  FormFactorCylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
128  Particle cylinder(refMat::Particle, ff_cylinder);
129 
130  ParticleLayout particle_layout(cylinder);
131  particle_layout.setInterferenceFunction(iff);
132 
133  vacuum_layer.addLayout(particle_layout);
134 
135  MultiLayer* multi_layer = new MultiLayer();
136  multi_layer->addLayer(vacuum_layer);
137  multi_layer->addLayer(substrate_layer);
138  return multi_layer;
139 }
140 
141 // -----------------------------------------------------------------------------
142 // RectParaCrystalBuilder
143 // -----------------------------------------------------------------------------
144 
146 {
147  Layer vacuum_layer(refMat::Vacuum);
148  Layer substrate_layer(refMat::Substrate);
149 
151  iff.setIntegrationOverXi(true);
153  FTDistribution2DCauchy pdf1(0.5 * Units::nm, 2.0 * Units::nm, 0);
154  FTDistribution2DCauchy pdf2(0.5 * Units::nm, 2.0 * Units::nm, 0);
155  iff.setProbabilityDistributions(pdf1, pdf2);
156 
157  FormFactorCylinder ff_cylinder(5.0 * Units::nm, 5.0 * Units::nm);
158 
159  Particle particle(refMat::Particle, ff_cylinder);
160  ParticleLayout particle_layout(particle);
161  particle_layout.setInterferenceFunction(iff);
162 
163  vacuum_layer.addLayout(particle_layout);
164 
165  MultiLayer* multi_layer = new MultiLayer();
166  multi_layer->addLayer(vacuum_layer);
167  multi_layer->addLayer(substrate_layer);
168  return multi_layer;
169 }
Defines the macro ASSERT.
#define ASSERT(condition)
Definition: Assert.h:31
Defines sample components for complex sample builders.
Defines class FormFactorCylinder.
Defines class InterferenceFunction2DParaCrystal.
Defines class InterferenceFunctionRadialParaCrystal.
Defines class Layer.
Defines class MultiLayer.
Defines classes of ParaCrystalBuilder family.
Defines class ParticleLayout.
Defines class Particle.
Defines materials in namespace refMat.
Defines some unit conversion factors and other constants in namespace Units.
std::unique_ptr< IFTDistribution2D > m_pdf2
MultiLayer * createSampleByIndex(size_t index)
MultiLayer * buildSample() const
std::unique_ptr< IFTDistribution2D > m_pdf1
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:53
Gaussian IFTDistribution1D; its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1...
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
Predefined Fourier transformed distributions for functional tests.
A circular cylinder.
MultiLayer * buildSample() const
A two-dimensional Bravais lattice with hexagonal symmetry.
Definition: Lattice2D.h:92
void setName(const std::string &name)
std::vector< std::string > keys() const
Definition: IRegistry.h:43
virtual size_t size()
Interference function of a 2D paracrystal.
void setProbabilityDistributions(const IFTDistribution2D &pdf_1, const IFTDistribution2D &pdf_2)
Sets the probability distributions (Fourier transformed) for the two lattice directions.
void setIntegrationOverXi(bool integrate_xi)
Enables/disables averaging over the lattice rotation angle.
void setDomainSizes(double size_1, double size_2)
Sets the sizes of coherence domains.
Interference function of radial paracrystal.
void setProbabilityDistribution(const IFTDistribution1D &pdf)
Sets one-dimensional probability distribution.
A layer in a MultiLayer sample.
Definition: Layer.h:27
void addLayout(const ParticleLayout &decoration)
Definition: Layer.cpp:58
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:41
void addLayer(const Layer &layer)
Adds layer with default (zero) roughness.
Definition: MultiLayer.cpp:53
Decorator class that adds particles to ISampleNode objects.
void setInterferenceFunction(const IInterferenceFunction &interference_function)
Adds interference functions.
A particle with a form factor and refractive index.
Definition: Particle.h:24
MultiLayer * buildSample() const
MultiLayer * buildSample() const
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:73
Constants and functions for physical unit conversions.
Definition: Units.h:30
static constexpr double deg
Definition: Units.h:46
static constexpr double micrometer
Definition: Units.h:35
static constexpr double nm
Definition: Units.h:39
static const Material Vacuum
static const Material Particle
static const Material Substrate