BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
SizeDistributionModelsBuilder.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/StandardSamples/SizeDistributionModelsBuilder.cpp
6 //! @brief Implements class ParticlesInSSCABuilder.
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"
27 
29 {
30  // cylindrical particle 1
31  double radius1(5 * Units::nm);
32  double height1 = radius1;
33  FormFactorCylinder cylinder_ff1(radius1, height1);
34  Particle cylinder1(refMat::Particle, cylinder_ff1);
35 
36  // cylindrical particle 2
37  double radius2(8 * Units::nm);
38  double height2(radius2);
39  FormFactorCylinder cylinder_ff2(radius2, height2);
40  Particle cylinder2(refMat::Particle, cylinder_ff2);
41 
42  // interference function
43  InterferenceFunctionRadialParaCrystal interference(18.0 * Units::nm, 1e3 * Units::nm);
45  interference.setProbabilityDistribution(pdf);
46 
47  // assembling the sample
48  ParticleLayout particle_layout;
49  particle_layout.addParticle(cylinder1, 0.8);
50  particle_layout.addParticle(cylinder2, 0.2);
51  particle_layout.setInterferenceFunction(interference);
52 
53  Layer vacuum_layer(refMat::Vacuum);
54  vacuum_layer.addLayout(particle_layout);
55  Layer substrate_layer(refMat::Substrate);
56 
57  MultiLayer* multi_layer = new MultiLayer();
58  multi_layer->addLayer(vacuum_layer);
59  multi_layer->addLayer(substrate_layer);
60  return multi_layer;
61 }
62 
63 // ----------------------------------------------------------------------------
64 
66 {
67  // cylindrical particle 1
68  double radius1(5 * Units::nm);
69  double height1 = radius1;
70  FormFactorCylinder cylinder_ff1(radius1, height1);
71  Particle cylinder1(refMat::Particle, cylinder_ff1);
72 
73  // cylindrical particle 2
74  double radius2(8 * Units::nm);
75  double height2(radius2);
76  FormFactorCylinder cylinder_ff2(radius2, height2);
77  Particle cylinder2(refMat::Particle, cylinder_ff2);
78 
79  // interference function1
80  InterferenceFunctionRadialParaCrystal interference1(16.8 * Units::nm, 1e3 * Units::nm);
82  interference1.setProbabilityDistribution(pdf);
83 
84  // interference function2
85  InterferenceFunctionRadialParaCrystal interference2(22.8 * Units::nm, 1e3 * Units::nm);
86  interference2.setProbabilityDistribution(pdf);
87 
88  // assembling the sample
89  ParticleLayout particle_layout1;
90  particle_layout1.addParticle(cylinder1, 0.8);
91  particle_layout1.setInterferenceFunction(interference1);
92 
93  ParticleLayout particle_layout2;
94  particle_layout2.addParticle(cylinder2, 0.2);
95  particle_layout2.setInterferenceFunction(interference2);
96 
97  Layer vacuum_layer(refMat::Vacuum);
98  vacuum_layer.addLayout(particle_layout1);
99  vacuum_layer.addLayout(particle_layout2);
100  Layer substrate_layer(refMat::Substrate);
101 
102  MultiLayer* multi_layer = new MultiLayer();
103  multi_layer->addLayer(vacuum_layer);
104  multi_layer->addLayer(substrate_layer);
105  return multi_layer;
106 }
107 
108 // ----------------------------------------------------------------------------
109 
111 {
112  // cylindrical particle 1
113  double radius1(5 * Units::nm);
114  double height1 = radius1;
115  FormFactorCylinder cylinder_ff1(radius1, height1);
116  Particle cylinder1(refMat::Particle, cylinder_ff1);
117 
118  // cylindrical particle 2
119  double radius2(8 * Units::nm);
120  double height2(radius2);
121  FormFactorCylinder cylinder_ff2(radius2, height2);
122  Particle cylinder2(refMat::Particle, cylinder_ff2);
123 
124  // interference function
125  InterferenceFunctionRadialParaCrystal interference(18.0 * Units::nm, 1e3 * Units::nm);
127  interference.setProbabilityDistribution(pdf);
128  interference.setKappa(1.0);
129 
130  // assembling the sample
131  ParticleLayout particle_layout;
132  particle_layout.addParticle(cylinder1, 0.8);
133  particle_layout.addParticle(cylinder2, 0.2);
134  particle_layout.setInterferenceFunction(interference);
135 
136  Layer vacuum_layer(refMat::Vacuum);
137  vacuum_layer.addLayout(particle_layout);
138  Layer substrate_layer(refMat::Substrate);
139 
140  MultiLayer* multi_layer = new MultiLayer();
141  multi_layer->addLayer(vacuum_layer);
142  multi_layer->addLayer(substrate_layer);
143  return multi_layer;
144 }
145 
146 // ----------------------------------------------------------------------------
147 
149 {
150  Layer vacuum_layer(refMat::Vacuum);
151 
152  InterferenceFunctionRadialParaCrystal interference_function(15.0 * Units::nm, 1e3 * Units::nm);
154  interference_function.setProbabilityDistribution(pdf);
155  interference_function.setKappa(4.02698);
156  ParticleLayout particle_layout;
157 
158  FormFactorCylinder ff_cylinder(5.0 * Units::nm, 5.0 * Units::nm);
159  Particle particle_prototype(refMat::Particle, ff_cylinder);
160 
162  ParameterPattern pattern_radius;
163  pattern_radius.add("Particle").add("Cylinder").add("Radius");
164  ParameterDistribution par_distr(pattern_radius.toStdString(), gauss, 30, 3.0);
165  ParameterPattern pattern_height;
166  pattern_height.add("Particle").add("Cylinder").add("Height");
167  par_distr.linkParameter(pattern_height.toStdString());
168  ParticleDistribution particle_collection(particle_prototype, par_distr);
169  particle_layout.addParticle(particle_collection);
170 
171  particle_layout.setInterferenceFunction(interference_function);
172 
173  vacuum_layer.addLayout(particle_layout);
174 
175  MultiLayer* multi_layer = new MultiLayer();
176  multi_layer->addLayer(vacuum_layer);
177  return multi_layer;
178 }
Defines classes representing one-dimensional distributions.
Defines class FormFactorCylinder.
Defines class InterferenceFunctionRadialParaCrystal.
Defines class Layer.
Defines class MultiLayer.
Defines class ParameterPattern.
Defines class ParticleDistribution.
Defines class ParticleLayout.
Defines class Particle.
Defines materials in namespace refMat.
Defines various sample builder classes to test DA, LMA, SSCA approximations.
Defines some unit conversion factors and other constants in namespace Units.
Gaussian distribution with standard deviation std_dev.
Gaussian IFTDistribution1D; its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1...
A circular cylinder.
Interference function of radial paracrystal.
void setKappa(double kappa)
Sets size spacing coupling parameter of the Size Spacing Correlation Approximation.
void setProbabilityDistribution(const IFTDistribution1D &pdf)
Sets one-dimensional probability distribution.
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 setInterferenceFunction(const IInterferenceFunction &interference_function)
Adds interference functions.
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 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