BornAgain  1.18.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 scattering at grazing incidence
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::nanometer);
34  const double radius(5 * Units::nanometer);
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));
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::nanometer), m_radius2(10 * Units::nanometer),
68  m_height1(5 * Units::nanometer), m_height2(10 * Units::nanometer), m_sigma1_ratio(0.2),
69  m_sigma2_ratio(0.02)
70 {
71 }
72 
74 {
75  Layer vacuum_layer(refMat::Vacuum);
76 
77  ParticleLayout particle_layout;
78 
79  // preparing nano particles prototypes for seeding layer's particle_layout
80  FormFactorCylinder p_ff_cylinder1(m_radius1, m_height1);
81  Particle cylinder1(refMat::Particle, p_ff_cylinder1);
82 
83  FormFactorCylinder p_ff_cylinder2(m_radius2, m_height2);
84  Particle cylinder2(refMat::Particle, p_ff_cylinder2);
85 
86  // radius of nanoparticles will be sampled with gaussian probability
87  int nbins = 150;
88  double sigma1 = m_radius1 * m_sigma1_ratio;
89  double sigma2 = m_radius2 * m_sigma2_ratio;
90  // to have xmin=average-3*sigma
91  double n_sigma = 3.0;
92  DistributionGaussian gauss1(m_radius1, sigma1);
93  DistributionGaussian gauss2(m_radius2, sigma2);
94 
95  // building distribution of nano particles
96  ParameterPattern pattern1;
97  pattern1.add("Particle").add("Cylinder").add("Radius");
98  ParameterDistribution par_distr1(pattern1.toStdString(), gauss1, nbins, n_sigma);
99  ParticleDistribution particle_collection1(cylinder1, par_distr1);
100  particle_layout.addParticle(particle_collection1, 0.95);
101  ParameterPattern pattern2;
102  pattern2.add("Particle").add("Cylinder").add("Radius");
103  ParameterDistribution par_distr2(pattern2.toStdString(), gauss2, static_cast<size_t>(nbins),
104  n_sigma);
105  ParticleDistribution particle_collection2(cylinder2, par_distr2);
106  particle_layout.addParticle(particle_collection2, 0.05);
107 
108  vacuum_layer.addLayout(particle_layout);
109 
110  MultiLayer* multi_layer = new MultiLayer();
111  multi_layer->addLayer(vacuum_layer);
112  return multi_layer;
113 }
114 
115 // ----------------------------------------------------------------------------
116 
118  : m_length(10 * Units::nanometer), m_height(5 * Units::nanometer),
119  m_alpha(Units::deg2rad(54.73)), m_zangle(45. * Units::degree)
120 {
121 }
122 
124 {
125  // particle
127  Particle pyramid(refMat::Particle, ff_pyramid);
128  pyramid.setRotation(RotationZ(m_zangle));
129 
130  // particle collection
131  DistributionGate gate(35.0 * Units::deg, 55.0 * Units::deg);
132  ParameterDistribution parameter_distr("/Particle/ZRotation/Angle", gate, 10, 2.0);
133 
134  ParticleDistribution collection(pyramid, parameter_distr);
135 
136  ParticleLayout particle_layout;
137  particle_layout.addParticle(collection);
138 
139  // Multi layer
140  Layer vacuum_layer(refMat::Vacuum);
141  Layer substrate_layer(refMat::Substrate);
142 
143  vacuum_layer.addLayout(particle_layout);
144 
145  MultiLayer* multi_layer = new MultiLayer();
146  multi_layer->addLayer(vacuum_layer);
147  multi_layer->addLayer(substrate_layer);
148  return multi_layer;
149 }
150 
151 // ----------------------------------------------------------------------------
152 
154 {
155  // particle
157  Particle sphere(refMat::Particle, ff);
158 
159  // particle collection
161  ParameterDistribution parameter_distr("/Particle/FullSphere/Radius", gauss, 10, 20.0,
162  RealLimits::limited(2.0, 4.0));
163 
164  ParticleDistribution collection(sphere, parameter_distr);
165 
166  ParticleLayout particle_layout;
167  particle_layout.addParticle(collection);
168 
169  // Multi layer
170  Layer vacuum_layer(refMat::Vacuum);
171  Layer substrate_layer(refMat::Substrate);
172 
173  vacuum_layer.addLayout(particle_layout);
174 
175  MultiLayer* multi_layer = new MultiLayer();
176  multi_layer->addLayer(vacuum_layer);
177  multi_layer->addLayer(substrate_layer);
178 
179  return multi_layer;
180 }
181 
182 // ----------------------------------------------------------------------------
183 
185 {
186  // particle
187  FormFactorCone ff(10.0 * Units::nm, 13.0 * Units::nm, 60.0 * Units::deg);
188  Particle cone(refMat::Particle, ff);
189 
190  // particle collection
192  ParameterDistribution parameter_distr(
193  "/Particle/Cone/Alpha", gauss, 5, 20.0,
194  RealLimits::limited(55.0 * Units::deg, 65.0 * Units::deg));
195 
196  ParticleDistribution collection(cone, parameter_distr);
197 
198  ParticleLayout particle_layout;
199  particle_layout.addParticle(collection);
200 
201  // Multi layer
202  Layer vacuum_layer(refMat::Vacuum);
203  Layer substrate_layer(refMat::Substrate);
204 
205  vacuum_layer.addLayout(particle_layout);
206 
207  MultiLayer* multi_layer = new MultiLayer();
208  multi_layer->addLayer(vacuum_layer);
209  multi_layer->addLayer(substrate_layer);
210  return multi_layer;
211 }
212 
214 {
215  // particle
216  FormFactorBox ff(40.0 * Units::nm, 30.0 * Units::nm, 10.0 * Units::nm);
217  Particle box(refMat::Particle, ff);
218 
219  // particle collection
220  DistributionGate gate(10.0 * Units::nm, 70.0 * Units::nm);
221  ParameterDistribution parameter_distr("/Particle/Box/Length", gate, 3, 0.0,
222  RealLimits::limited(1.0 * Units::nm, 200.0 * Units::nm));
223  parameter_distr.linkParameter("/Particle/Box/Width").linkParameter("/Particle/Box/Height");
224 
225  ParticleDistribution collection(box, parameter_distr);
226 
227  ParticleLayout particle_layout;
228  particle_layout.addParticle(collection);
229  particle_layout.setTotalParticleSurfaceDensity(1e-4);
230 
231  // Multi layer
232  Layer vacuum_layer(refMat::Vacuum);
233  Layer substrate_layer(refMat::Substrate);
234 
235  vacuum_layer.addLayout(particle_layout);
236 
237  MultiLayer* multi_layer = new MultiLayer();
238  multi_layer->addLayer(vacuum_layer);
239  multi_layer->addLayer(substrate_layer);
240  return multi_layer;
241 }
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:86
Gaussian distribution with standard deviation std_dev.
A rectangular prism (parallelepiped).
Definition: FormFactorBox.h:24
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, with thickness (in nanometer) and material.
Definition: Layer.h:28
void addLayout(const ILayout &decoration)
Definition: Layer.cpp:57
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:42
void addLayer(const Layer &layer)
Adds object to multilayer.
Definition: MultiLayer.cpp:54
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 ISample objects.
void setTotalParticleSurfaceDensity(double particle_density) final override
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:26
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:123
A rotation about the z axis.
Definition: Rotations.h:114
Constants and functions for physical unit conversions.
Definition: Units.h:21
double deg2rad(double angle)
Definition: Units.h:47
static constexpr double deg
Definition: Units.h:56
static constexpr double nm
Definition: Units.h:31
static constexpr double gauss
Definition: Units.h:60
static constexpr double degree
Definition: Units.h:40
static constexpr double nanometer
Definition: Units.h:24
const double radius(5 *Units::nanometer)
static const Material Vacuum
static const Material Particle
static const Material Substrate