BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
ExemplarySamples Namespace Reference

Description

Two boxes in particle composition rotated in X by 90 degrees.

Builds sample: 2D finite lattice of 2D finite lattices (superlattice).

Builds sample: 2D finite lattice with thermal disorder.

Builds sample: 2D lattice with different disorder (IsGISAXS example #6).

Builds sample: 2D lattice with arbitrary angle and different lattice length_1 and length_2.

Rotated box in 3 layers system.

Provides exactly the same sample as SLDSlicedCylindersBuilder, but with cylinders represented as homogeneous layers. SLD-based materials used. Assumed wavelength is 1.54 Angstrom.

Provides exactly the same sample as SlicedCylindersBuilder, but with sld-based materials. Assumed wavelength is 1.54 Angstrom.

Builds sample: cylinders on a silicon substrate.

Builds sample: spherical composition made of top+bottom spherical cups.

Builds sample: size spacing correlation approximation (IsGISAXS example #15).

Creates the sample demonstrating size distribution model in size space coupling approximation. Equivalent of Examples/Python/simulation/ex03_Interferences/ApproximationSSCA.py.

Creates the sample demonstrating size distribution model in local monodisperse approximation. Equivalent of Examples/Python/simulation/ex03_Interferences/ApproximationLMA.py.

Creates the sample demonstrating size distribution model in decoupling approximation. Equivalent of Examples/Python/simulation/ex03_Interferences/ApproximationDA.py.

Builds sample: Pyramids, rotated pyramids on top of substrate (IsGISAXS example #9)

Builds sample: triangular ripple within the 1D-paracrystal model (from PRB 85, 235415, 2012).

Builds sample: cosine ripple within the 1D-paracrystal model.

Builds sample: sample with Ti/Pt layers sequence.

Builds a sample with 10 interchanging homogeneous layers of Ti and Ni on silicone substrate. Ti is 70 angstroms thick, Ni is 30 angstroms thick.

Builds sample: cylinders with hard disk Percus-Yevick interference.

The ParticleInVacuumBuilder class generates a sample with single vacuum layer populated with particles of certain types.

Distribution of boxes with main parameter and two linked parameters.

Cones with the distribution applied to the angle and RealLimits defined.

Spherical particles with the distribution applied to the radius and RealLimits defined.

Rotated Pyramids with the distribution applied to the rotation angle.

Builds mixture of cylinder particles with different size distribution (IsGISAXS example #2)

Cylinders in BA with size distributions (IsGISAXS example #3, part II).

Builds sample: two layers of spheres at hex lattice.

Builds sample: 2D paracrystal lattice (IsGISAXS example #8).

Builds sample: cylinders with 2DDL structure factor (IsGISAXS example #4).

Builds sample: basic two-dimensional paracrystal with various probability distribution functions (PDF's). They are initialized via component service.

Builds sample: cylinders with 1DDL structure factor (IsGISAXS example #4).

Builds sample: mixture of cylinders and prisms without interference, using multiple particle layouts.

Builds sample: layers with correlated roughness.

Builds sample: cylindrical mesocrystal composed of spheres in a cubic lattice.

Builds sample: spheres with magnetization inside substrate.

Builds sample: cylinders with magnetic material and non-zero magnetic field.

Builds sample: cylinders with magnetic material and zero magnetic field.

Builds sample: rotated magnetic spheres in substrate layer with a unit magnetic field.

Builds sample: magnetic layer on a magnetic substrate with the fields rotated by 90°

Builds sample: magnetic spheres in a magnetized layer on a non-magnetized substrate.

Builds sample: ambient and one magnetized layer on a non-magnetized substrate.

Builds sample: spheres in substrate layer with a zero magnetic field.

The LayersWithAbsorptionBySLDBuilder class generates a sample with 3 layers with absorption (refractive index has imaginary part). //! The middle layer is populated with particles. MaterialBySLD is used to generate maaterials.

The LayersWithAbsorptionBuilder class generates a sample with 3 layers with absorption (refractive index has imaginary part).

Builds sample: cylinders with 1DDL structure factor.

Builds a sample with 10 interchanging homogeneous layers of Ti and Ni on silicone substrate. Ti is 70 angstroms thick, Ni is 30 angstroms thick. No absorption, no roughness, target wavelength is 1.54 angstroms.

Builds sample: mixture of cylinders and prisms without interference (IsGISAXS example #1).

Builds sample: mixture of different particles (IsGISAXS example #7).

Rotation and translation of core shell box particle in 3 layers system.

Builds sample: Core Shell Nanoparticles (IsGISAXS example #11).

Builds sample: square boxes in a square lattice.

Two different boxes are first rotated and then composed, composition is then rotated.

Two boxes in particle composition rotated in Z and Y by 90 degrees.

Two boxes in particle composition rotated in Z by 90 degrees.

Two boxes in particle composition rotated in Y by 90 degrees.

The middle layer is populated with particles.

Functions

MultiLayercreateAsymRipple ()
 
MultiLayercreateAveragedSlicedCylinders ()
 
MultiLayercreateBasic2DLattice ()
 
MultiLayercreateBasic2DParaCrystalWithFTDis (const IProfile2D *pdf2)
 
MultiLayercreateBoxCompositionRotateX ()
 
MultiLayercreateBoxCompositionRotateY ()
 
MultiLayercreateBoxCompositionRotateZ ()
 
MultiLayercreateBoxCompositionRotateZandY ()
 
MultiLayercreateBoxesSquareLattice2D ()
 
MultiLayercreateBoxStackComposition ()
 
MultiLayercreateCenteredSquareLattice2D ()
 
MultiLayercreateConesWithLimitsDistribution ()
 
MultiLayercreateCoreShellBoxRotateZandY ()
 
MultiLayercreateCoreShellParticle ()
 
MultiLayercreateCosineRipple ()
 
MultiLayercreateCustomMorphology ()
 
MultiLayercreateCylindersAndPrisms ()
 
MultiLayercreateCylindersInBA (double height=5, double radius=5)
 Builds sample: cylinder form factor in BA (IsGISAXS example #3, part II). More...
 
MultiLayercreateCylindersInDWBA ()
 Builds sample: cylinder form factor in DWBA (IsGISAXS example #3, part I). More...
 
MultiLayercreateCylindersInSSCA ()
 
MultiLayercreateCylindersWithSizeDistribution ()
 
MultiLayercreateFeNiBilayer ()
 
MultiLayercreateFeNiBilayerNC ()
 
MultiLayercreateFeNiBilayerSpinFlip ()
 
MultiLayercreateFeNiBilayerSpinFlipNC ()
 
MultiLayercreateFeNiBilayerSpinFlipTanh ()
 
MultiLayercreateFeNiBilayerTanh ()
 
MultiLayercreateFiniteSquareLattice2D ()
 
MultiLayercreateHardDisk ()
 
MultiLayercreateHexParaCrystal ()
 
MultiLayercreateHomogeneousMultilayer ()
 
MultiLayercreateLargeCylindersInDWBA (double height=1000, double radius=500)
 Builds sample with large cylinders for MC integration tests. More...
 
MultiLayercreateLattice1D ()
 
MultiLayercreateLayersWithAbsorptionBySLD ()
 
MultiLayercreateLayersWithAbsorptionWithFF (const IFormFactor *)
 
MultiLayercreateLinkedBoxDistribution ()
 
MultiLayercreateMagneticCylinders ()
 
MultiLayercreateMagneticLayer ()
 
MultiLayercreateMagneticParticleZeroField ()
 
MultiLayercreateMagneticRotation ()
 
MultiLayercreateMagneticSpheres ()
 
MultiLayercreateMagneticSubstrateZeroField ()
 
MultiLayercreateMesoCrystal ()
 
MultiLayercreateMultiLayerWithNCRoughness ()
 
MultiLayercreateMultiLayerWithRoughness ()
 
MultiLayercreateMultipleLayout ()
 
MultiLayercreateParticleComposition ()
 
MultiLayercreateParticleInVacuumWithFF (const IFormFactor *)
 
MultiLayercreatePlainMultiLayerBySLD (int n_layers=10, double thick_ti=3.0)
 
MultiLayercreateRadialParaCrystal ()
 
MultiLayercreateRectParaCrystal ()
 
MultiLayercreateResonator (double ti_thickness=13.0)
 
MultiLayercreateRotatedPyramids ()
 
MultiLayercreateRotatedPyramidsDistribution ()
 
MultiLayercreateRotatedSquareLattice2D ()
 
MultiLayercreateSimpleMagneticLayer ()
 
MultiLayercreateSimpleMagneticRotationWithRoughness (const std::string &roughnessKey)
 
MultiLayercreateSizeDistributionDAModel ()
 
MultiLayercreateSizeDistributionLMAModel ()
 
MultiLayercreateSizeDistributionSSCAModel ()
 
MultiLayercreateSLDSlicedCylinders ()
 
MultiLayercreateSlicedComposition ()
 
MultiLayercreateSlicedCylinders ()
 
MultiLayercreateSpheresWithLimitsDistribution ()
 
MultiLayercreateSquareLattice2D ()
 
MultiLayercreateSuperLattice ()
 
MultiLayercreateThickAbsorptiveSample ()
 
MultiLayercreateTransformBox ()
 
MultiLayercreateTriangularRipple (double d=0)
 
MultiLayercreateTwoTypesCylindersDistribution ()
 

Function Documentation

◆ createAsymRipple()

MultiLayer * ExemplarySamples::createAsymRipple ( )

Definition at line 71 of file RipplesBuilder.cpp.

72 {
74 }
MultiLayer * createTriangularRipple(double d=0)

References createTriangularRipple().

Here is the call graph for this function:

◆ createAveragedSlicedCylinders()

MultiLayer * ExemplarySamples::createAveragedSlicedCylinders ( )

Definition at line 95 of file SlicedCylindersBuilder.cpp.

96 {
97  const auto par_surf_density = ParticleLayout().totalParticleSurfaceDensity();
98 
99  complex_t vacuum_sld{0.0, 0.0};
100  Material vacuum_material = MaterialBySLD("Vacuum", vacuum_sld.real(), vacuum_sld.imag());
101  complex_t sub_sld = getSLDFromN(wavelength, 6e-6, 2e-8);
102  Material substrate_material = MaterialBySLD("Substrate", sub_sld.real(), sub_sld.imag());
103 
104  double eff_vol = par_surf_density * M_PI * radius * radius;
105  complex_t par_sld = getSLDFromN(wavelength, 6e-4, 2e-8);
106  complex_t avr_sld = averageSLD(par_sld, vacuum_sld, eff_vol);
107  Material avr_material = MaterialBySLD("Avr", avr_sld.real(), avr_sld.imag());
108 
109  Layer vacuum_layer(vacuum_material);
110  Layer avr_layer(avr_material, height / n_slices);
111  Layer substrate_layer(substrate_material);
112 
113  auto* sample = new MultiLayer();
114  sample->addLayer(vacuum_layer);
115  for (size_t i = 0; i < n_slices; ++i)
116  sample->addLayer(avr_layer);
117  sample->addLayer(substrate_layer);
118  return sample;
119 }
#define M_PI
Definition: Constants.h:44
A layer in a MultiLayer sample.
Definition: Layer.h:26
A wrapper for underlying material implementation.
Definition: Material.h:35
Our sample model: a stack of layers one below the other.
Definition: MultiLayer.h:43
Decorator class that adds particles to ISampleNode objects.
double totalParticleSurfaceDensity() const
Material MaterialBySLD()

References M_PI, MaterialBySLD(), and ParticleLayout::totalParticleSurfaceDensity().

Here is the call graph for this function:

◆ createBasic2DLattice()

MultiLayer * ExemplarySamples::createBasic2DLattice ( )

Definition at line 31 of file TwoDimLatticeBuilder.cpp.

32 {
33  Layer vacuum_layer(refMat::Vacuum);
34  Layer substrate_layer(refMat::Substrate);
35 
36  Interference2DLattice iff(BasicLattice2D(5.0, 10.0, 30.0 * deg, 10.0 * deg));
37 
38  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 0);
39  iff.setDecayFunction(pdf);
40 
41  // particles
42  ParticleLayout particle_layout;
43  Cylinder ff_cyl(5.0, 5.0);
44  Particle particle(refMat::Particle, ff_cyl);
45  particle_layout.addParticle(particle);
46 
47  particle_layout.setInterference(iff);
48 
49  vacuum_layer.addLayout(particle_layout);
50 
51  auto* sample = new MultiLayer();
52  sample->addLayer(vacuum_layer);
53  sample->addLayer(substrate_layer);
54  return sample;
55 }
A two-dimensional Bravais lattice with no special symmetry.
Definition: Lattice2D.h:51
A circular cylinder.
Definition: Cylinder.h:23
Interference function of a 2D lattice.
void addParticle(const IParticle &particle, double abundance=-1.0)
Adds particle to the layout with abundance, position and the rotation defined.
void setInterference(const IInterference &interparticle)
Adds interference functions.
A particle with a form factor and refractive index.
Definition: Particle.h:25
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
Definition: Profiles2D.h:71
static constexpr double deg
Definition: Units.h:46
static const Material Vacuum
static const Material Particle
static const Material Substrate

References Layer::addLayout(), ParticleLayout::addParticle(), Units::deg, M_PI, refMat::Particle, Interference2DLattice::setDecayFunction(), ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createBasic2DParaCrystalWithFTDis()

MultiLayer * ExemplarySamples::createBasic2DParaCrystalWithFTDis ( const IProfile2D pdf2)

Definition at line 61 of file ParaCrystalBuilder.cpp.

62 {
63  const Profile2DCauchy pdf1(0.1, 0.2, 0);
64 
65  Layer vacuum_layer(refMat::Vacuum);
66  Layer substrate_layer(refMat::Substrate);
67 
68  Interference2DParaCrystal iff(BasicLattice2D(10.0, 20.0, 30.0 * deg, 45.0 * deg), 1000.0,
69  20.0 * Units::micrometer, 40.0 * Units::micrometer);
70 
71  iff.setProbabilityDistributions(pdf1, *pdf2);
72 
73  const Cylinder ff_cylinder(5.0, 5.0);
74 
75  Particle particle(refMat::Particle, ff_cylinder);
76  ParticleLayout particle_layout(particle);
77  particle_layout.setInterference(iff);
78 
79  vacuum_layer.addLayout(particle_layout);
80 
81  auto* sample = new MultiLayer("Basic2DParaCrystal_" + pdf2->className());
82  sample->addLayer(vacuum_layer);
83  sample->addLayer(substrate_layer);
84  return sample;
85 }
virtual std::string className() const =0
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Interference function of a 2D paracrystal.
static constexpr double micrometer
Definition: Units.h:35

References Layer::addLayout(), INode::className(), Units::deg, Units::micrometer, refMat::Particle, ParticleLayout::setInterference(), Interference2DParaCrystal::setProbabilityDistributions(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createBoxCompositionRotateX()

MultiLayer * ExemplarySamples::createBoxCompositionRotateX ( )

Definition at line 57 of file BoxCompositionBuilder.cpp.

58 {
59  Particle box(particleMaterial, Box(length / 2.0, width, height));
60  ParticleComposition composition;
61  composition.addParticle(box, R3(0.0, 0.0, 0.0));
62  composition.addParticle(box, R3(length / 2.0, 0.0, 0.0));
63  composition.setRotation(RotationX(90.0 * deg));
64  composition.setParticlePosition(R3(0.0, 0.0, -layer_thickness / 2.0));
65  return finalizeMultiLayer(composition);
66 }
A rectangular prism (parallelepiped).
Definition: Box.h:23
void setParticlePosition(R3 position)
Sets relative position of the particle's reference point in the coordinate system of parent.
Definition: IParticle.h:51
void setRotation(const IRotation &rotation)
Sets transformation.
Definition: IParticle.cpp:36
A composition of particles at fixed positions.
void addParticle(const IParticle &particle)
A rotation about the x axis.
Definition: Rotations.h:74

References ParticleComposition::addParticle(), Units::deg, IParticle::setParticlePosition(), and IParticle::setRotation().

Here is the call graph for this function:

◆ createBoxCompositionRotateY()

MultiLayer * ExemplarySamples::createBoxCompositionRotateY ( )

Definition at line 70 of file BoxCompositionBuilder.cpp.

71 {
72  Particle box(particleMaterial, Box(length / 2.0, width, height));
73  ParticleComposition composition;
74  composition.addParticle(box, R3(0.0, 0.0, 0.0));
75  composition.addParticle(box, R3(length / 2.0, 0.0, 0.0));
76  composition.setRotation(RotationY(90.0 * deg));
77  composition.setParticlePosition(R3(0.0, 0.0, -layer_thickness / 2.0 + length / 4.0));
78  return finalizeMultiLayer(composition);
79 }
A rotation about the y axis.
Definition: Rotations.h:98

References ParticleComposition::addParticle(), Units::deg, IParticle::setParticlePosition(), and IParticle::setRotation().

Here is the call graph for this function:

◆ createBoxCompositionRotateZ()

MultiLayer * ExemplarySamples::createBoxCompositionRotateZ ( )

Definition at line 83 of file BoxCompositionBuilder.cpp.

84 {
85  Particle box(particleMaterial, Box(length / 2.0, width, height));
86  ParticleComposition composition;
87  composition.addParticle(box, R3(0.0, 0.0, 0.0));
88  composition.addParticle(box, R3(length / 2.0, 0.0, 0.0));
89  composition.setRotation(RotationZ(90.0 * deg));
90  composition.setParticlePosition(R3(0.0, 0.0, -layer_thickness / 2.0 - height / 2.0));
91  return finalizeMultiLayer(composition);
92 }
A rotation about the z axis.
Definition: Rotations.h:122

References ParticleComposition::addParticle(), Units::deg, IParticle::setParticlePosition(), and IParticle::setRotation().

Here is the call graph for this function:

◆ createBoxCompositionRotateZandY()

MultiLayer * ExemplarySamples::createBoxCompositionRotateZandY ( )

Definition at line 96 of file BoxCompositionBuilder.cpp.

97 {
98  Particle box(particleMaterial, Box(length / 2.0, width, height));
99  ParticleComposition composition;
100  composition.addParticle(box, R3(0.0, 0.0, 0.0));
101  composition.addParticle(box, R3(length / 2.0, 0.0, 0.0));
102  composition.setRotation(RotationZ(90.0 * deg));
103  composition.rotate(RotationY(90.0 * deg));
104  composition.setParticlePosition(R3(0.0, 0.0, -layer_thickness / 2.0));
105  return finalizeMultiLayer(composition);
106 }
IParticle * rotate(const IRotation &rotation)
Rotates the particle, and returns this.
Definition: IParticle.cpp:41

References ParticleComposition::addParticle(), Units::deg, IParticle::rotate(), IParticle::setParticlePosition(), and IParticle::setRotation().

Here is the call graph for this function:

◆ createBoxesSquareLattice2D()

MultiLayer * ExemplarySamples::createBoxesSquareLattice2D ( )

Definition at line 25 of file BoxesSquareLatticeBuilder.cpp.

26 {
27  const double length = 5;
28  const double height = 10;
29 
30  Layer vacuum_layer(refMat::Vacuum);
31  Layer substrate_layer(refMat::Substrate);
32 
34 
35  Profile2DCauchy pdf(100.0, 100.0, 0);
36  iff.setDecayFunction(pdf);
37 
38  // particles
39  ParticleLayout particle_layout;
40  Box ff_box(length, length, height);
41  Particle particle(refMat::Particle, ff_box);
42  particle_layout.addParticle(particle, 1.0);
43 
44  particle_layout.setInterference(iff);
45 
46  vacuum_layer.addLayout(particle_layout);
47 
48  auto* sample = new MultiLayer();
49  sample->addLayer(vacuum_layer);
50  sample->addLayer(substrate_layer);
51  return sample;
52 }
A two-dimensional Bravais lattice with square unit cell.
Definition: Lattice2D.h:76

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, Interference2DLattice::setDecayFunction(), ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createBoxStackComposition()

MultiLayer * ExemplarySamples::createBoxStackComposition ( )

Definition at line 111 of file BoxCompositionBuilder.cpp.

112 {
113  ParticleComposition composition;
114 
115  // box1 (20,50,5), rotatedZ
116  const double box1_length = 20;
117  const double box1_width = 50;
118  const double box1_height = 5;
119  Particle box1(particleMaterial, Box(box1_length, box1_width, box1_height));
120  box1.setRotation(RotationZ(90. * deg));
121 
122  // box2 (5,20,50), rotatedY
123  const double box2_length = 5.0;
124  const double box2_width = 20.0;
125  const double box2_height = 50.0;
126  Particle box2(particleMaterial, Box(box2_length, box2_width, box2_height));
127  box2.setRotation(RotationY(90. * deg));
128  box2.setParticlePosition(R3(-box2_height / 2.0, 0.0, box2_length / 2.0));
129 
130  composition.addParticle(box1, R3(0.0, 0.0, 0.0));
131  composition.addParticle(box2, R3(0.0, 0.0, box1_height));
132  composition.setRotation(RotationY(90.0 * deg));
133  composition.setParticlePosition(R3(0.0, 0.0, -layer_thickness / 2.));
134 
135  return finalizeMultiLayer(composition);
136 }

References ParticleComposition::addParticle(), Units::deg, IParticle::setParticlePosition(), and IParticle::setRotation().

Here is the call graph for this function:

◆ createCenteredSquareLattice2D()

MultiLayer * ExemplarySamples::createCenteredSquareLattice2D ( )

Definition at line 88 of file TwoDimLatticeBuilder.cpp.

89 {
90  Layer vacuum_layer(refMat::Vacuum);
91  Layer substrate_layer(refMat::Substrate);
92 
93  Interference2DLattice interparticle(BasicLattice2D(10.0, 10.0, M_PI / 2.0, 0));
94  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 0);
95  interparticle.setDecayFunction(pdf);
96 
97  Cylinder ff_cyl(5.0, 5.0);
98  Particle cylinder(refMat::Particle, ff_cyl);
99  std::vector<R3> positions;
100  R3 position_1(0.0, 0.0, 0.0);
101  R3 position_2(5.0, -5.0, 0.0);
102  positions.push_back(position_1);
103  positions.push_back(position_2);
104  ParticleComposition basis;
105  basis.addParticles(cylinder, positions);
106 
107  ParticleLayout particle_layout;
108  particle_layout.addParticle(basis);
109  particle_layout.setInterference(interparticle);
110  vacuum_layer.addLayout(particle_layout);
111 
112  auto* sample = new MultiLayer();
113  sample->addLayer(vacuum_layer);
114  sample->addLayer(substrate_layer);
115  return sample;
116 }
void addParticles(const IParticle &particle, std::vector< R3 > positions)

References Layer::addLayout(), ParticleLayout::addParticle(), ParticleComposition::addParticles(), M_PI, refMat::Particle, Interference2DLattice::setDecayFunction(), ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createConesWithLimitsDistribution()

MultiLayer * ExemplarySamples::createConesWithLimitsDistribution ( )

Definition at line 209 of file ParticleDistributionsBuilder.cpp.

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 }

◆ createCoreShellBoxRotateZandY()

MultiLayer * ExemplarySamples::createCoreShellBoxRotateZandY ( )

Definition at line 59 of file CoreShellParticleBuilder.cpp.

60 {
61  const double layer_thickness(100.0);
62 
63  // core shell particle
64  const double shell_length(50.0);
65  const double shell_width(20.0);
66  const double shell_height(10.0);
67  double core_length = shell_length / 2.0;
68  double core_width = shell_width / 2.0;
69  double core_height = shell_height / 2.0;
70 
71  Particle core(refMat::Ag, Box(core_length, core_width, core_height));
72  Particle shell(refMat::AgO2, Box(shell_length, shell_width, shell_height));
73  ParticleCoreShell coreshell(shell, core, R3(0.0, 0.0, (shell_height - core_height) / 2.0));
74  coreshell.setRotation(RotationZ(90.0 * deg));
75  coreshell.rotate(RotationY(90.0 * deg));
76  coreshell.setParticlePosition(R3(0.0, 0.0, -layer_thickness / 2.0));
77 
78  ParticleLayout layout;
79  layout.addParticle(coreshell);
80 
81  Layer vacuum_layer(refMat::Vacuum);
82  Layer middle_layer(refMat::Teflon, layer_thickness);
83  middle_layer.addLayout(layout);
84  Layer substrate(refMat::Substrate2);
85 
86  auto* sample = new MultiLayer();
87  sample->addLayer(vacuum_layer);
88  sample->addLayer(middle_layer);
89  sample->addLayer(substrate);
90 
91  return sample;
92 }
A particle with a core/shell geometry.
static const Material Substrate2
static const Material Ag
static const Material Teflon
static const Material AgO2

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Ag, refMat::AgO2, Units::deg, IParticle::rotate(), IParticle::setParticlePosition(), IParticle::setRotation(), refMat::Substrate2, refMat::Teflon, and refMat::Vacuum.

Here is the call graph for this function:

◆ createCoreShellParticle()

MultiLayer * ExemplarySamples::createCoreShellParticle ( )

Definition at line 30 of file CoreShellParticleBuilder.cpp.

31 {
32  complex_t n_particle_shell(1.0 - 1e-4, 2e-8);
33  complex_t n_particle_core(1.0 - 6e-5, 2e-8);
34 
35  Material shell_material = RefractiveMaterial("Shell", n_particle_shell);
36  Material core_material = RefractiveMaterial("Core", n_particle_core);
37 
38  Layer vacuum_layer(refMat::Vacuum);
39 
40  Box ff_box1(16, 16, 8);
41  Particle shell_particle(shell_material, ff_box1);
42 
43  Box ff_box2(12, 12, 7);
44  Particle core_particle(core_material, ff_box2);
45 
46  R3 core_position(0.0, 0.0, 0.0);
47  ParticleCoreShell particle(shell_particle, core_particle, core_position);
48 
49  ParticleLayout particle_layout(particle);
50  vacuum_layer.addLayout(particle);
51 
52  auto* sample = new MultiLayer();
53  sample->addLayer(vacuum_layer);
54  return sample;
55 }
Material RefractiveMaterial(const std::string &name, complex_t refractive_index, R3 magnetization)

References Layer::addLayout(), RefractiveMaterial(), and refMat::Vacuum.

Here is the call graph for this function:

◆ createCosineRipple()

MultiLayer * ExemplarySamples::createCosineRipple ( )

Definition at line 26 of file RipplesBuilder.cpp.

27 {
28  Layer vacuum_layer(refMat::Vacuum);
29  CosineRippleBox ff_ripple1(100.0, 20.0, 4.0);
30  Particle ripple(refMat::Particle, ff_ripple1);
31 
32  ParticleLayout particle_layout;
33  particle_layout.addParticle(ripple, 1.0);
34  InterferenceRadialParaCrystal interparticle(20.0, 1e7);
35  Profile1DGauss pdf(4.0);
36  interparticle.setProbabilityDistribution(pdf);
37  particle_layout.setInterference(interparticle);
38 
39  vacuum_layer.addLayout(particle_layout);
40 
41  Layer substrate_layer(refMat::Substrate);
42 
43  auto* sample = new MultiLayer();
44  sample->addLayer(vacuum_layer);
45  sample->addLayer(substrate_layer);
46  return sample;
47 }
The form factor for a cosine ripple, with box profile in elongation direction.
Definition: CosineRipple.h:22
Interference function of radial paracrystal.
Gaussian IProfile1D; its Fourier transform standardizedFT(q) is a Gaussian starting at standardizedFT...
Definition: Profiles1D.h:87

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, ParticleLayout::setInterference(), InterferenceRadialParaCrystal::setProbabilityDistribution(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createCustomMorphology()

MultiLayer * ExemplarySamples::createCustomMorphology ( )

Definition at line 27 of file CustomMorphologyBuilder.cpp.

28 {
29  Material mat_vacuum = refMat::Vacuum;
30  Material mat_particle = refMat::Particle;
31 
32  Layer vacuum_layer(mat_vacuum);
33  ParticleLayout particle_layout;
34 
35  // add particle number 1:
36  Box ff1(2.0, 2.0, 1.0);
37  R3 pos1(0.0, 0.0, 0.0);
38  Particle p1(mat_particle, ff1);
39  p1.setParticlePosition(pos1);
40  particle_layout.addParticle(p1, 0.5);
41  // add particle number 2:
42  Box ff2(2.0, 4.0, 1.0);
43  R3 pos2(5.0, 5.0, 0.0);
44  RotationZ m2(10 * deg);
45  Particle p2(mat_particle, ff2, m2);
46  p2.setParticlePosition(pos2);
47  particle_layout.addParticle(p2, 0.5);
48  // add particle number 3:
49  Box ff3(2.0, 6.0, 1.0);
50  R3 pos3(-5.0, -5.0, 0.0);
51  RotationZ m3(20 * deg);
52  Particle p3(mat_particle, ff3, m3);
53  p3.setParticlePosition(pos3);
54  particle_layout.addParticle(p3, 0.5);
55  // add particle number 4:
56  Box ff4(2.0, 8.0, 1.0);
57  R3 pos4(5.0, -5.0, 0.0);
58  RotationZ m4(30 * deg);
59  Particle p4(mat_particle, ff4, m4);
60  p4.setParticlePosition(pos4);
61  particle_layout.addParticle(p4, 0.5);
62  // add particle number 5:
63  Box ff5(2.0, 10.0, 1.0);
64  R3 pos5(-5.0, 5.0, 0.0);
65  RotationZ m5(40 * deg);
66  Particle p5(mat_particle, ff5, m5);
67  p5.setParticlePosition(pos5);
68  particle_layout.addParticle(p5, 0.5);
69  // add particle number 6:
70  Box ff6(2.0, 2.0, 1.0);
71  R3 pos6(0.0, 0.0, 0.0);
72  RotationZ m6(50 * deg);
73  Particle p6(mat_particle, ff6, m6);
74  p6.setParticlePosition(pos6);
75  particle_layout.addParticle(p6, 0.5);
76  // add particle number 7:
77  Box ff7(2.0, 4.0, 1.0);
78  R3 pos7(5.0, 5.0, 0.0);
79  RotationZ m7(60 * deg);
80  Particle p7(mat_particle, ff7, m7);
81  p7.setParticlePosition(pos7);
82  particle_layout.addParticle(p7, 0.5);
83  // add particle number 8:
84  Box ff8(2.0, 6.0, 1.0);
85  R3 pos8(-5.0, -5.0, 0.0);
86  RotationZ m8(70 * deg);
87  Particle p8(mat_particle, ff8, m8);
88  p8.setParticlePosition(pos8);
89  particle_layout.addParticle(p8, 0.5);
90  // add particle number 9:
91  Box ff9(2.0, 8.0, 1.0);
92  R3 pos9(5.0, -5.0, 0.0);
93  RotationZ m9(80 * deg);
94  Particle p9(mat_particle, ff9, m9);
95  p9.setParticlePosition(pos9);
96  particle_layout.addParticle(p9, 0.5);
97  // add particle number 10:
98  Box ff10(2.0, 10.0, 1.0);
99  R3 pos10(-5.0, 5.0, 0.0);
100  RotationZ m10(90 * deg);
101  Particle p10(mat_particle, ff10, m10);
102  p10.setParticlePosition(pos10);
103  particle_layout.addParticle(p10, 0.5);
104  vacuum_layer.addLayout(particle_layout);
105 
106  auto* sample = new MultiLayer();
107  sample->addLayer(vacuum_layer);
108  return sample;
109 }

References Layer::addLayout(), ParticleLayout::addParticle(), Units::deg, refMat::Particle, IParticle::setParticlePosition(), and refMat::Vacuum.

Here is the call graph for this function:

◆ createCylindersAndPrisms()

MultiLayer * ExemplarySamples::createCylindersAndPrisms ( )

Definition at line 24 of file CylindersAndPrismsBuilder.cpp.

25 {
26  auto* sample = new MultiLayer();
27 
28  Layer vacuum_layer(refMat::Vacuum);
29  Layer substrate_layer(refMat::Substrate);
30 
31  ParticleLayout particle_layout;
32 
33  Cylinder ff_cylinder(5.0, 5.0);
34  Particle cylinder(refMat::Particle, ff_cylinder);
35 
36  Prism3 ff_prism3(10.0, 5.0);
37  Particle prism3(refMat::Particle, ff_prism3);
38 
39  particle_layout.addParticle(cylinder, 0.5);
40  particle_layout.addParticle(prism3, 0.5);
41 
42  vacuum_layer.addLayout(particle_layout);
43 
44  sample->addLayer(vacuum_layer);
45  sample->addLayer(substrate_layer);
46  return sample;
47 }
A prism based on an equilateral triangle.
Definition: Prism3.h:23

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createCylindersInSSCA()

MultiLayer * ExemplarySamples::createCylindersInSSCA ( )

Definition at line 145 of file SizeDistributionModelsBuilder.cpp.

146 {
147  throw std::runtime_error(
148  "This sample used ParticleDistribution which is not supported any more.");
149 
150  // #baRemoveParticleDistribution The following code is outdated. However, it is still kept,
151  // since it may be useful once the new particle distribution approach is implemented.
152  /*
153  Layer vacuum_layer(refMat::Vacuum);
154 
155  InterferenceRadialParaCrystal interparticle(15.0, 1e3);
156  Profile1DGauss pdf(5);
157  interparticle.setProbabilityDistribution(pdf);
158  interparticle.setKappa(4.02698);
159  ParticleLayout particle_layout;
160 
161  Cylinder ff_cylinder(5.0, 5.0);
162  Particle particle_prototype(refMat::Particle, ff_cylinder);
163 
164  DistributionGaussian gauss(5.0, 1.25);
165  ParameterPattern pattern_radius;
166  pattern_radius.add("Particle").add("Cylinder").add("Radius");
167  ParameterDistribution par_distr(pattern_radius.toStdString(), gauss, 30, 3.0);
168  ParameterPattern pattern_height;
169  pattern_height.add("Particle").add("Cylinder").add("Height");
170  par_distr.linkParameter(pattern_height.toStdString());
171  ParticleDistribution particle_collection(particle_prototype, par_distr);
172  particle_layout.addParticle(particle_collection);
173 
174  particle_layout.setInterference(interparticle);
175 
176  vacuum_layer.addLayout(particle_layout);
177 
178  auto* sample = new MultiLayer();
179  sample->addLayer(vacuum_layer);
180  return sample;
181  */
182 }

◆ createCylindersWithSizeDistribution()

MultiLayer * ExemplarySamples::createCylindersWithSizeDistribution ( )

Definition at line 28 of file ParticleDistributionsBuilder.cpp.

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 }

◆ createFeNiBilayer()

MultiLayer * ExemplarySamples::createFeNiBilayer ( )

Definition at line 162 of file FeNiBilayerBuilder.cpp.

163 {
164  auto sample = FeNiBilayer{Options()};
165  return sample.release();
166 }

◆ createFeNiBilayerNC()

MultiLayer * ExemplarySamples::createFeNiBilayerNC ( )

Definition at line 175 of file FeNiBilayerBuilder.cpp.

176 {
177  auto sample = FeNiBilayer{
178  Options().sigmaRoughness(2. * Units::angstrom).roughnessModel(RoughnessModel::NEVOT_CROCE)};
179  return sample.release();
180 }
static constexpr double angstrom
Definition: Units.h:34

References Units::angstrom, and MultiLayer::roughnessModel().

Here is the call graph for this function:

◆ createFeNiBilayerSpinFlip()

MultiLayer * ExemplarySamples::createFeNiBilayerSpinFlip ( )

Definition at line 182 of file FeNiBilayerBuilder.cpp.

183 {
184  auto sample = FeNiBilayer{Options().angle(38. * deg)};
185  return sample.release();
186 }

References Units::deg.

◆ createFeNiBilayerSpinFlipNC()

MultiLayer * ExemplarySamples::createFeNiBilayerSpinFlipNC ( )

Definition at line 197 of file FeNiBilayerBuilder.cpp.

198 {
199  auto sample = FeNiBilayer{Options()
200  .angle(38 * deg)
201  .sigmaRoughness(2. * Units::angstrom)
202  .roughnessModel(RoughnessModel::NEVOT_CROCE)};
203  return sample.release();
204 }

References Units::angstrom, Units::deg, and MultiLayer::roughnessModel().

Here is the call graph for this function:

◆ createFeNiBilayerSpinFlipTanh()

MultiLayer * ExemplarySamples::createFeNiBilayerSpinFlipTanh ( )

Definition at line 188 of file FeNiBilayerBuilder.cpp.

189 {
190  auto sample = FeNiBilayer{Options()
191  .angle(38 * deg)
192  .sigmaRoughness(2. * Units::angstrom)
193  .roughnessModel(RoughnessModel::TANH)};
194  return sample.release();
195 }

References Units::angstrom, Units::deg, and MultiLayer::roughnessModel().

Here is the call graph for this function:

◆ createFeNiBilayerTanh()

MultiLayer * ExemplarySamples::createFeNiBilayerTanh ( )

Definition at line 168 of file FeNiBilayerBuilder.cpp.

169 {
170  auto sample = FeNiBilayer{
171  Options().sigmaRoughness(2. * Units::angstrom).roughnessModel(RoughnessModel::TANH)};
172  return sample.release();
173 }

References Units::angstrom, and MultiLayer::roughnessModel().

Here is the call graph for this function:

◆ createFiniteSquareLattice2D()

MultiLayer * ExemplarySamples::createFiniteSquareLattice2D ( )

Definition at line 150 of file TwoDimLatticeBuilder.cpp.

151 {
152  Layer vacuum_layer(refMat::Vacuum);
153  Layer substrate_layer(refMat::Substrate);
154 
155  InterferenceFinite2DLattice iff(SquareLattice2D(10.0, 0.0), 40, 40);
156  iff.setPositionVariance(1.0);
157 
158  // particles
159  ParticleLayout particle_layout;
160  Cylinder ff_cyl(5.0, 5.0);
161  Particle particle(refMat::Particle, ff_cyl);
162  particle_layout.addParticle(particle, 1.0);
163 
164  particle_layout.setInterference(iff);
165 
166  vacuum_layer.addLayout(particle_layout);
167 
168  auto* sample = new MultiLayer();
169  sample->addLayer(vacuum_layer);
170  sample->addLayer(substrate_layer);
171  return sample;
172 }
Interference function of a finite 2D lattice.

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, ParticleLayout::setInterference(), IInterference::setPositionVariance(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createHardDisk()

MultiLayer * ExemplarySamples::createHardDisk ( )

Definition at line 24 of file PercusYevickBuilder.cpp.

25 {
26  const double m_cylinder_height(5);
27  const double m_cylinder_radius(5);
28  const double m_disk_radius(5);
29  const double m_density(0.006);
30 
31  Layer vacuum_layer(refMat::Vacuum);
32  Layer substrate_layer(refMat::Substrate);
33 
34  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
35  Particle particle(refMat::Particle, ff_cylinder);
36  ParticleLayout particle_layout(particle);
37 
38  InterferenceHardDisk interparticle(m_disk_radius, m_density);
39  particle_layout.setInterference(interparticle);
40 
41  vacuum_layer.addLayout(particle_layout);
42 
43  auto* sample = new MultiLayer();
44  sample->addLayer(vacuum_layer);
45  sample->addLayer(substrate_layer);
46  return sample;
47 }
Percus-Yevick hard disk interference function.

References Layer::addLayout(), refMat::Particle, ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createHexParaCrystal()

MultiLayer * ExemplarySamples::createHexParaCrystal ( )

Definition at line 91 of file ParaCrystalBuilder.cpp.

92 {
93  const double m_peak_distance(20.0);
94  const double m_corr_length(0.0);
95  const double m_domain_size_1(20.0 * Units::micrometer);
96  const double m_domain_size_2(20.0 * Units::micrometer);
97  const double m_cylinder_height(5);
98  const double m_cylinder_radius(5);
99 
100  Layer vacuum_layer(refMat::Vacuum);
101  Layer substrate_layer(refMat::Substrate);
102 
103  Interference2DParaCrystal iff(HexagonalLattice2D(m_peak_distance, 0.0), m_corr_length,
104  m_domain_size_1, m_domain_size_2);
105  iff.setIntegrationOverXi(true);
106  Profile2DCauchy pdf(1.0, 1.0, 0);
107  iff.setProbabilityDistributions(pdf, pdf);
108 
109  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
110  Particle cylinder(refMat::Particle, ff_cylinder);
111 
112  ParticleLayout particle_layout(cylinder);
113  particle_layout.setInterference(iff);
114 
115  vacuum_layer.addLayout(particle_layout);
116 
117  auto* sample = new MultiLayer();
118  sample->addLayer(vacuum_layer);
119  sample->addLayer(substrate_layer);
120  return sample;
121 }
A two-dimensional Bravais lattice with hexagonal symmetry.
Definition: Lattice2D.h:98

References Layer::addLayout(), Units::micrometer, refMat::Particle, Interference2DParaCrystal::setIntegrationOverXi(), ParticleLayout::setInterference(), Interference2DParaCrystal::setProbabilityDistributions(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createHomogeneousMultilayer()

MultiLayer * ExemplarySamples::createHomogeneousMultilayer ( )

Definition at line 20 of file HomogeneousMultilayerBuilder.cpp.

21 {
22  const size_t number_of_layers = 10;
23  const double delta_ti = -7.36e-7;
24  const double delta_ni = 3.557e-6;
25  const double delta_si = 7.81e-7;
26  const double thick_ti = 3.0; // nm
27  const double thick_ni = 7.0; // nm
28 
29  Material vacuumaterial = Vacuum();
30  Material substrate_material = RefractiveMaterial("Si_substrate", delta_si, 0.0);
31  Material ni_material = RefractiveMaterial("Ni", delta_ni, 0.0);
32  Material ti_material = RefractiveMaterial("Ti", delta_ti, 0.0);
33 
34  Layer vacuulayer(vacuumaterial, 0);
35  Layer ni_layer(ni_material, thick_ni);
36  Layer ti_layer(ti_material, thick_ti);
37  Layer substrate_layer(substrate_material, 0);
38 
39  auto* sample = new MultiLayer();
40  sample->addLayer(vacuulayer);
41  for (size_t i = 0; i < number_of_layers; ++i) {
42  sample->addLayer(ti_layer);
43  sample->addLayer(ni_layer);
44  }
45  sample->addLayer(substrate_layer);
46  return sample;
47 }

References RefractiveMaterial(), and refMat::Vacuum.

Here is the call graph for this function:

◆ createLattice1D()

MultiLayer * ExemplarySamples::createLattice1D ( )

Definition at line 29 of file LatticeBuilder.cpp.

30 {
31  const double length(20.0);
32  const double xi(10.0 * deg);
33  const double corr_length(1000.0);
34  const double cylinder_height(5);
35  const double cylinder_radius(5);
36 
37  Layer vacuum_layer(refMat::Vacuum);
38  Layer substrate_layer(refMat::Substrate);
39 
40  Interference1DLattice interparticle(length, xi);
41  Profile1DCauchy pdf(corr_length);
42  interparticle.setDecayFunction(pdf);
43 
44  Cylinder ff_cylinder(cylinder_radius, cylinder_height);
45  Particle cylinder(refMat::Particle, ff_cylinder);
46 
47  ParticleLayout particle_layout(cylinder);
48  particle_layout.setInterference(interparticle);
49 
50  vacuum_layer.addLayout(particle_layout);
51 
52  auto* sample = new MultiLayer();
53  sample->addLayer(vacuum_layer);
54  sample->addLayer(substrate_layer);
55  return sample;
56 }
Interference function of a 1D lattice.
Exponential IProfile1D exp(-|omega*x|); its Fourier transform standardizedFT(q) is a Cauchy-Lorentzia...
Definition: Profiles1D.h:63

References Layer::addLayout(), Units::deg, refMat::Particle, Interference1DLattice::setDecayFunction(), ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createLayersWithAbsorptionBySLD()

MultiLayer * ExemplarySamples::createLayersWithAbsorptionBySLD ( )

Definition at line 29 of file LayersWithAbsorptionBySLDBuilder.cpp.

30 {
31  Material ambience_mat = MaterialBySLD("Vacuum", 0.0, 0.0);
32  Material middle_mat = MaterialBySLD("Teflon", 4.7573e-6, 1.6724e-12);
33  Material substrate_mat = MaterialBySLD("Substrate", 2.0728e-06, 2.3747e-11);
34  Material particle_mat = MaterialBySLD("Ag", 3.4682e-06, 1.0309e-08);
35 
36  Sphere ff(5.0);
37 
38  Particle particle(particle_mat, ff);
39  particle.setRotation(RotationZ(10.0 * deg));
40  particle.rotate(RotationY(10.0 * deg));
41  particle.rotate(RotationX(10.0 * deg));
42  particle.setParticlePosition(R3(0.0, 0.0, -middle_layer_thickness / 2.0));
43 
44  ParticleLayout layout;
45  layout.addParticle(particle);
46 
47  Layer vacuum_layer(ambience_mat);
48  Layer middle_layer(middle_mat, middle_layer_thickness);
49  Layer substrate(substrate_mat);
50 
51  middle_layer.addLayout(layout);
52 
53  auto* sample = new MultiLayer();
54  sample->addLayer(vacuum_layer);
55  sample->addLayer(middle_layer);
56  sample->addLayer(substrate);
57  return sample;
58 }
const double middle_layer_thickness(60.0)
A full sphere.
Definition: Sphere.h:23

References Layer::addLayout(), ParticleLayout::addParticle(), Units::deg, MaterialBySLD(), middle_layer_thickness(), IParticle::rotate(), IParticle::setParticlePosition(), and IParticle::setRotation().

Here is the call graph for this function:

◆ createLayersWithAbsorptionWithFF()

MultiLayer * ExemplarySamples::createLayersWithAbsorptionWithFF ( const IFormFactor ff)

Definition at line 27 of file LayersWithAbsorptionBuilder.cpp.

28 {
29  const double middle_layer_thickness(60.0);
30 
31  Particle particle(refMat::Ag, *ff);
32  particle.setRotation(RotationZ(10.0 * deg));
33  particle.rotate(RotationY(10.0 * deg));
34  particle.rotate(RotationX(10.0 * deg));
35  particle.setParticlePosition(R3(0.0, 0.0, -middle_layer_thickness / 2.0));
36 
37  ParticleLayout layout;
38  layout.addParticle(particle);
39 
40  Layer vacuum_layer(refMat::Vacuum);
42  Layer substrate(refMat::Substrate2);
43 
44  middle_layer.addLayout(layout);
45 
46  auto* sample = new MultiLayer(ff->shapeName());
47  sample->addLayer(vacuum_layer);
48  sample->addLayer(middle_layer);
49  sample->addLayer(substrate);
50  return sample;
51 }

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Ag, Units::deg, middle_layer_thickness(), IParticle::rotate(), IParticle::setParticlePosition(), IParticle::setRotation(), refMat::Substrate2, refMat::Teflon, and refMat::Vacuum.

Here is the call graph for this function:

◆ createLinkedBoxDistribution()

MultiLayer * ExemplarySamples::createLinkedBoxDistribution ( )

Definition at line 245 of file ParticleDistributionsBuilder.cpp.

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 }

◆ createMagneticCylinders()

MultiLayer * ExemplarySamples::createMagneticCylinders ( )

Definition at line 60 of file MagneticParticlesBuilder.cpp.

61 {
62  const double m_cylinder_radius(5);
63  const double m_cylinder_height(5);
64 
65  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
66  Material substrate_material = RefractiveMaterial("Substrate", 15e-6, 0.0);
67  R3 magnetization(0.0, 1e6, 0.0);
68  Material particle_material = RefractiveMaterial("MagParticle2", 5e-6, 0.0, magnetization);
69 
70  Layer vacuum_layer(vacuum_material);
71  Layer substrate_layer(substrate_material);
72 
73  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
74 
75  Particle particle(particle_material, ff_cylinder);
76  ParticleLayout particle_layout(particle);
77 
78  vacuum_layer.addLayout(particle_layout);
79 
80  auto* sample = new MultiLayer();
81  sample->addLayer(vacuum_layer);
82  sample->addLayer(substrate_layer);
83  return sample;
84 }

References Layer::addLayout(), and RefractiveMaterial().

Here is the call graph for this function:

◆ createMagneticLayer()

MultiLayer * ExemplarySamples::createMagneticLayer ( )

Definition at line 92 of file MagneticLayersBuilder.cpp.

93 {
94  auto* sample = new MultiLayer();
95 
96  R3 layer_field = R3(0.0, 0.0, 1e6);
97  R3 particle_field(1e6, 0.0, 0.0);
98  Material vacuum_material = RefractiveMaterial("Vacuum0", 0.0, 0.0);
99  Material layer_material = RefractiveMaterial("Vacuum1", 0.0, 0.0, layer_field);
100  Material substrate_material = RefractiveMaterial("Substrate", 7e-6, 2e-8);
101  Material particle_material = RefractiveMaterial("MagParticle", 6e-4, 2e-8, particle_field);
102 
103  ParticleLayout particle_layout;
104  Sphere ff_sphere(sphere_radius);
105  Particle particle(particle_material, ff_sphere);
106  particle_layout.addParticle(particle);
107 
108  Layer vacuum_layer(vacuum_material);
109  vacuum_layer.addLayout(particle_layout);
110  Layer substrate_layer(substrate_material);
111 
112  sample->addLayer(vacuum_layer);
113  sample->addLayer(substrate_layer);
114  return sample;
115 }

References Layer::addLayout(), ParticleLayout::addParticle(), and RefractiveMaterial().

Here is the call graph for this function:

◆ createMagneticParticleZeroField()

MultiLayer * ExemplarySamples::createMagneticParticleZeroField ( )

Definition at line 30 of file MagneticParticlesBuilder.cpp.

31 {
32  const double m_cylinder_radius(5);
33  const double m_cylinder_height(5);
34 
35  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
36  Material substrate_material = RefractiveMaterial("Substrate", 6e-6, 2e-8);
37  R3 magnetic_field(0.0, 0.0, 0.0);
38  Material particle_material = RefractiveMaterial("MagParticle", 6e-4, 2e-8, magnetic_field);
39 
40  Layer vacuum_layer(vacuum_material);
41  Layer substrate_layer(substrate_material);
42 
43  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
44 
45  Particle particle(particle_material, ff_cylinder);
46  ParticleLayout particle_layout(particle);
47 
48  vacuum_layer.addLayout(particle_layout);
49 
50  auto* sample = new MultiLayer();
51  sample->addLayer(vacuum_layer);
52  sample->addLayer(substrate_layer);
53  return sample;
54 }

References Layer::addLayout(), and RefractiveMaterial().

Here is the call graph for this function:

◆ createMagneticRotation()

MultiLayer * ExemplarySamples::createMagneticRotation ( )

Definition at line 146 of file MagneticLayersBuilder.cpp.

147 {
148  auto* sample = new MultiLayer();
149 
150  R3 substr_field = R3(0.0, 1e6, 0.0);
151  R3 particle_field(1e6, 0.0, 0.0);
152  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
153  Material substrate_material = RefractiveMaterial("Substrate", 7e-6, 2e-8, substr_field);
154  Material particle_material = RefractiveMaterial("MagParticle", 6e-4, 2e-8, particle_field);
155 
156  ParticleLayout particle_layout;
157  R3 position(0.0, 0.0, -10.0);
158  Sphere ff_sphere(sphere_radius);
159  Particle particle(particle_material, ff_sphere);
160  RotationZ rot_z(90 * deg);
161  particle.rotate(rot_z);
162  particle.translate(position);
163  particle_layout.addParticle(particle);
164 
165  Layer vacuum_layer(vacuum_material);
166  Layer substrate_layer(substrate_material);
167  substrate_layer.addLayout(particle_layout);
168 
169  sample->addLayer(vacuum_layer);
170  sample->addLayer(substrate_layer);
171  return sample;
172 }

References Layer::addLayout(), ParticleLayout::addParticle(), Units::deg, RefractiveMaterial(), IParticle::rotate(), and IParticle::translate().

Here is the call graph for this function:

◆ createMagneticSpheres()

MultiLayer * ExemplarySamples::createMagneticSpheres ( )

Definition at line 90 of file MagneticParticlesBuilder.cpp.

91 {
92  const double m_sphere_radius(5);
93 
94  R3 magnetization(0.0, 0.0, 1e7);
95  Material particle_material = RefractiveMaterial("Particle", 2e-5, 4e-7, magnetization);
96  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
97  Material substrate_material = RefractiveMaterial("Substrate", 7e-6, 1.8e-7);
98 
99  Sphere ff_sphere(m_sphere_radius);
100  Particle particle(particle_material, ff_sphere);
101  R3 position(0.0, 0.0, -2.0 * m_sphere_radius);
102  particle.translate(position);
103 
104  ParticleLayout particle_layout;
105  particle_layout.addParticle(particle);
106 
107  Layer vacuum_layer(vacuum_material);
108  Layer substrate_layer(substrate_material);
109  substrate_layer.addLayout(particle_layout);
110 
111  auto* sample = new MultiLayer();
112  sample->addLayer(vacuum_layer);
113  sample->addLayer(substrate_layer);
114  return sample;
115 }

References Layer::addLayout(), ParticleLayout::addParticle(), RefractiveMaterial(), and IParticle::translate().

Here is the call graph for this function:

◆ createMagneticSubstrateZeroField()

MultiLayer * ExemplarySamples::createMagneticSubstrateZeroField ( )

Definition at line 44 of file MagneticLayersBuilder.cpp.

45 {
46  R3 substr_field(0.0, 0.0, 0.0);
47  R3 particle_field(0.1, 0.0, 0.0);
48  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
49  Material substrate_material = RefractiveMaterial("Substrate", 7e-6, 2e-8, substr_field);
50  Material particle_material = RefractiveMaterial("MagParticle", 6e-4, 2e-8, particle_field);
51 
52  ParticleLayout particle_layout;
53  R3 position(0.0, 0.0, -10.0);
54  Sphere ff_sphere(sphere_radius);
55  Particle particle(particle_material, ff_sphere);
56  particle.translate(position);
57  particle_layout.addParticle(particle);
58 
59  Layer vacuum_layer(vacuum_material);
60  Layer substrate_layer(substrate_material);
61  substrate_layer.addLayout(particle_layout);
62 
63  auto* sample = new MultiLayer();
64  sample->addLayer(vacuum_layer);
65  sample->addLayer(substrate_layer);
66  return sample;
67 }

References Layer::addLayout(), ParticleLayout::addParticle(), RefractiveMaterial(), and IParticle::translate().

Here is the call graph for this function:

◆ createMesoCrystal()

MultiLayer * ExemplarySamples::createMesoCrystal ( )

Definition at line 27 of file MesoCrystalBuilder.cpp.

28 {
29  // mesocrystal lattice
30  R3 lattice_basis_a(5.0, 0.0, 0.0);
31  R3 lattice_basis_b(0.0, 5.0, 0.0);
32  R3 lattice_basis_c(0.0, 0.0, 5.0);
33  Lattice3D lattice(lattice_basis_a, lattice_basis_b, lattice_basis_c);
34 
35  // spherical particle that forms the base of the mesocrystal
36  Sphere sphere_ff(2.0);
37  Particle sphere(refMat::Particle, sphere_ff);
38 
39  // crystal structure
40  Crystal crystal(sphere, lattice);
41 
42  // mesocrystal
43  Cylinder meso_ff(20.0, 50.0);
44  MesoCrystal meso(crystal, meso_ff);
45 
46  ParticleLayout particle_layout;
47  particle_layout.addParticle(meso);
48 
49  Layer vacuum_layer(refMat::Vacuum);
50  vacuum_layer.addLayout(particle_layout);
51  Layer substrate_layer(refMat::Substrate);
52 
53  auto* sample = new MultiLayer();
54  sample->addLayer(vacuum_layer);
55  sample->addLayer(substrate_layer);
56  return sample;
57 }
A crystal structure, defined by a Bravais lattice, a basis, and a position variance.
Definition: Crystal.h:34
A Bravais lattice, characterized by three basis vectors, and optionally an ISelectionRule.
Definition: Lattice3D.h:30
A particle with a crystalline inner structure, made of smaller particles, and an outer shape describe...
Definition: MesoCrystal.h:27

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createMultiLayerWithNCRoughness()

MultiLayer * ExemplarySamples::createMultiLayerWithNCRoughness ( )

Definition at line 19 of file MultiLayerWithNCRoughnessBuilder.cpp.

20 {
21  auto* sample = createMultiLayerWithRoughness();
22  sample->setRoughnessModel(RoughnessModel::NEVOT_CROCE);
23  return sample;
24 }
MultiLayer * createMultiLayerWithRoughness()

References createMultiLayerWithRoughness().

Here is the call graph for this function:

◆ createMultiLayerWithRoughness()

MultiLayer * ExemplarySamples::createMultiLayerWithRoughness ( )

Definition at line 21 of file MultiLayerWithRoughnessBuilder.cpp.

22 {
23  const double thicknessA(2.5);
24  const double thicknessB(5.0);
25  const double sigma(1.0);
26  const double hurst(0.3);
27  const double lateralCorrLength(5.0);
28  const double crossCorrLength(10.0);
29 
30  Material vacuum_material = RefractiveMaterial("Vacuum", 0., 0.);
31  Material substrate_material = RefractiveMaterial("Substrate", 15e-6, 0.0);
32  Material part_a_material = RefractiveMaterial("PartA", 5e-6, 0.0);
33  Material part_b_material = RefractiveMaterial("PartB", 10e-6, 0.0);
34 
35  Layer vacuum_layer(vacuum_material, 0);
36  Layer partA_layer(part_a_material, thicknessA);
37  Layer partB_layer(part_b_material, thicknessB);
38  Layer substrate_layer(substrate_material, 0);
39 
40  LayerRoughness roughness(sigma, hurst, lateralCorrLength);
41 
42  auto* sample = new MultiLayer();
43  sample->addLayer(vacuum_layer);
44  for (int i = 0; i < 5; ++i) {
45  sample->addLayerWithTopRoughness(partA_layer, roughness);
46  sample->addLayerWithTopRoughness(partB_layer, roughness);
47  }
48  sample->addLayerWithTopRoughness(substrate_layer, roughness);
49  sample->setCrossCorrLength(crossCorrLength);
50  return sample;
51 }
A roughness of interface between two layers.

References RefractiveMaterial().

Referenced by createMultiLayerWithNCRoughness().

Here is the call graph for this function:

◆ createMultipleLayout()

MultiLayer * ExemplarySamples::createMultipleLayout ( )

Definition at line 24 of file MultipleLayoutBuilder.cpp.

25 {
26  const double cylinder_height(5);
27  const double cylinder_radius(5);
28  const double prisheight(5);
29  const double prislength(10);
30  const double cylinder_weight(0.5);
31 
32  Layer vacuum_layer(refMat::Vacuum);
33  Layer substrate_layer(refMat::Substrate);
34 
35  ParticleLayout particle_layout_1;
36  ParticleLayout particle_layout_2;
37 
38  Cylinder ff_cylinder(cylinder_radius, cylinder_height);
39  Particle cylinder(refMat::Particle, ff_cylinder);
40 
41  Prism3 ff_prism3(prislength, prisheight);
42  Particle prism3(refMat::Particle, ff_prism3);
43 
44  particle_layout_1.addParticle(cylinder, cylinder_weight);
45  particle_layout_2.addParticle(prism3, 1.0 - cylinder_weight);
46 
47  vacuum_layer.addLayout(particle_layout_1);
48  vacuum_layer.addLayout(particle_layout_2);
49 
50  auto* sample = new MultiLayer();
51  sample->addLayer(vacuum_layer);
52  sample->addLayer(substrate_layer);
53  return sample;
54 }

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createParticleComposition()

MultiLayer * ExemplarySamples::createParticleComposition ( )

Definition at line 28 of file ParticleCompositionBuilder.cpp.

29 {
30  Layer vacuum_layer(refMat::Vacuum);
31  Layer substrate_layer(refMat::Substrate);
32 
33  double radius(10.0);
34  Sphere sphere_ff(radius);
35  Particle sphere(refMat::Particle, sphere_ff);
36  ParticleLayout particle_layout;
37 
38  std::vector<R3> positions = {{},
39  {radius, radius / std::sqrt(3.0), std::sqrt(8.0 / 3.0) * radius}};
40 
41  ParticleComposition basis;
42 
43  basis.addParticles(sphere, positions);
44  particle_layout.addParticle(basis);
45 
46  Interference2DLattice iff(HexagonalLattice2D(radius * 2.0, 0));
47  Profile2DCauchy pdf(10, 10, 0);
48  iff.setDecayFunction(pdf);
49 
50  particle_layout.setInterference(iff);
51 
52  vacuum_layer.addLayout(particle_layout);
53 
54  auto* sample = new MultiLayer();
55  sample->addLayer(vacuum_layer);
56  sample->addLayer(substrate_layer);
57  return sample;
58 }

References Layer::addLayout(), ParticleLayout::addParticle(), ParticleComposition::addParticles(), refMat::Particle, Interference2DLattice::setDecayFunction(), ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createParticleInVacuumWithFF()

MultiLayer * ExemplarySamples::createParticleInVacuumWithFF ( const IFormFactor ff)

Definition at line 25 of file ParticleInVacuumBuilder.cpp.

26 {
27  Layer vacuum_layer(refMat::Vacuum);
28 
29  Particle particle(refMat::Particle, *ff);
30  ParticleLayout particle_layout(particle);
31  vacuum_layer.addLayout(particle_layout);
32 
33  auto* result = new MultiLayer("ParticleInVacuum_" + ff->shapeName());
34  result->addLayer(vacuum_layer);
35  return result;
36 }

References Layer::addLayout(), refMat::Particle, and refMat::Vacuum.

Here is the call graph for this function:

◆ createPlainMultiLayerBySLD()

MultiLayer * ExemplarySamples::createPlainMultiLayerBySLD ( int  n_layers = 10,
double  thick_ti = 3.0 
)

Definition at line 34 of file PlainMultiLayerBySLDBuilder.cpp.

35 {
36  double thick_ni(7.0);
37 
38  Material vacuum_material = MaterialBySLD();
39  Material substrate_material = MaterialBySLD("Si_substrate", m_si.sld_real, m_si.sld_imag);
40  Material ni_material = MaterialBySLD("Ni", m_ni.sld_real, m_ni.sld_imag);
41  Material ti_material = MaterialBySLD("Ti", m_ti.sld_real, m_ti.sld_imag);
42 
43  Layer vacuum_layer(vacuum_material);
44  Layer ni_layer(ni_material, thick_ni);
45  Layer ti_layer(ti_material, thick_ti);
46  Layer substrate_layer(substrate_material);
47 
48  auto* sample = new MultiLayer();
49  sample->addLayer(vacuum_layer);
50  for (int i = 0; i < n_layers; ++i) {
51  sample->addLayer(ti_layer);
52  sample->addLayer(ni_layer);
53  }
54  sample->addLayer(substrate_layer);
55  return sample;
56 }

References MaterialBySLD().

Here is the call graph for this function:

◆ createRadialParaCrystal()

MultiLayer * ExemplarySamples::createRadialParaCrystal ( )

Definition at line 29 of file ParaCrystalBuilder.cpp.

30 {
31  const double m_corr_peak_distance(20.0);
32  const double m_corr_width(7);
33  const double m_corr_length(1e3);
34  const double m_cylinder_height(5);
35  const double m_cylinder_radius(5);
36 
37  Layer vacuum_layer(refMat::Vacuum);
38  Layer substrate_layer(refMat::Substrate);
39 
40  InterferenceRadialParaCrystal iff(m_corr_peak_distance, m_corr_length);
41  Profile1DGauss pdf(m_corr_width);
42  iff.setProbabilityDistribution(pdf);
43  Cylinder ff_cylinder(m_cylinder_radius, m_cylinder_height);
44 
45  Particle particle(refMat::Particle, ff_cylinder);
46  ParticleLayout particle_layout(particle);
47  particle_layout.setInterference(iff);
48 
49  vacuum_layer.addLayout(particle_layout);
50 
51  auto* sample = new MultiLayer();
52  sample->addLayer(vacuum_layer);
53  sample->addLayer(substrate_layer);
54  return sample;
55 }

References Layer::addLayout(), refMat::Particle, ParticleLayout::setInterference(), InterferenceRadialParaCrystal::setProbabilityDistribution(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createRectParaCrystal()

MultiLayer * ExemplarySamples::createRectParaCrystal ( )

Definition at line 127 of file ParaCrystalBuilder.cpp.

128 {
129  Layer vacuum_layer(refMat::Vacuum);
130  Layer substrate_layer(refMat::Substrate);
131 
132  Interference2DParaCrystal iff(SquareLattice2D(10), 0, 0, 0);
133  iff.setIntegrationOverXi(true);
134  iff.setDomainSizes(20.0 * Units::micrometer, 20.0 * Units::micrometer);
135  Profile2DCauchy pdf1(0.5, 2.0, 0);
136  Profile2DCauchy pdf2(0.5, 2.0, 0);
137  iff.setProbabilityDistributions(pdf1, pdf2);
138 
139  Cylinder ff_cylinder(5.0, 5.0);
140 
141  Particle particle(refMat::Particle, ff_cylinder);
142  ParticleLayout particle_layout(particle);
143  particle_layout.setInterference(iff);
144 
145  vacuum_layer.addLayout(particle_layout);
146 
147  auto* sample = new MultiLayer();
148  sample->addLayer(vacuum_layer);
149  sample->addLayer(substrate_layer);
150  return sample;
151 }

References Layer::addLayout(), Units::micrometer, refMat::Particle, Interference2DParaCrystal::setDomainSizes(), Interference2DParaCrystal::setIntegrationOverXi(), ParticleLayout::setInterference(), Interference2DParaCrystal::setProbabilityDistributions(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createResonator()

MultiLayer * ExemplarySamples::createResonator ( double  ti_thickness = 13.0)

Definition at line 23 of file ResonatorBuilder.cpp.

24 {
25  auto* result = new MultiLayer;
26 
27  Material m_Si = RefractiveMaterial("Si", 8.25218379931e-06, 0.0);
28  Material m_Ti = RefractiveMaterial("Ti", -7.6593316363e-06, 3.81961616312e-09);
29  Material m_TiO2 = RefractiveMaterial("TiO2", 1.04803530026e-05, 2.03233519385e-09);
30  Material m_Pt = RefractiveMaterial("Pt", 2.52936993309e-05, 7.54553992473e-09);
31  Material m_D2O = RefractiveMaterial("D2O", 2.52897204573e-05, 4.5224432814e-13);
32 
33  Layer l_TiO2(m_TiO2, 3.0);
34  Layer l_Ti_top(m_Ti, 10.0);
35  Layer l_Ti(m_Ti, ti_thickness);
36  Layer l_Si(m_Si);
37  Layer l_Pt(m_Pt, 32.0);
38  Layer l_D2O(m_D2O);
39 
40  LayerRoughness roughness(2.0, 0.8, 1e4);
41 
42  result->addLayer(l_Si);
43 
44  const int nlayers = 3;
45  for (size_t i = 0; i < nlayers; ++i) {
46  result->addLayerWithTopRoughness(l_Ti, roughness);
47  result->addLayerWithTopRoughness(l_Pt, roughness);
48  }
49 
50  result->addLayerWithTopRoughness(l_Ti_top, roughness);
51  result->addLayerWithTopRoughness(l_TiO2, roughness);
52  result->addLayerWithTopRoughness(l_D2O, roughness);
53 
54  result->setCrossCorrLength(400);
55 
56  return result;
57 }

References RefractiveMaterial().

Here is the call graph for this function:

◆ createRotatedPyramids()

MultiLayer * ExemplarySamples::createRotatedPyramids ( )

Definition at line 27 of file RotatedPyramidsBuilder.cpp.

28 {
29  const double m_length(10);
30  const double m_height(5);
31  const double m_alpha(Units::deg2rad(54.73));
32  const double m_zangle(45. * deg);
33 
34  Layer vacuum_layer(refMat::Vacuum);
35  Layer substrate_layer(refMat::Substrate);
36 
37  Pyramid4 ff_pyramid(m_length, m_height, m_alpha);
38 
39  Particle pyramid(refMat::Particle, ff_pyramid);
40 
41  RotationZ z_rotation(m_zangle);
42  pyramid.rotate(z_rotation);
43 
44  ParticleLayout particle_layout;
45  particle_layout.addParticle(pyramid);
46 
47  vacuum_layer.addLayout(particle_layout);
48 
49  auto* sample = new MultiLayer();
50  sample->addLayer(vacuum_layer);
51  sample->addLayer(substrate_layer);
52  return sample;
53 }
A frustum with a quadratic base.
Definition: Pyramid4.h:23
double deg2rad(double angle)
Definition: Units.h:58

References Layer::addLayout(), ParticleLayout::addParticle(), Units::deg, Units::deg2rad(), refMat::Particle, IParticle::rotate(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createRotatedPyramidsDistribution()

MultiLayer * ExemplarySamples::createRotatedPyramidsDistribution ( )

Definition at line 129 of file ParticleDistributionsBuilder.cpp.

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 }

◆ createRotatedSquareLattice2D()

MultiLayer * ExemplarySamples::createRotatedSquareLattice2D ( )

Definition at line 121 of file TwoDimLatticeBuilder.cpp.

122 {
123  Layer vacuum_layer(refMat::Vacuum);
124  Layer substrate_layer(refMat::Substrate);
125 
126  Interference2DLattice iff(SquareLattice2D(10.0, 30.0 * deg));
127  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 30.0 * deg);
128  iff.setDecayFunction(pdf);
129 
130  ParticleLayout particle_layout;
131  // particle
132  Cylinder ff_cyl(5.0, 5.0);
133  R3 position(0.0, 0.0, 0.0);
134  Particle p(refMat::Particle, ff_cyl);
135  p.setParticlePosition(position);
136  particle_layout.addParticle(p);
137  particle_layout.setInterference(iff);
138 
139  vacuum_layer.addLayout(particle_layout);
140 
141  auto* sample = new MultiLayer();
142  sample->addLayer(vacuum_layer);
143  sample->addLayer(substrate_layer);
144  return sample;
145 }

References Layer::addLayout(), ParticleLayout::addParticle(), Units::deg, M_PI, refMat::Particle, Interference2DLattice::setDecayFunction(), ParticleLayout::setInterference(), IParticle::setParticlePosition(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createSimpleMagneticLayer()

MultiLayer * ExemplarySamples::createSimpleMagneticLayer ( )

Definition at line 71 of file MagneticLayersBuilder.cpp.

72 {
73  auto* sample = new MultiLayer();
74 
75  R3 layer_field = R3(0.0, 1e8, 0.0);
76  Material vacuum_material = MaterialBySLD("Vacuum", 0.0, 0.0);
77  Material layer_material = MaterialBySLD("MagLayer", 1e-4, 1e-8, layer_field);
78  Material substrate_material = MaterialBySLD("Substrate", 7e-5, 2e-6);
79 
80  Layer vacuum_layer(vacuum_material);
81  Layer intermediate_layer(layer_material, 10.0); // 10 nm layer thickness
82  Layer substrate_layer(substrate_material);
83 
84  sample->addLayer(vacuum_layer);
85  sample->addLayer(intermediate_layer);
86  sample->addLayer(substrate_layer);
87  return sample;
88 }

References MaterialBySLD().

Here is the call graph for this function:

◆ createSimpleMagneticRotationWithRoughness()

MultiLayer * ExemplarySamples::createSimpleMagneticRotationWithRoughness ( const std::string &  roughnessKey)

Definition at line 120 of file MagneticLayersBuilder.cpp.

121 {
122  const auto& [sigmaRoughness, roughnessModel] = RoughnessCases.at(roughnessKey);
123  auto* sample = new MultiLayer();
124 
125  R3 substr_field = R3(0.0, 1e6, 0.0);
126  R3 layer_field = R3(1e6, 1e6, 0.0);
127  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
128  Material substrate_material = RefractiveMaterial("Substrate", 7e-6, 2e-8, substr_field);
129  Material layer_material = RefractiveMaterial("MagLayer", 6e-4, 2e-8, layer_field);
130 
131  auto roughness = LayerRoughness();
132  roughness.setSigma(sigmaRoughness * Units::angstrom);
133 
134  Layer vacuum_layer(vacuum_material);
135  Layer substrate_layer(substrate_material);
136  Layer layer(layer_material, 200 * Units::angstrom);
137  sample->addLayer(vacuum_layer);
138  sample->addLayerWithTopRoughness(layer, roughness);
139  sample->addLayerWithTopRoughness(substrate_layer, roughness);
140  sample->setRoughnessModel(roughnessModel);
141  return sample;
142 }

References Units::angstrom, and RefractiveMaterial().

Here is the call graph for this function:

◆ createSizeDistributionDAModel()

MultiLayer * ExemplarySamples::createSizeDistributionDAModel ( )

Definition at line 25 of file SizeDistributionModelsBuilder.cpp.

26 {
27  // cylindrical particle 1
28  double radius1(5);
29  double height1 = radius1;
30  Cylinder cylinder_ff1(radius1, height1);
31  Particle cylinder1(refMat::Particle, cylinder_ff1);
32 
33  // cylindrical particle 2
34  double radius2(8);
35  double height2(radius2);
36  Cylinder cylinder_ff2(radius2, height2);
37  Particle cylinder2(refMat::Particle, cylinder_ff2);
38 
39  // interference function
40  InterferenceRadialParaCrystal interference(18.0, 1e3);
41  Profile1DGauss pdf(3);
42  interference.setProbabilityDistribution(pdf);
43 
44  // assembling the sample
45  ParticleLayout particle_layout;
46  particle_layout.addParticle(cylinder1, 0.8);
47  particle_layout.addParticle(cylinder2, 0.2);
48  particle_layout.setInterference(interference);
49 
50  Layer vacuum_layer(refMat::Vacuum);
51  vacuum_layer.addLayout(particle_layout);
52  Layer substrate_layer(refMat::Substrate);
53 
54  auto* sample = new MultiLayer();
55  sample->addLayer(vacuum_layer);
56  sample->addLayer(substrate_layer);
57  return sample;
58 }

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, ParticleLayout::setInterference(), InterferenceRadialParaCrystal::setProbabilityDistribution(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createSizeDistributionLMAModel()

MultiLayer * ExemplarySamples::createSizeDistributionLMAModel ( )

Definition at line 62 of file SizeDistributionModelsBuilder.cpp.

63 {
64  // cylindrical particle 1
65  double radius1(5);
66  double height1 = radius1;
67  Cylinder cylinder_ff1(radius1, height1);
68  Particle cylinder1(refMat::Particle, cylinder_ff1);
69 
70  // cylindrical particle 2
71  double radius2(8);
72  double height2(radius2);
73  Cylinder cylinder_ff2(radius2, height2);
74  Particle cylinder2(refMat::Particle, cylinder_ff2);
75 
76  // interference function1
77  InterferenceRadialParaCrystal interference1(16.8, 1e3);
78  Profile1DGauss pdf(3);
79  interference1.setProbabilityDistribution(pdf);
80 
81  // interference function2
82  InterferenceRadialParaCrystal interference2(22.8, 1e3);
83  interference2.setProbabilityDistribution(pdf);
84 
85  // assembling the sample
86  ParticleLayout particle_layout1;
87  particle_layout1.addParticle(cylinder1, 0.8);
88  particle_layout1.setInterference(interference1);
89 
90  ParticleLayout particle_layout2;
91  particle_layout2.addParticle(cylinder2, 0.2);
92  particle_layout2.setInterference(interference2);
93 
94  Layer vacuum_layer(refMat::Vacuum);
95  vacuum_layer.addLayout(particle_layout1);
96  vacuum_layer.addLayout(particle_layout2);
97  Layer substrate_layer(refMat::Substrate);
98 
99  auto* sample = new MultiLayer();
100  sample->addLayer(vacuum_layer);
101  sample->addLayer(substrate_layer);
102  return sample;
103 }

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, ParticleLayout::setInterference(), InterferenceRadialParaCrystal::setProbabilityDistribution(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createSizeDistributionSSCAModel()

MultiLayer * ExemplarySamples::createSizeDistributionSSCAModel ( )

Definition at line 107 of file SizeDistributionModelsBuilder.cpp.

108 {
109  // cylindrical particle 1
110  double radius1(5);
111  double height1 = radius1;
112  Cylinder cylinder_ff1(radius1, height1);
113  Particle cylinder1(refMat::Particle, cylinder_ff1);
114 
115  // cylindrical particle 2
116  double radius2(8);
117  double height2(radius2);
118  Cylinder cylinder_ff2(radius2, height2);
119  Particle cylinder2(refMat::Particle, cylinder_ff2);
120 
121  // interference function
122  InterferenceRadialParaCrystal interference(18.0, 1e3);
123  Profile1DGauss pdf(3);
124  interference.setProbabilityDistribution(pdf);
125  interference.setKappa(1.0);
126 
127  // assembling the sample
128  ParticleLayout particle_layout;
129  particle_layout.addParticle(cylinder1, 0.8);
130  particle_layout.addParticle(cylinder2, 0.2);
131  particle_layout.setInterference(interference);
132 
133  Layer vacuum_layer(refMat::Vacuum);
134  vacuum_layer.addLayout(particle_layout);
135  Layer substrate_layer(refMat::Substrate);
136 
137  auto* sample = new MultiLayer();
138  sample->addLayer(vacuum_layer);
139  sample->addLayer(substrate_layer);
140  return sample;
141 }

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, ParticleLayout::setInterference(), InterferenceRadialParaCrystal::setKappa(), InterferenceRadialParaCrystal::setProbabilityDistribution(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createSLDSlicedCylinders()

MultiLayer * ExemplarySamples::createSLDSlicedCylinders ( )

Definition at line 70 of file SlicedCylindersBuilder.cpp.

71 {
72  Material vacuum_material = MaterialBySLD("Vacuum", 0.0, 0.0);
73  complex_t sub_sld = getSLDFromN(wavelength, 6e-6, 2e-8);
74  Material substrate_material = MaterialBySLD("Substrate", sub_sld.real(), sub_sld.imag());
75  complex_t par_sld = getSLDFromN(wavelength, 6e-4, 2e-8);
76  Material particle_material = MaterialBySLD("Particle", par_sld.real(), par_sld.imag());
77 
78  Layer vacuum_layer(vacuum_material);
79  Layer substrate_layer(substrate_material);
80 
81  Cylinder ff_cylinder(radius, height);
82 
83  Particle particle(particle_material, ff_cylinder);
84  ParticleLayout particle_layout(particle);
85 
86  vacuum_layer.addLayout(particle_layout);
87  vacuum_layer.setNumberOfSlices(n_slices);
88 
89  auto* sample = new MultiLayer();
90  sample->addLayer(vacuum_layer);
91  sample->addLayer(substrate_layer);
92  return sample;
93 }

References Layer::addLayout(), MaterialBySLD(), and Layer::setNumberOfSlices().

Here is the call graph for this function:

◆ createSlicedComposition()

MultiLayer * ExemplarySamples::createSlicedComposition ( )

Definition at line 28 of file SlicedCompositionBuilder.cpp.

29 {
30  const double sphere_radius = 10.0;
31  const double bottom_cup_height = 4.0;
32  const double composition_shift = bottom_cup_height;
33 
34  Particle topCup(refMat::Ag,
35  TruncatedSphere(sphere_radius, sphere_radius * 2 - bottom_cup_height, 0));
36  Particle bottomCup(refMat::Teflon, TruncatedSphere(sphere_radius, bottom_cup_height, 0));
37  bottomCup.setRotation(RotationX(180 * deg));
38 
39  ParticleComposition composition;
40  composition.addParticle(topCup, R3(0.0, 0.0, bottom_cup_height));
41  composition.addParticle(bottomCup, R3(0.0, 0.0, bottom_cup_height));
42  composition.setParticlePosition(0, 0, -composition_shift);
43 
44  ParticleLayout particle_layout;
45  particle_layout.addParticle(composition);
46 
47  Layer vacuum_layer(refMat::Vacuum);
48  vacuum_layer.addLayout(particle_layout);
49 
50  Layer substrate_layer(refMat::Substrate2);
51 
52  auto* sample = new MultiLayer();
53  sample->addLayer(vacuum_layer);
54  sample->addLayer(substrate_layer);
55  return sample;
56 }
A truncated Sphere.

References Layer::addLayout(), ParticleComposition::addParticle(), ParticleLayout::addParticle(), refMat::Ag, Units::deg, IParticle::setParticlePosition(), IParticle::setRotation(), refMat::Substrate2, refMat::Teflon, and refMat::Vacuum.

Here is the call graph for this function:

◆ createSlicedCylinders()

MultiLayer * ExemplarySamples::createSlicedCylinders ( )

Definition at line 47 of file SlicedCylindersBuilder.cpp.

48 {
49  Material vacuum_material = RefractiveMaterial("Vacuum", 0.0, 0.0);
50  Material substrate_material = RefractiveMaterial("Substrate", 6e-6, 2e-8);
51  Material particle_material = RefractiveMaterial("Particle", 6e-4, 2e-8);
52 
53  Layer vacuum_layer(vacuum_material);
54  Layer substrate_layer(substrate_material);
55 
56  Cylinder ff_cylinder(radius, height);
57 
58  Particle particle(particle_material, ff_cylinder);
59  ParticleLayout particle_layout(particle);
60 
61  vacuum_layer.addLayout(particle_layout);
62  vacuum_layer.setNumberOfSlices(n_slices);
63 
64  auto* sample = new MultiLayer();
65  sample->addLayer(vacuum_layer);
66  sample->addLayer(substrate_layer);
67  return sample;
68 }

References Layer::addLayout(), RefractiveMaterial(), and Layer::setNumberOfSlices().

Here is the call graph for this function:

◆ createSpheresWithLimitsDistribution()

MultiLayer * ExemplarySamples::createSpheresWithLimitsDistribution ( )

Definition at line 171 of file ParticleDistributionsBuilder.cpp.

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 }

◆ createSquareLattice2D()

MultiLayer * ExemplarySamples::createSquareLattice2D ( )

Definition at line 60 of file TwoDimLatticeBuilder.cpp.

61 {
62  Layer vacuum_layer(refMat::Vacuum);
63  Layer substrate_layer(refMat::Substrate);
64 
66  Profile2DCauchy pdf(300.0 / 2.0 / M_PI, 100.0 / 2.0 / M_PI, 0);
67  iff.setDecayFunction(pdf);
68 
69  // particles
70  ParticleLayout particle_layout;
71  Cylinder ff_cyl(5.0, 5.0);
72  Particle particle(refMat::Particle, ff_cyl);
73  particle_layout.addParticle(particle);
74 
75  particle_layout.setInterference(iff);
76 
77  vacuum_layer.addLayout(particle_layout);
78 
79  auto* sample = new MultiLayer();
80  sample->addLayer(vacuum_layer);
81  sample->addLayer(substrate_layer);
82  return sample;
83 }

References Layer::addLayout(), ParticleLayout::addParticle(), M_PI, refMat::Particle, Interference2DLattice::setDecayFunction(), ParticleLayout::setInterference(), refMat::Substrate, and refMat::Vacuum.

Here is the call graph for this function:

◆ createSuperLattice()

MultiLayer * ExemplarySamples::createSuperLattice ( )

Definition at line 177 of file TwoDimLatticeBuilder.cpp.

178 {
179  Layer vacuum_layer(refMat::Vacuum);
180  Layer substrate_layer(refMat::Substrate);
181 
182  Interference2DSuperLattice iff(SquareLattice2D(200.0, 0.0), 40, 40);
183  InterferenceFinite2DLattice substructure(SquareLattice2D(10.0, 0.0), 10, 10);
184  iff.setSubstructureIFF(substructure);
185  iff.setPositionVariance(1.0);
186 
187  // particles
188  ParticleLayout particle_layout;
189  Cylinder ff_cyl(5.0, 10.0);
190  Particle particle(refMat::Vacuum, ff_cyl);
191  particle.translate(R3(0.0, 0.0, -10.0));
192  particle_layout.addParticle(particle);
193 
194  particle_layout.setInterference(iff);
195  particle_layout.setTotalParticleSurfaceDensity(100.0 / 4e4);
196 
197  substrate_layer.addLayout(particle_layout);
198 
199  auto* sample = new MultiLayer();
200  sample->addLayer(vacuum_layer);
201  sample->addLayer(substrate_layer);
202  return sample;
203 }
Interference function of a 2D superlattice with a configurable interference function for each lattice...
void setTotalParticleSurfaceDensity(double particle_density)
Sets total particle surface density.

References Layer::addLayout(), ParticleLayout::addParticle(), ParticleLayout::setInterference(), IInterference::setPositionVariance(), Interference2DSuperLattice::setSubstructureIFF(), ParticleLayout::setTotalParticleSurfaceDensity(), refMat::Substrate, IParticle::translate(), and refMat::Vacuum.

Here is the call graph for this function:

◆ createThickAbsorptiveSample()

MultiLayer * ExemplarySamples::createThickAbsorptiveSample ( )

Definition at line 21 of file ThickAbsorptiveSampleBuilder.cpp.

22 {
23  Material vacuum_material = MaterialBySLD("Vacuum", 0.0, 0.0);
24  Material au_material = MaterialBySLD("Au", 3.48388057043e-05, 1.79057609656e-05);
25  Material si_material = MaterialBySLD("Si", 3.84197565094e-07, 6.28211531498e-07);
26 
27  Layer vacuum_layer(vacuum_material);
28  Layer au_layer(au_material, 200.0);
29  Layer vacuum_layer_2(vacuum_material, 10.0);
30  Layer substrate_layer(si_material);
31 
32  LayerRoughness rough(5.0, 0.5, 10.0);
33 
34  auto* sample = new MultiLayer();
35  sample->addLayer(vacuum_layer);
36  sample->addLayer(au_layer);
37  sample->addLayer(vacuum_layer_2);
38  sample->addLayerWithTopRoughness(substrate_layer, rough);
39  return sample;
40 }

References MaterialBySLD().

Here is the call graph for this function:

◆ createTransformBox()

MultiLayer * ExemplarySamples::createTransformBox ( )

Definition at line 27 of file TransformationsBuilder.cpp.

28 {
29  const double layer_thickness(100);
30  const double length(50);
31  const double width(20);
32  const double height(10);
33 
34  Particle box(refMat::Ag, Box(length, width, height));
35  box.setRotation(RotationZ(90. * deg));
36  box.rotate(RotationY(90. * deg));
37  box.setParticlePosition(R3(0, 0, -layer_thickness / 2.));
38 
39  ParticleLayout layout;
40  layout.addParticle(box);
41 
42  Layer vacuum_layer(refMat::Vacuum);
43  Layer middle_layer(refMat::Teflon, layer_thickness);
44  middle_layer.addLayout(layout);
45  Layer substrate(refMat::Substrate2);
46 
47  auto* sample = new MultiLayer();
48  sample->addLayer(vacuum_layer);
49  sample->addLayer(middle_layer);
50  sample->addLayer(substrate);
51  return sample;
52 }

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Ag, Units::deg, IParticle::rotate(), IParticle::setParticlePosition(), IParticle::setRotation(), refMat::Substrate2, refMat::Teflon, and refMat::Vacuum.

Here is the call graph for this function:

◆ createTriangularRipple()

MultiLayer * ExemplarySamples::createTriangularRipple ( double  d = 0)

Definition at line 49 of file RipplesBuilder.cpp.

50 {
51  Layer vacuum_layer(refMat::Vacuum);
52  SawtoothRippleBox ff_ripple2(100.0, 20.0, 4.0, d);
53  Particle ripple(refMat::Particle, ff_ripple2);
54 
55  ParticleLayout particle_layout;
56  particle_layout.addParticle(ripple, 1.0);
57  InterferenceRadialParaCrystal interparticle(20.0, 1e7);
58  Profile1DGauss pdf(4.0);
59  interparticle.setProbabilityDistribution(pdf);
60  particle_layout.setInterference(interparticle);
61 
62  vacuum_layer.addLayout(particle_layout);
63  Layer substrate_layer(refMat::Substrate);
64 
65  auto* sample = new MultiLayer();
66  sample->addLayer(vacuum_layer);
67  sample->addLayer(substrate_layer);
68  return sample;
69 }
The form factor for a cosine ripple, with box profile in elongation direction.

References Layer::addLayout(), ParticleLayout::addParticle(), refMat::Particle, ParticleLayout::setInterference(), InterferenceRadialParaCrystal::setProbabilityDistribution(), refMat::Substrate, and refMat::Vacuum.

Referenced by createAsymRipple().

Here is the call graph for this function:

◆ createTwoTypesCylindersDistribution()

MultiLayer * ExemplarySamples::createTwoTypesCylindersDistribution ( )

Definition at line 70 of file ParticleDistributionsBuilder.cpp.

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 }