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 
27 
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 
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 
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 
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 
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 
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 }
Defines class Box.
Defines class Cone.
Defines class Cylinder.
Defines classes representing one-dimensional distributions.
Defines class Layer.
Defines class MultiLayer.
Defines classes of with different types of particle distributions.
Defines class ParticleLayout.
Defines class Particle.
Defines class Pyramid4.
Defines materials in namespace refMat.
Defines class Sphere.
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:43
MultiLayer * createRotatedPyramidsDistribution()
MultiLayer * createCylindersWithSizeDistribution()
MultiLayer * createTwoTypesCylindersDistribution()
MultiLayer * createSpheresWithLimitsDistribution()
MultiLayer * createLinkedBoxDistribution()
MultiLayer * createConesWithLimitsDistribution()