BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ParticleDistributionsBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/StandardSamples/ParticleDistributionsBuilder.cpp
6 //! @brief Implements classes of with different types of particle distributions.
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"
30 
32 {
33  const double height(5 * Units::nm);
34  const double radius(5 * Units::nm);
35 
36  Layer vacuum_layer(refMat::Vacuum);
37 
38  ParticleLayout particle_layout;
39  // preparing prototype of nano particle
40  double sigma = 0.2 * radius;
41  FormFactorCylinder p_ff_cylinder(radius, height);
42  Particle nano_particle(refMat::Particle, p_ff_cylinder);
43  // radius of nanoparticles will be sampled with gaussian probability
44  int n_samples(100);
45  // to get radius_min = average - 2.0*FWHM:
46  double n_sigma = 2.0 * 2.0 * std::sqrt(2.0 * std::log(2.0));
47  DistributionGaussian gauss(radius, sigma);
48  ParameterPattern pattern;
49  pattern.add("Particle").add("Cylinder").add("Radius");
50  ParameterDistribution par_distr(pattern.toStdString(), gauss, static_cast<size_t>(n_samples),
51  n_sigma);
52  ParticleDistribution particle_collection(nano_particle, par_distr);
53  particle_layout.addParticle(particle_collection);
54 
55  vacuum_layer.addLayout(particle_layout);
56 
57  MultiLayer* multi_layer = new MultiLayer();
58  multi_layer->addLayer(vacuum_layer);
59  return multi_layer;
60 }
61 
62 // ----------------------------------------------------------------------------
63 //
64 // ----------------------------------------------------------------------------
65 
67  : m_radius1(5 * Units::nm)
68  , m_radius2(10 * Units::nm)
69  , m_height1(5 * Units::nm)
70  , m_height2(10 * Units::nm)
71  , m_sigma1_ratio(0.2)
72  , m_sigma2_ratio(0.02)
73 {
74 }
75 
77 {
78  Layer vacuum_layer(refMat::Vacuum);
79 
80  ParticleLayout particle_layout;
81 
82  // preparing nano particles prototypes for seeding layer's particle_layout
83  FormFactorCylinder p_ff_cylinder1(m_radius1, m_height1);
84  Particle cylinder1(refMat::Particle, p_ff_cylinder1);
85 
86  FormFactorCylinder p_ff_cylinder2(m_radius2, m_height2);
87  Particle cylinder2(refMat::Particle, p_ff_cylinder2);
88 
89  // radius of nanoparticles will be sampled with gaussian probability
90  int nbins = 150;
91  double sigma1 = m_radius1 * m_sigma1_ratio;
92  double sigma2 = m_radius2 * m_sigma2_ratio;
93  // to have xmin=average-3*sigma
94  double n_sigma = 3.0;
95  DistributionGaussian gauss1(m_radius1, sigma1);
96  DistributionGaussian gauss2(m_radius2, sigma2);
97 
98  // building distribution of nano particles
99  ParameterPattern pattern1;
100  pattern1.add("Particle").add("Cylinder").add("Radius");
101  ParameterDistribution par_distr1(pattern1.toStdString(), gauss1, nbins, n_sigma);
102  ParticleDistribution particle_collection1(cylinder1, par_distr1);
103  particle_layout.addParticle(particle_collection1, 0.95);
104  ParameterPattern pattern2;
105  pattern2.add("Particle").add("Cylinder").add("Radius");
106  ParameterDistribution par_distr2(pattern2.toStdString(), gauss2, static_cast<size_t>(nbins),
107  n_sigma);
108  ParticleDistribution particle_collection2(cylinder2, par_distr2);
109  particle_layout.addParticle(particle_collection2, 0.05);
110 
111  vacuum_layer.addLayout(particle_layout);
112 
113  MultiLayer* multi_layer = new MultiLayer();
114  multi_layer->addLayer(vacuum_layer);
115  return multi_layer;
116 }
117 
118 // ----------------------------------------------------------------------------
119 
121  : m_length(10 * Units::nm)
122  , m_height(5 * Units::nm)
123  , m_alpha(Units::deg2rad(54.73))
124  , m_zangle(45. * Units::deg)
125 {
126 }
127 
129 {
130  // particle
132  Particle pyramid(refMat::Particle, ff_pyramid);
133  pyramid.setRotation(RotationZ(m_zangle));
134 
135  // particle collection
136  DistributionGate gate(35.0 * Units::deg, 55.0 * Units::deg);
137  ParameterDistribution parameter_distr("/Particle/ZRotation/Angle", gate, 10, 2.0);
138 
139  ParticleDistribution collection(pyramid, parameter_distr);
140 
141  ParticleLayout particle_layout;
142  particle_layout.addParticle(collection);
143 
144  // Multi layer
145  Layer vacuum_layer(refMat::Vacuum);
146  Layer substrate_layer(refMat::Substrate);
147 
148  vacuum_layer.addLayout(particle_layout);
149 
150  MultiLayer* multi_layer = new MultiLayer();
151  multi_layer->addLayer(vacuum_layer);
152  multi_layer->addLayer(substrate_layer);
153  return multi_layer;
154 }
155 
156 // ----------------------------------------------------------------------------
157 
159 {
160  // particle
162  Particle sphere(refMat::Particle, ff);
163 
164  // particle collection
166  ParameterDistribution parameter_distr("/Particle/FullSphere/Radius", gauss, 10, 20.0,
167  RealLimits::limited(2.0, 4.0));
168 
169  ParticleDistribution collection(sphere, parameter_distr);
170 
171  ParticleLayout particle_layout;
172  particle_layout.addParticle(collection);
173 
174  // Multi layer
175  Layer vacuum_layer(refMat::Vacuum);
176  Layer substrate_layer(refMat::Substrate);
177 
178  vacuum_layer.addLayout(particle_layout);
179 
180  MultiLayer* multi_layer = new MultiLayer();
181  multi_layer->addLayer(vacuum_layer);
182  multi_layer->addLayer(substrate_layer);
183 
184  return multi_layer;
185 }
186 
187 // ----------------------------------------------------------------------------
188 
190 {
191  // particle
192  FormFactorCone ff(10.0 * Units::nm, 13.0 * Units::nm, 60.0 * Units::deg);
193  Particle cone(refMat::Particle, ff);
194 
195  // particle collection
197  ParameterDistribution parameter_distr(
198  "/Particle/Cone/Alpha", gauss, 5, 20.0,
199  RealLimits::limited(55.0 * Units::deg, 65.0 * Units::deg));
200 
201  ParticleDistribution collection(cone, parameter_distr);
202 
203  ParticleLayout particle_layout;
204  particle_layout.addParticle(collection);
205 
206  // Multi layer
207  Layer vacuum_layer(refMat::Vacuum);
208  Layer substrate_layer(refMat::Substrate);
209 
210  vacuum_layer.addLayout(particle_layout);
211 
212  MultiLayer* multi_layer = new MultiLayer();
213  multi_layer->addLayer(vacuum_layer);
214  multi_layer->addLayer(substrate_layer);
215  return multi_layer;
216 }
217 
219 {
220  // particle
221  FormFactorBox ff(40.0 * Units::nm, 30.0 * Units::nm, 10.0 * Units::nm);
222  Particle box(refMat::Particle, ff);
223 
224  // particle collection
225  DistributionGate gate(10.0 * Units::nm, 70.0 * Units::nm);
226  ParameterDistribution parameter_distr("/Particle/Box/Length", gate, 3, 0.0,
227  RealLimits::limited(1.0 * Units::nm, 200.0 * Units::nm));
228  parameter_distr.linkParameter("/Particle/Box/Width").linkParameter("/Particle/Box/Height");
229 
230  ParticleDistribution collection(box, parameter_distr);
231 
232  ParticleLayout particle_layout;
233  particle_layout.addParticle(collection);
234  particle_layout.setTotalParticleSurfaceDensity(1e-4);
235 
236  // Multi layer
237  Layer vacuum_layer(refMat::Vacuum);
238  Layer substrate_layer(refMat::Substrate);
239 
240  vacuum_layer.addLayout(particle_layout);
241 
242  MultiLayer* multi_layer = new MultiLayer();
243  multi_layer->addLayer(vacuum_layer);
244  multi_layer->addLayer(substrate_layer);
245  return multi_layer;
246 }
Defines classes representing one-dimensional distributions.
Defines class FormFactorBox.
Defines class FormFactorCone.
Defines class FormFactorCylinder.
Defines class FormFactorFullSphere.
Defines class FormFactorPyramid.
Defines class Layer.
Defines class MultiLayer.
Defines class ParameterPattern.
Defines class ParticleDistribution.
Defines classes of with different types of particle distributions.
Defines class ParticleLayout.
Defines class Particle.
Defines materials in namespace refMat.
Defines some unit conversion factors and other constants in namespace Units.
Uniform distribution function with half width hwhm.
Definition: Distributions.h:88
Gaussian distribution with standard deviation std_dev.
A rectangular prism (parallelepiped).
Definition: FormFactorBox.h:23
A conical frustum (cone truncated parallel to the base) with circular base.
A circular cylinder.
A frustum with a quadratic base.
void setRotation(const IRotation &rotation)
Sets transformation.
Definition: IParticle.cpp:44
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 parametric distribution function, for use with any model parameter.
ParameterDistribution & linkParameter(std::string par_name)
Helper class for constructing parameter patterns.
std::string toStdString() const
ParameterPattern & add(std::string object_type)
A particle type that is a parametric distribution of IParticle's.
Decorator class that adds particles to ISampleNode objects.
void setTotalParticleSurfaceDensity(double particle_density)
Sets total particle surface density.
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
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:125
A rotation about the z axis.
Definition: Rotations.h:113
Constants and functions for physical unit conversions.
Definition: Units.h:30
double deg2rad(double angle)
Definition: Units.h:59
static constexpr double deg
Definition: Units.h:46
static constexpr double nm
Definition: Units.h:39
static constexpr double gauss
Definition: Units.h:50
static const Material Vacuum
static const Material Particle
static const Material Substrate