BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
TwoDimLatticeBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/StandardSamples/TwoDimLatticeBuilder.cpp
6 //! @brief Implements class IsGISAXS06Builder.
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"
27 
29 {
30  Layer vacuum_layer(refMat::Vacuum);
31  Layer substrate_layer(refMat::Substrate);
32 
34  BasicLattice2D(5.0 * Units::nm, 10.0 * Units::nm, 30.0 * Units::deg, 10.0 * Units::deg));
35 
36  FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI, 0);
37  iff.setDecayFunction(pdf);
38 
39  // particles
40  ParticleLayout particle_layout;
41  FormFactorCylinder ff_cyl(5.0 * Units::nm, 5.0 * Units::nm);
42  Particle particle(refMat::Particle, ff_cyl);
43  particle_layout.addParticle(particle, 1.0);
44 
45  particle_layout.setInterferenceFunction(iff);
46 
47  vacuum_layer.addLayout(particle_layout);
48 
49  MultiLayer* multi_layer = new MultiLayer();
50  multi_layer->addLayer(vacuum_layer);
51  multi_layer->addLayer(substrate_layer);
52  return multi_layer;
53 }
54 
55 // -----------------------------------------------------------------------------
56 // lattice #1:
57 // -----------------------------------------------------------------------------
59 {
60  Layer vacuum_layer(refMat::Vacuum);
61  Layer substrate_layer(refMat::Substrate);
62 
64  FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI, 0);
65  iff.setDecayFunction(pdf);
66 
67  // particles
68  ParticleLayout particle_layout;
69  FormFactorCylinder ff_cyl(5.0 * Units::nm, 5.0 * Units::nm);
70  Particle particle(refMat::Particle, ff_cyl);
71  particle_layout.addParticle(particle, 1.0);
72 
73  particle_layout.setInterferenceFunction(iff);
74 
75  vacuum_layer.addLayout(particle_layout);
76 
77  MultiLayer* multi_layer = new MultiLayer();
78  multi_layer->addLayer(vacuum_layer);
79  multi_layer->addLayer(substrate_layer);
80  return multi_layer;
81 }
82 
83 // -----------------------------------------------------------------------------
84 // lattice #2: centered
85 // -----------------------------------------------------------------------------
87 {
88  Layer vacuum_layer(refMat::Vacuum);
89  Layer substrate_layer(refMat::Substrate);
90 
91  InterferenceFunction2DLattice interference_function(
92  BasicLattice2D(10.0 * Units::nm, 10.0 * Units::nm, M_PI / 2.0, 0));
93  FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI, 0);
94  interference_function.setDecayFunction(pdf);
95 
96  FormFactorCylinder ff_cyl(5.0 * Units::nm, 5.0 * Units::nm);
97  Particle cylinder(refMat::Particle, ff_cyl);
98  std::vector<kvector_t> positions;
99  kvector_t position_1(0.0, 0.0, 0.0);
100  kvector_t position_2(5.0 * Units::nm, -5.0 * Units::nm, 0.0);
101  positions.push_back(position_1);
102  positions.push_back(position_2);
103  ParticleComposition basis;
104  basis.addParticles(cylinder, positions);
105 
106  ParticleLayout particle_layout;
107  particle_layout.addParticle(basis);
108  particle_layout.setInterferenceFunction(interference_function);
109  vacuum_layer.addLayout(particle_layout);
110 
111  MultiLayer* multi_layer = new MultiLayer();
112  multi_layer->addLayer(vacuum_layer);
113  multi_layer->addLayer(substrate_layer);
114  return multi_layer;
115 }
116 
117 // -----------------------------------------------------------------------------
118 // lattice #3: rotated
119 // -----------------------------------------------------------------------------
121 {
122  Layer vacuum_layer(refMat::Vacuum);
123  Layer substrate_layer(refMat::Substrate);
124 
126  FTDecayFunction2DCauchy pdf(300.0 * Units::nm / 2.0 / M_PI, 100.0 * Units::nm / 2.0 / M_PI,
127  30.0 * Units::deg);
128  iff.setDecayFunction(pdf);
129 
130  ParticleLayout particle_layout;
131  // particle
132  FormFactorCylinder ff_cyl(5.0 * Units::nm, 5.0 * Units::nm);
133  kvector_t position(0.0, 0.0, 0.0);
134  Particle p(refMat::Particle, ff_cyl);
135  p.setPosition(position);
136  particle_layout.addParticle(p);
137  particle_layout.setInterferenceFunction(iff);
138 
139  vacuum_layer.addLayout(particle_layout);
140 
141  MultiLayer* multi_layer = new MultiLayer();
142  multi_layer->addLayer(vacuum_layer);
143  multi_layer->addLayer(substrate_layer);
144  return multi_layer;
145 }
146 
147 // -----------------------------------------------------------------------------
148 // lattice #4: finite square
149 // -----------------------------------------------------------------------------
151 {
152  Layer vacuum_layer(refMat::Vacuum);
153  Layer substrate_layer(refMat::Substrate);
154 
156  iff.setPositionVariance(1.0);
157 
158  // particles
159  ParticleLayout particle_layout;
160  FormFactorCylinder ff_cyl(5.0 * Units::nm, 5.0 * Units::nm);
161  Particle particle(refMat::Particle, ff_cyl);
162  particle_layout.addParticle(particle, 1.0);
163 
164  particle_layout.setInterferenceFunction(iff);
165 
166  vacuum_layer.addLayout(particle_layout);
167 
168  MultiLayer* multi_layer = new MultiLayer();
169  multi_layer->addLayer(vacuum_layer);
170  multi_layer->addLayer(substrate_layer);
171  return multi_layer;
172 }
173 
174 // -----------------------------------------------------------------------------
175 // lattice #5: superlattice
176 // -----------------------------------------------------------------------------
178 {
179  Layer vacuum_layer(refMat::Vacuum);
180  Layer substrate_layer(refMat::Substrate);
181 
183  InterferenceFunctionFinite2DLattice substructure(SquareLattice2D(10.0 * Units::nm, 0.0), 10,
184  10);
185  iff.setSubstructureIFF(substructure);
186  iff.setPositionVariance(1.0);
187 
188  // particles
189  ParticleLayout particle_layout;
190  FormFactorCylinder ff_cyl(5.0 * Units::nm, 10.0 * Units::nm);
191  Particle particle(refMat::Vacuum, ff_cyl);
192  particle_layout.addParticle(particle, 1.0, kvector_t(0.0, 0.0, -10.0 * Units::nm));
193 
194  particle_layout.setInterferenceFunction(iff);
195  particle_layout.setTotalParticleSurfaceDensity(100.0 / 4e4);
196 
197  substrate_layer.addLayout(particle_layout);
198 
199  MultiLayer* multi_layer = new MultiLayer();
200  multi_layer->addLayer(vacuum_layer);
201  multi_layer->addLayer(substrate_layer);
202  return multi_layer;
203 }
#define M_PI
Definition: Constants.h:44
Defines class FormFactorCylinder.
Defines class InterferenceFunction2DLattice.
Defines class InterferenceFunction2DSuperLattice.
Defines class InterferenceFunctionFinite2DLattice.
Defines class Layer.
Defines class MultiLayer.
Defines class ParticleComposition.
Defines class ParticleLayout.
Defines class Particle.
Defines materials in namespace refMat.
Defines class IsGISAXS06Builder.
Defines some unit conversion factors and other constants in namespace Units.
BasicVector3D< double > kvector_t
Definition: Vectors3D.h:21
MultiLayer * buildSample() const
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:53
Two-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-r) in real space,...
Definition: FTDecay2D.h:65
A circular cylinder.
void setPositionVariance(double var)
Sets the variance of the position for the calculation of the DW factor It is defined as the variance ...
void setPosition(kvector_t position)
Sets relative position of the particle's reference point in the coordinate system of parent.
Definition: IParticle.h:50
Interference function of a 2D lattice.
void setDecayFunction(const IFTDecayFunction2D &decay)
Sets two-dimensional decay function.
Interference function of a 2D superlattice with a configurable interference function for each lattice...
void setSubstructureIFF(const IInterferenceFunction &sub_iff)
Interference function of a finite 2D lattice.
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
A composition of particles at fixed positions.
void addParticles(const IParticle &particle, std::vector< kvector_t > positions)
Decorator class that adds particles to ISampleNode objects.
void setTotalParticleSurfaceDensity(double particle_density)
Sets total particle surface density.
void setInterferenceFunction(const IInterferenceFunction &interference_function)
Adds interference functions.
void addParticle(const IAbstractParticle &particle, double abundance=-1.0, const kvector_t position={}, const IRotation &rotation=IdentityRotation())
Adds particle to the layout with abundance, position and the rotation defined.
A particle with a form factor and refractive index.
Definition: Particle.h:24
MultiLayer * buildSample() const
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:73
MultiLayer * buildSample() const
static constexpr double deg
Definition: Units.h:46
static constexpr double nm
Definition: Units.h:39
static const Material Vacuum
static const Material Particle
static const Material Substrate