BornAgain
1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
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
15
#include "
Sample/StandardSamples/ParticleDistributionsBuilder.h
"
16
#include "
Param/Distrib/Distributions.h
"
17
#include "
Sample/Aggregate/ParticleLayout.h
"
18
#include "
Sample/HardParticle/Box.h
"
19
#include "
Sample/HardParticle/Cone.h
"
20
#include "
Sample/HardParticle/Cylinder.h
"
21
#include "
Sample/HardParticle/Sphere.h
"
22
#include "
Sample/HardParticle/Pyramid4.h
"
23
#include "
Sample/Multilayer/Layer.h
"
24
#include "
Sample/Multilayer/MultiLayer.h
"
25
#include "
Sample/Particle/Particle.h
"
26
#include "
Sample/StandardSamples/ReferenceMaterials.h
"
27
28
MultiLayer
*
ExemplarySamples::createCylindersWithSizeDistribution
()
29
{
30
throw
std::runtime_error(
31
"This sample used ParticleDistribution which is not supported any more."
);
32
33
// #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
34
// since it may be useful once the new particle distribution approach is implemented.
35
/*
36
const double height(5);
37
const double radius(5);
38
39
Layer vacuum_layer(refMat::Vacuum);
40
41
ParticleLayout particle_layout;
42
// preparing prototype of nano particle
43
double sigma = 0.2 * radius;
44
Cylinder p_ff_cylinder(radius, height);
45
Particle nano_particle(refMat::Particle, p_ff_cylinder);
46
// radius of nanoparticles will be sampled with gaussian probability
47
int n_samples(100);
48
// to get radius_min = average - 2.0*FWHM:
49
double n_sigma = 2.0 * 2.0 * std::sqrt(2.0 * std::log(2.0));
50
DistributionGaussian gauss(radius, sigma);
51
ParameterPattern pattern;
52
pattern.add("Particle").add("Cylinder").add("Radius");
53
ParameterDistribution par_distr(pattern.toStdString(), gauss, static_cast<size_t>(n_samples),
54
n_sigma);
55
ParticleDistribution particle_collection(nano_particle, par_distr);
56
particle_layout.addParticle(particle_collection);
57
58
vacuum_layer.addLayout(particle_layout);
59
60
auto* sample = new MultiLayer();
61
sample->addLayer(vacuum_layer);
62
return sample;
63
*/
64
}
65
66
// ----------------------------------------------------------------------------
67
//
68
// ----------------------------------------------------------------------------
69
70
MultiLayer
*
ExemplarySamples::createTwoTypesCylindersDistribution
()
71
{
72
throw
std::runtime_error(
73
"This sample used ParticleDistribution which is not supported any more."
);
74
75
// #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
76
// since it may be useful once the new particle distribution approach is implemented.
77
/*
78
79
double m_radius1(5);
80
double m_radius2(10);
81
double m_height1(5);
82
double m_height2(10);
83
double m_sigma1_ratio(0.2);
84
double m_sigma2_ratio(0.02);
85
86
Layer vacuum_layer(refMat::Vacuum);
87
88
ParticleLayout particle_layout;
89
90
// preparing nano particles prototypes for seeding layer's particle_layout
91
Cylinder p_ff_cylinder1(m_radius1, m_height1);
92
Particle cylinder1(refMat::Particle, p_ff_cylinder1);
93
94
Cylinder p_ff_cylinder2(m_radius2, m_height2);
95
Particle cylinder2(refMat::Particle, p_ff_cylinder2);
96
97
// radius of nanoparticles will be sampled with gaussian probability
98
int nbins = 150;
99
double sigma1 = m_radius1 * m_sigma1_ratio;
100
double sigma2 = m_radius2 * m_sigma2_ratio;
101
// to have xmin=average-3*sigma
102
double n_sigma = 3.0;
103
DistributionGaussian gauss1(m_radius1, sigma1);
104
DistributionGaussian gauss2(m_radius2, sigma2);
105
106
// building distribution of nano particles
107
ParameterPattern pattern1;
108
pattern1.add("Particle").add("Cylinder").add("Radius");
109
ParameterDistribution par_distr1(pattern1.toStdString(), gauss1, nbins, n_sigma);
110
ParticleDistribution particle_collection1(cylinder1, par_distr1);
111
particle_layout.addParticle(particle_collection1, 0.95);
112
ParameterPattern pattern2;
113
pattern2.add("Particle").add("Cylinder").add("Radius");
114
ParameterDistribution par_distr2(pattern2.toStdString(), gauss2, static_cast<size_t>(nbins),
115
n_sigma);
116
ParticleDistribution particle_collection2(cylinder2, par_distr2);
117
particle_layout.addParticle(particle_collection2, 0.05);
118
119
vacuum_layer.addLayout(particle_layout);
120
121
auto* sample = new MultiLayer();
122
sample->addLayer(vacuum_layer);
123
return sample;
124
*/
125
}
126
127
// ----------------------------------------------------------------------------
128
129
MultiLayer
*
ExemplarySamples::createRotatedPyramidsDistribution
()
130
{
131
throw
std::runtime_error(
132
"This sample used ParticleDistribution which is not supported any more."
);
133
134
// #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
135
// since it may be useful once the new particle distribution approach is implemented.
136
/*
137
double m_length(10);
138
double m_height(5);
139
double m_alpha(Units::deg2rad(54.73));
140
double m_zangle(45. * deg);
141
142
// particle
143
Pyramid4 ff_pyramid(m_length, m_height, m_alpha);
144
Particle pyramid(refMat::Particle, ff_pyramid);
145
pyramid.setRotation(RotationZ(m_zangle));
146
147
// particle collection
148
DistributionGate gate(35.0 * deg, 55.0 * deg);
149
ParameterDistribution parameter_distr("/Particle/ZRotation/Angle", gate, 10, 2.0);
150
151
ParticleDistribution collection(pyramid, parameter_distr);
152
153
ParticleLayout particle_layout;
154
particle_layout.addParticle(collection);
155
156
// Multi layer
157
Layer vacuum_layer(refMat::Vacuum);
158
Layer substrate_layer(refMat::Substrate);
159
160
vacuum_layer.addLayout(particle_layout);
161
162
auto* sample = new MultiLayer();
163
sample->addLayer(vacuum_layer);
164
sample->addLayer(substrate_layer);
165
return sample;
166
*/
167
}
168
169
// ----------------------------------------------------------------------------
170
171
MultiLayer
*
ExemplarySamples::createSpheresWithLimitsDistribution
()
172
{
173
throw
std::runtime_error(
174
"This sample used ParticleDistribution which is not supported any more."
);
175
176
// #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
177
// since it may be useful once the new particle distribution approach is implemented.
178
/*
179
// particle
180
Sphere ff(3.0);
181
Particle sphere(refMat::Particle, ff);
182
183
// particle collection
184
DistributionGaussian gauss(3.0, 1.0);
185
ParameterDistribution parameter_distr("/Particle/Sphere/Radius", gauss, 10, 20.0,
186
RealLimits::limited(2.0, 4.0));
187
188
ParticleDistribution collection(sphere, parameter_distr);
189
190
ParticleLayout particle_layout;
191
particle_layout.addParticle(collection);
192
193
// Multi layer
194
Layer vacuum_layer(refMat::Vacuum);
195
Layer substrate_layer(refMat::Substrate);
196
197
vacuum_layer.addLayout(particle_layout);
198
199
auto* sample = new MultiLayer();
200
sample->addLayer(vacuum_layer);
201
sample->addLayer(substrate_layer);
202
203
return sample;
204
*/
205
}
206
207
// ----------------------------------------------------------------------------
208
209
MultiLayer
*
ExemplarySamples::createConesWithLimitsDistribution
()
210
{
211
throw
std::runtime_error(
212
"This sample used ParticleDistribution which is not supported any more."
);
213
214
// #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
215
// since it may be useful once the new particle distribution approach is implemented.
216
/*
217
// particle
218
Cone ff(10.0, 13.0, 60.0 * deg);
219
Particle cone(refMat::Particle, ff);
220
221
// particle collection
222
DistributionGaussian gauss(60.0 * deg, 6.0 * deg);
223
ParameterDistribution parameter_distr(
224
"/Particle/Cone/Alpha", gauss, 5, 20.0,
225
RealLimits::limited(55.0 * deg, 65.0 * deg));
226
227
ParticleDistribution collection(cone, parameter_distr);
228
229
ParticleLayout particle_layout;
230
particle_layout.addParticle(collection);
231
232
// Multi layer
233
Layer vacuum_layer(refMat::Vacuum);
234
Layer substrate_layer(refMat::Substrate);
235
236
vacuum_layer.addLayout(particle_layout);
237
238
auto* sample = new MultiLayer();
239
sample->addLayer(vacuum_layer);
240
sample->addLayer(substrate_layer);
241
return sample;
242
*/
243
}
244
245
MultiLayer
*
ExemplarySamples::createLinkedBoxDistribution
()
246
{
247
throw
std::runtime_error(
248
"This sample used ParticleDistribution which is not supported any more."
);
249
250
// #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
251
// since it may be useful once the new particle distribution approach is implemented.
252
/*
253
// particle
254
Box ff(40.0, 30.0, 10.0);
255
Particle box(refMat::Particle, ff);
256
257
// particle collection
258
DistributionGate gate(10.0, 70.0);
259
ParameterDistribution parameter_distr("/Particle/Box/Length", gate, 3, 0.0,
260
RealLimits::limited(1.0, 200.0));
261
parameter_distr.linkParameter("/Particle/Box/Width").linkParameter("/Particle/Box/Height");
262
263
ParticleDistribution collection(box, parameter_distr);
264
265
ParticleLayout particle_layout;
266
particle_layout.addParticle(collection);
267
particle_layout.setTotalParticleSurfaceDensity(1e-4);
268
269
// Multi layer
270
Layer vacuum_layer(refMat::Vacuum);
271
Layer substrate_layer(refMat::Substrate);
272
273
vacuum_layer.addLayout(particle_layout);
274
275
auto* sample = new MultiLayer();
276
sample->addLayer(vacuum_layer);
277
sample->addLayer(substrate_layer);
278
return sample;
279
*/
280
}
Box.h
Defines class Box.
Cone.h
Defines class Cone.
Cylinder.h
Defines class Cylinder.
Distributions.h
Defines classes representing one-dimensional distributions.
Layer.h
Defines class Layer.
MultiLayer.h
Defines class MultiLayer.
ParticleDistributionsBuilder.h
Defines classes of with different types of particle distributions.
ParticleLayout.h
Defines class ParticleLayout.
Particle.h
Defines class Particle.
Pyramid4.h
Defines class Pyramid4.
ReferenceMaterials.h
Defines materials in namespace refMat.
Sphere.h
Defines class Sphere.
MultiLayer
Our sample model: a stack of layers one below the other.
Definition:
MultiLayer.h:43
ExemplarySamples::createRotatedPyramidsDistribution
MultiLayer * createRotatedPyramidsDistribution()
Definition:
ParticleDistributionsBuilder.cpp:129
ExemplarySamples::createCylindersWithSizeDistribution
MultiLayer * createCylindersWithSizeDistribution()
Definition:
ParticleDistributionsBuilder.cpp:28
ExemplarySamples::createTwoTypesCylindersDistribution
MultiLayer * createTwoTypesCylindersDistribution()
Definition:
ParticleDistributionsBuilder.cpp:70
ExemplarySamples::createSpheresWithLimitsDistribution
MultiLayer * createSpheresWithLimitsDistribution()
Definition:
ParticleDistributionsBuilder.cpp:171
ExemplarySamples::createLinkedBoxDistribution
MultiLayer * createLinkedBoxDistribution()
Definition:
ParticleDistributionsBuilder.cpp:245
ExemplarySamples::createConesWithLimitsDistribution
MultiLayer * createConesWithLimitsDistribution()
Definition:
ParticleDistributionsBuilder.cpp:209
Sample
StandardSamples
ParticleDistributionsBuilder.cpp
Generated by
1.9.1