BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
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"
28 
29 using Units::deg;
30 
32 {
33  Layer vacuum_layer(refMat::Vacuum);
34  Layer substrate_layer(refMat::Substrate);
35 
36  Interference2DLattice iff(BasicLattice2D(5.0, 10.0, 30.0 * deg, 10.0 * deg));
37 
38  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 0);
39  iff.setDecayFunction(pdf);
40 
41  // particles
42  ParticleLayout particle_layout;
43  Cylinder ff_cyl(5.0, 5.0);
44  Particle particle(refMat::Particle, ff_cyl);
45  particle_layout.addParticle(particle);
46 
47  particle_layout.setInterference(iff);
48 
49  vacuum_layer.addLayout(particle_layout);
50 
51  auto* sample = new MultiLayer();
52  sample->addLayer(vacuum_layer);
53  sample->addLayer(substrate_layer);
54  return sample;
55 }
56 
57 // -----------------------------------------------------------------------------
58 // lattice #1:
59 // -----------------------------------------------------------------------------
61 {
62  Layer vacuum_layer(refMat::Vacuum);
63  Layer substrate_layer(refMat::Substrate);
64 
66  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 0);
67  iff.setDecayFunction(pdf);
68 
69  // particles
70  ParticleLayout particle_layout;
71  Cylinder ff_cyl(5.0, 5.0);
72  Particle particle(refMat::Particle, ff_cyl);
73  particle_layout.addParticle(particle);
74 
75  particle_layout.setInterference(iff);
76 
77  vacuum_layer.addLayout(particle_layout);
78 
79  auto* sample = new MultiLayer();
80  sample->addLayer(vacuum_layer);
81  sample->addLayer(substrate_layer);
82  return sample;
83 }
84 
85 // -----------------------------------------------------------------------------
86 // lattice #2: centered
87 // -----------------------------------------------------------------------------
89 {
90  Layer vacuum_layer(refMat::Vacuum);
91  Layer substrate_layer(refMat::Substrate);
92 
93  Interference2DLattice interparticle(BasicLattice2D(10.0, 10.0, M_PI / 2.0, 0));
94  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 0);
95  interparticle.setDecayFunction(pdf);
96 
97  Cylinder ff_cyl(5.0, 5.0);
98  Particle cylinder(refMat::Particle, ff_cyl);
99  std::vector<R3> positions;
100  R3 position_1(0.0, 0.0, 0.0);
101  R3 position_2(5.0, -5.0, 0.0);
102  positions.push_back(position_1);
103  positions.push_back(position_2);
104  ParticleComposition basis;
105  basis.addParticles(cylinder, positions);
106 
107  ParticleLayout particle_layout;
108  particle_layout.addParticle(basis);
109  particle_layout.setInterference(interparticle);
110  vacuum_layer.addLayout(particle_layout);
111 
112  auto* sample = new MultiLayer();
113  sample->addLayer(vacuum_layer);
114  sample->addLayer(substrate_layer);
115  return sample;
116 }
117 
118 // -----------------------------------------------------------------------------
119 // lattice #3: rotated
120 // -----------------------------------------------------------------------------
122 {
123  Layer vacuum_layer(refMat::Vacuum);
124  Layer substrate_layer(refMat::Substrate);
125 
126  Interference2DLattice iff(SquareLattice2D(10.0, 30.0 * deg));
127  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 30.0 * deg);
128  iff.setDecayFunction(pdf);
129 
130  ParticleLayout particle_layout;
131  // particle
132  Cylinder ff_cyl(5.0, 5.0);
133  R3 position(0.0, 0.0, 0.0);
134  Particle p(refMat::Particle, ff_cyl);
135  p.setParticlePosition(position);
136  particle_layout.addParticle(p);
137  particle_layout.setInterference(iff);
138 
139  vacuum_layer.addLayout(particle_layout);
140 
141  auto* sample = new MultiLayer();
142  sample->addLayer(vacuum_layer);
143  sample->addLayer(substrate_layer);
144  return sample;
145 }
146 
147 // -----------------------------------------------------------------------------
148 // lattice #4: finite square
149 // -----------------------------------------------------------------------------
151 {
152  Layer vacuum_layer(refMat::Vacuum);
153  Layer substrate_layer(refMat::Substrate);
154 
155  InterferenceFinite2DLattice iff(SquareLattice2D(10.0, 0.0), 40, 40);
156  iff.setPositionVariance(1.0);
157 
158  // particles
159  ParticleLayout particle_layout;
160  Cylinder ff_cyl(5.0, 5.0);
161  Particle particle(refMat::Particle, ff_cyl);
162  particle_layout.addParticle(particle, 1.0);
163 
164  particle_layout.setInterference(iff);
165 
166  vacuum_layer.addLayout(particle_layout);
167 
168  auto* sample = new MultiLayer();
169  sample->addLayer(vacuum_layer);
170  sample->addLayer(substrate_layer);
171  return sample;
172 }
173 
174 // -----------------------------------------------------------------------------
175 // lattice #5: superlattice
176 // -----------------------------------------------------------------------------
178 {
179  Layer vacuum_layer(refMat::Vacuum);
180  Layer substrate_layer(refMat::Substrate);
181 
182  Interference2DSuperLattice iff(SquareLattice2D(200.0, 0.0), 40, 40);
183  InterferenceFinite2DLattice substructure(SquareLattice2D(10.0, 0.0), 10, 10);
184  iff.setSubstructureIFF(substructure);
185  iff.setPositionVariance(1.0);
186 
187  // particles
188  ParticleLayout particle_layout;
189  Cylinder ff_cyl(5.0, 10.0);
190  Particle particle(refMat::Vacuum, ff_cyl);
191  particle.translate(R3(0.0, 0.0, -10.0));
192  particle_layout.addParticle(particle);
193 
194  particle_layout.setInterference(iff);
195  particle_layout.setTotalParticleSurfaceDensity(100.0 / 4e4);
196 
197  substrate_layer.addLayout(particle_layout);
198 
199  auto* sample = new MultiLayer();
200  sample->addLayer(vacuum_layer);
201  sample->addLayer(substrate_layer);
202  return sample;
203 }
#define M_PI
Definition: Constants.h:44
Defines class Cylinder.
Defines class Interference2DLattice.
Defines class Interference2DSuperLattice.
Defines class InterferenceFinite2DLattice.
Defines class Layer.
Defines class MultiLayer.
Defines class ParticleComposition.
Defines class ParticleLayout.
Defines class Particle.
Defines interface class IProfile2D, and children thereof.
Defines materials in namespace refMat.
Defines class IsGISAXS06Builder.
Defines some unit conversion factors and other constants in namespace Units.
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:51
A circular cylinder.
Definition: Cylinder.h:23
void setPositionVariance(double var)
Sets the variance of the position for the calculation of the DW factor It is defined as the variance ...
IParticle * translate(R3 translation)
Translates the particle, and returns this.
Definition: IParticle.cpp:25
void setParticlePosition(R3 position)
Sets relative position of the particle's reference point in the coordinate system of parent.
Definition: IParticle.h:51
Interference function of a 2D lattice.
void setDecayFunction(const IProfile2D &decay)
Sets two-dimensional decay function.
Interference function of a 2D superlattice with a configurable interference function for each lattice...
void setSubstructureIFF(const IInterference &sub_iff)
Interference function of a finite 2D lattice.
A layer in a MultiLayer sample.
Definition: Layer.h:26
void addLayout(const ParticleLayout &layout)
Definition: Layer.cpp:49
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:43
A composition of particles at fixed positions.
void addParticles(const IParticle &particle, std::vector< R3 > positions)
Decorator class that adds particles to ISampleNode objects.
void setTotalParticleSurfaceDensity(double particle_density)
Sets total particle surface density.
void addParticle(const IParticle &particle, double abundance=-1.0)
Adds particle to the layout with abundance, position and the rotation defined.
void setInterference(const IInterference &interparticle)
Adds interference functions.
A particle with a form factor and refractive index.
Definition: Particle.h:25
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
Definition: Profiles2D.h:71
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:76
MultiLayer * createSquareLattice2D()
MultiLayer * createFiniteSquareLattice2D()
MultiLayer * createRotatedSquareLattice2D()
MultiLayer * createSuperLattice()
MultiLayer * createCenteredSquareLattice2D()
MultiLayer * createBasic2DLattice()
static constexpr double deg
Definition: Units.h:46
static const Material Vacuum
static const Material Particle
static const Material Substrate