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

Description

Decorator class that adds particles to ISampleNode objects.

Definition at line 28 of file ParticleLayout.h.

Inheritance diagram for ParticleLayout:
[legend]
Collaboration diagram for ParticleLayout:
[legend]

Public Member Functions

 ParticleLayout ()
 
 ParticleLayout (const IParticle &particle, double abundance=-1.0)
 
 ~ParticleLayout () override
 
void addParticle (const IParticle &particle, double abundance=-1.0)
 Adds particle to the layout with abundance, position and the rotation defined. More...
 
void checkNodeArgs () const
 Raises exception if a parameter value is invalid. More...
 
std::string className () const final
 Returns the class name, to be hard-coded in each leaf class that inherits from INode. More...
 
ParticleLayoutclone () const override
 Returns a clone of this ISampleNode object. More...
 
std::vector< const Material * > containedMaterials () const
 Returns set of unique materials contained in this ISampleNode. More...
 
const IInterferenceinterferenceFunction () const
 
bool isMagnetic () const
 Returns true if there is any magnetic material in this ISampleNode. More...
 
virtual const Materialmaterial () const
 Returns nullptr, unless overwritten to return a specific material. More...
 
std::vector< const INode * > nodeChildren () const override
 Returns all children. More...
 
std::vector< const INode * > nodeOffspring () const
 Returns all descendants. More...
 
std::vector< ParaMetaparDefs () const final
 Returns the parameter definitions, to be hard-coded in each leaf class. More...
 
std::vector< const IParticle * > particles () const
 
void setInterference (const IInterference &interparticle)
 Adds interference functions. More...
 
void setTotalParticleSurfaceDensity (double particle_density)
 Sets total particle surface density. More...
 
void setWeight (double weight)
 Sets the relative weight of this layout. More...
 
double totalAbundance () const
 
double totalParticleSurfaceDensity () const
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 
double weight () const
 Returns the relative weight of this layout. More...
 
double weightedParticleSurfaceDensity () const
 

Protected Attributes

std::vector< double > m_P
 

Private Member Functions

void addAndRegisterAbstractParticle (IParticle *child)
 Adds particle information with simultaneous registration in parent class. More...
 
void setAndRegisterInterference (IInterference *child)
 Sets interference function with simultaneous registration in parent class. More...
 

Private Attributes

std::unique_ptr< IInterferencem_interparticle
 
OwningVector< IParticlem_particles
 Vector of particle types. More...
 
double m_total_particle_density {.01}
 
double m_weight {1}
 

Constructor & Destructor Documentation

◆ ParticleLayout() [1/2]

ParticleLayout::ParticleLayout ( )
default

Referenced by clone().

◆ ParticleLayout() [2/2]

ParticleLayout::ParticleLayout ( const IParticle particle,
double  abundance = -1.0 
)

Definition at line 21 of file ParticleLayout.cpp.

22 {
23  addParticle(particle, abundance);
24 }
void addParticle(const IParticle &particle, double abundance=-1.0)
Adds particle to the layout with abundance, position and the rotation defined.

References addParticle().

Here is the call graph for this function:

◆ ~ParticleLayout()

ParticleLayout::~ParticleLayout ( )
overridedefault

Member Function Documentation

◆ addAndRegisterAbstractParticle()

void ParticleLayout::addAndRegisterAbstractParticle ( IParticle child)
private

Adds particle information with simultaneous registration in parent class.

Definition at line 110 of file ParticleLayout.cpp.

111 {
112  m_particles.emplace_back(child);
113 }
void emplace_back(T *e)
Definition: OwningVector.h:62
OwningVector< IParticle > m_particles
Vector of particle types.

References OwningVector< T >::emplace_back(), and m_particles.

Referenced by addParticle().

Here is the call graph for this function:

◆ addParticle()

void ParticleLayout::addParticle ( const IParticle particle,
double  abundance = -1.0 
)

Adds particle to the layout with abundance, position and the rotation defined.

Parameters
particleto be added
abundanceParticle abundance

Definition at line 56 of file ParticleLayout.cpp.

57 {
58  IParticle* particle_clone = particle.clone();
59  if (abundance >= 0.0)
60  particle_clone->setAbundance(abundance);
61  addAndRegisterAbstractParticle(particle_clone);
62 }
Abstract base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal....
Definition: IParticle.h:31
void setAbundance(double abundance)
Sets particle abundance.
Definition: IParticle.h:43
IParticle * clone() const override=0
Returns a clone of this ISampleNode object.
void addAndRegisterAbstractParticle(IParticle *child)
Adds particle information with simultaneous registration in parent class.

References addAndRegisterAbstractParticle(), IParticle::clone(), and IParticle::setAbundance().

Referenced by ParticleLayout(), ExemplarySamples::createBasic2DLattice(), ExemplarySamples::createBoxesSquareLattice2D(), ExemplarySamples::createCenteredSquareLattice2D(), ExemplarySamples::createCoreShellBoxRotateZandY(), ExemplarySamples::createCosineRipple(), ExemplarySamples::createCustomMorphology(), ExemplarySamples::createCylindersAndPrisms(), ExemplarySamples::createFiniteSquareLattice2D(), ExemplarySamples::createLayersWithAbsorptionBySLD(), ExemplarySamples::createLayersWithAbsorptionWithFF(), ExemplarySamples::createMagneticLayer(), ExemplarySamples::createMagneticRotation(), ExemplarySamples::createMagneticSpheres(), ExemplarySamples::createMagneticSubstrateZeroField(), ExemplarySamples::createMesoCrystal(), ExemplarySamples::createMultipleLayout(), ExemplarySamples::createParticleComposition(), ExemplarySamples::createRotatedPyramids(), ExemplarySamples::createRotatedSquareLattice2D(), ExemplarySamples::createSizeDistributionDAModel(), ExemplarySamples::createSizeDistributionLMAModel(), ExemplarySamples::createSizeDistributionSSCAModel(), ExemplarySamples::createSlicedComposition(), ExemplarySamples::createSquareLattice2D(), ExemplarySamples::createSuperLattice(), ExemplarySamples::createTransformBox(), and ExemplarySamples::createTriangularRipple().

Here is the call graph for this function:

◆ checkNodeArgs()

void INode::checkNodeArgs ( ) const
inherited

Raises exception if a parameter value is invalid.

Definition at line 27 of file INode.cpp.

28 {
29  size_t nP = m_P.size();
30  if (parDefs().size() != nP) {
31  std::cerr << "BUG in class " << className() << std::endl;
32  std::cerr << "#m_P = " << nP << std::endl;
33  std::cerr << "#PDf = " << parDefs().size() << std::endl;
34  for (const ParaMeta& pm : parDefs())
35  std::cerr << " PDf: " << pm.name << std::endl;
36  ASSERT(0);
37  }
38  ASSERT(parDefs().size() == nP);
39  for (size_t i = 0; i < nP; ++i) {
40  const ParaMeta pm = parDefs()[i];
41 
43  if (pm.vMin == -INF) {
44  ASSERT(pm.vMax == +INF);
45  // nothing to do
46  } else if (pm.vMax == +INF) {
47  ASSERT(pm.vMin == 0);
48  limits = RealLimits::nonnegative();
49  } else {
50  limits = RealLimits::limited(pm.vMin, pm.vMax);
51  }
52  limits.check(pm.name, m_P[i]);
53  }
54 }
#define ASSERT(condition)
Definition: Assert.h:45
const double INF
Definition: INode.h:26
virtual std::vector< ParaMeta > parDefs() const
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: INode.h:51
std::vector< double > m_P
Definition: INode.h:63
virtual std::string className() const =0
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Limits for a real fit parameter.
Definition: RealLimits.h:24
static RealLimits limitless()
Creates an object without bounds (default)
Definition: RealLimits.cpp:139
void check(const std::string &name, double value) const
Throws if value is outside limits. Parameter 'name' is for exception message.
Definition: RealLimits.cpp:170
static RealLimits nonnegative()
Creates an object which can have only positive values with 0. included.
Definition: RealLimits.cpp:124
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:134
Metadata of one model parameter.
Definition: INode.h:29
double vMin
Definition: INode.h:33
double vMax
Definition: INode.h:34
std::string name
Definition: INode.h:30

References ASSERT, RealLimits::check(), INode::className(), INF, RealLimits::limited(), RealLimits::limitless(), INode::m_P, ParaMeta::name, RealLimits::nonnegative(), INode::parDefs(), ParaMeta::vMax, and ParaMeta::vMin.

Referenced by BarGauss::BarGauss(), BarLorentz::BarLorentz(), Bipyramid4::Bipyramid4(), Box::Box(), CantellatedCube::CantellatedCube(), Cone::Cone(), ConstantBackground::ConstantBackground(), CosineRippleBox::CosineRippleBox(), CosineRippleGauss::CosineRippleGauss(), CosineRippleLorentz::CosineRippleLorentz(), Cylinder::Cylinder(), DistributionCosine::DistributionCosine(), DistributionGate::DistributionGate(), DistributionGaussian::DistributionGaussian(), DistributionLogNormal::DistributionLogNormal(), DistributionLorentz::DistributionLorentz(), DistributionTrapezoid::DistributionTrapezoid(), Dodecahedron::Dodecahedron(), EllipsoidalCylinder::EllipsoidalCylinder(), FootprintGauss::FootprintGauss(), FootprintSquare::FootprintSquare(), FuzzySphere::FuzzySphere(), GaussSphere::GaussSphere(), HemiEllipsoid::HemiEllipsoid(), HollowSphere::HollowSphere(), HorizontalCylinder::HorizontalCylinder(), Icosahedron::Icosahedron(), LongBoxGauss::LongBoxGauss(), LongBoxLorentz::LongBoxLorentz(), PlatonicOctahedron::PlatonicOctahedron(), PlatonicTetrahedron::PlatonicTetrahedron(), Prism3::Prism3(), Prism6::Prism6(), Profile1DCauchy::Profile1DCauchy(), Profile1DCosine::Profile1DCosine(), Profile1DGate::Profile1DGate(), Profile1DGauss::Profile1DGauss(), Profile1DTriangle::Profile1DTriangle(), Profile1DVoigt::Profile1DVoigt(), Profile2DCauchy::Profile2DCauchy(), Profile2DCone::Profile2DCone(), Profile2DGate::Profile2DGate(), Profile2DGauss::Profile2DGauss(), Profile2DVoigt::Profile2DVoigt(), Pyramid2::Pyramid2(), Pyramid3::Pyramid3(), Pyramid4::Pyramid4(), Pyramid6::Pyramid6(), RotationEuler::RotationEuler(), RotationX::RotationX(), RotationY::RotationY(), RotationZ::RotationZ(), SawtoothRippleBox::SawtoothRippleBox(), SawtoothRippleGauss::SawtoothRippleGauss(), SawtoothRippleLorentz::SawtoothRippleLorentz(), Sphere::Sphere(), Spheroid::Spheroid(), TruncatedCube::TruncatedCube(), TruncatedSphere::TruncatedSphere(), and TruncatedSpheroid::TruncatedSpheroid().

Here is the call graph for this function:

◆ className()

std::string ParticleLayout::className ( ) const
inlinefinalvirtual

Returns the class name, to be hard-coded in each leaf class that inherits from INode.

Implements INode.

Definition at line 35 of file ParticleLayout.h.

35 { return "ParticleLayout"; }

◆ clone()

ParticleLayout * ParticleLayout::clone ( ) const
overridevirtual

Returns a clone of this ISampleNode object.

Implements ISampleNode.

Definition at line 28 of file ParticleLayout.cpp.

29 {
30  auto* result = new ParticleLayout();
31 
32  for (const IParticle* const particle : m_particles)
33  result->addAndRegisterAbstractParticle(particle->clone());
34 
35  if (m_interparticle)
36  result->setAndRegisterInterference(m_interparticle->clone());
37 
38  result->setTotalParticleSurfaceDensity(totalParticleSurfaceDensity());
39  result->setWeight(weight());
40 
41  return result;
42 }
double weight() const
Returns the relative weight of this layout.
std::unique_ptr< IInterference > m_interparticle
double totalParticleSurfaceDensity() const

References ParticleLayout(), m_interparticle, m_particles, totalParticleSurfaceDensity(), and weight().

Referenced by Layer::addLayout().

Here is the call graph for this function:

◆ containedMaterials()

std::vector< const Material * > ISampleNode::containedMaterials ( ) const
inherited

Returns set of unique materials contained in this ISampleNode.

Definition at line 25 of file ISampleNode.cpp.

26 {
27  std::vector<const Material*> result;
28  if (const Material* p_material = material())
29  result.push_back(p_material);
30  for (const auto* child : nodeChildren()) {
31  if (const auto* sample = dynamic_cast<const ISampleNode*>(child)) {
32  for (const Material* p_material : sample->containedMaterials())
33  result.push_back(p_material);
34  }
35  }
36  return result;
37 }
virtual std::vector< const INode * > nodeChildren() const
Returns all children.
Definition: INode.cpp:56
Abstract base class for sample components and properties related to scattering.
Definition: ISampleNode.h:27
virtual const Material * material() const
Returns nullptr, unless overwritten to return a specific material.
Definition: ISampleNode.h:36
A wrapper for underlying material implementation.
Definition: Material.h:35

References ISampleNode::material(), and INode::nodeChildren().

Referenced by SampleUtils::Multilayer::ContainsCompatibleMaterials(), SampleToPython::initLabels(), and ISampleNode::isMagnetic().

Here is the call graph for this function:

◆ interferenceFunction()

const IInterference * ParticleLayout::interferenceFunction ( ) const

Definition at line 72 of file ParticleLayout.cpp.

73 {
74  return m_interparticle.get();
75 }

References m_interparticle.

◆ isMagnetic()

bool ISampleNode::isMagnetic ( ) const
inherited

Returns true if there is any magnetic material in this ISampleNode.

Definition at line 39 of file ISampleNode.cpp.

40 {
41  const auto materials = containedMaterials();
42  return std::any_of(materials.cbegin(), materials.cend(),
43  [](const Material* mat) { return mat->isMagneticMaterial(); });
44 }
std::vector< const Material * > containedMaterials() const
Returns set of unique materials contained in this ISampleNode.
Definition: ISampleNode.cpp:25

References ISampleNode::containedMaterials().

Referenced by reSample::make().

Here is the call graph for this function:

◆ material()

virtual const Material* ISampleNode::material ( ) const
inlinevirtualinherited

Returns nullptr, unless overwritten to return a specific material.

Reimplemented in Particle, and Layer.

Definition at line 36 of file ISampleNode.h.

36 { return nullptr; }

Referenced by ISampleNode::containedMaterials().

◆ nodeChildren()

std::vector< const INode * > ParticleLayout::nodeChildren ( ) const
overridevirtual

Returns all children.

Reimplemented from INode.

Definition at line 44 of file ParticleLayout.cpp.

45 {
46  std::vector<const INode*> result;
47  for (const IParticle* p : m_particles)
48  result.emplace_back(p);
49  result << m_interparticle;
50  return result;
51 }

References m_interparticle, and m_particles.

◆ nodeOffspring()

std::vector< const INode * > INode::nodeOffspring ( ) const
inherited

Returns all descendants.

Definition at line 61 of file INode.cpp.

62 {
63  std::vector<const INode*> result;
64  result.push_back(this);
65  for (const auto* child : nodeChildren()) {
66  for (const auto* p : child->nodeOffspring())
67  result.push_back(p);
68  }
69  return result;
70 }

References INode::nodeChildren().

Here is the call graph for this function:

◆ parDefs()

std::vector<ParaMeta> ParticleLayout::parDefs ( ) const
inlinefinalvirtual

Returns the parameter definitions, to be hard-coded in each leaf class.

Reimplemented from INode.

Definition at line 36 of file ParticleLayout.h.

37  {
38  return {{"Abundance", "", "e.g. surface fraction covered by this layout", 0, +INF, -1}};
39  }

References INF.

◆ particles()

std::vector< const IParticle * > ParticleLayout::particles ( ) const

Definition at line 64 of file ParticleLayout.cpp.

65 {
66  std::vector<const IParticle*> result;
67  for (const IParticle* p : m_particles)
68  result.emplace_back(p);
69  return result;
70 }

References m_particles.

◆ setAndRegisterInterference()

void ParticleLayout::setAndRegisterInterference ( IInterference child)
private

Sets interference function with simultaneous registration in parent class.

Definition at line 116 of file ParticleLayout.cpp.

117 {
118  m_interparticle.reset(child);
119 }

References m_interparticle.

Referenced by setInterference().

◆ setInterference()

void ParticleLayout::setInterference ( const IInterference interparticle)

Adds interference functions.

Definition at line 86 of file ParticleLayout.cpp.

87 {
88  setAndRegisterInterference(interparticle.clone());
89 }
IInterference * clone() const override=0
void setAndRegisterInterference(IInterference *child)
Sets interference function with simultaneous registration in parent class.

References IInterference::clone(), and setAndRegisterInterference().

Referenced by ExemplarySamples::createBasic2DLattice(), ExemplarySamples::createBasic2DParaCrystalWithFTDis(), ExemplarySamples::createBoxesSquareLattice2D(), ExemplarySamples::createCenteredSquareLattice2D(), ExemplarySamples::createCosineRipple(), ExemplarySamples::createFiniteSquareLattice2D(), ExemplarySamples::createHardDisk(), ExemplarySamples::createHexParaCrystal(), ExemplarySamples::createLattice1D(), ExemplarySamples::createParticleComposition(), ExemplarySamples::createRadialParaCrystal(), ExemplarySamples::createRectParaCrystal(), ExemplarySamples::createRotatedSquareLattice2D(), ExemplarySamples::createSizeDistributionDAModel(), ExemplarySamples::createSizeDistributionLMAModel(), ExemplarySamples::createSizeDistributionSSCAModel(), ExemplarySamples::createSquareLattice2D(), ExemplarySamples::createSuperLattice(), and ExemplarySamples::createTriangularRipple().

Here is the call graph for this function:

◆ setTotalParticleSurfaceDensity()

void ParticleLayout::setTotalParticleSurfaceDensity ( double  particle_density)

Sets total particle surface density.

Parameters
particle_densitynumber of particles per square nanometer

Definition at line 104 of file ParticleLayout.cpp.

105 {
106  m_total_particle_density = particle_density;
107 }
double m_total_particle_density

References m_total_particle_density.

Referenced by ExemplarySamples::createSuperLattice().

◆ setWeight()

void ParticleLayout::setWeight ( double  weight)
inline

Sets the relative weight of this layout.

Definition at line 59 of file ParticleLayout.h.

59 { m_weight = weight; }

References m_weight, and weight().

Here is the call graph for this function:

◆ totalAbundance()

double ParticleLayout::totalAbundance ( ) const

Definition at line 77 of file ParticleLayout.cpp.

78 {
79  double result = 0.0;
80  for (const auto& particle : m_particles)
81  result += particle->abundance();
82  return result;
83 }

References m_particles.

◆ totalParticleSurfaceDensity()

double ParticleLayout::totalParticleSurfaceDensity ( ) const

Definition at line 91 of file ParticleLayout.cpp.

92 {
93  double iff_density = m_interparticle ? m_interparticle->particleDensity() : 0.0;
94  return iff_density > 0.0 ? iff_density : m_total_particle_density;
95 }

References m_interparticle, and m_total_particle_density.

Referenced by clone(), ExemplarySamples::createAveragedSlicedCylinders(), and weightedParticleSurfaceDensity().

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

Used for Python overriding of clone (see swig/tweaks.py)

Definition at line 32 of file ICloneable.h.

◆ weight()

double ParticleLayout::weight ( ) const
inline

Returns the relative weight of this layout.

Definition at line 56 of file ParticleLayout.h.

56 { return m_weight; }

References m_weight.

Referenced by clone(), setWeight(), and weightedParticleSurfaceDensity().

◆ weightedParticleSurfaceDensity()

double ParticleLayout::weightedParticleSurfaceDensity ( ) const

Definition at line 97 of file ParticleLayout.cpp.

98 {
100 }

References totalParticleSurfaceDensity(), and weight().

Here is the call graph for this function:

Member Data Documentation

◆ m_interparticle

std::unique_ptr<IInterference> ParticleLayout::m_interparticle
private

◆ m_P

◆ m_particles

OwningVector<IParticle> ParticleLayout::m_particles
private

Vector of particle types.

Definition at line 69 of file ParticleLayout.h.

Referenced by addAndRegisterAbstractParticle(), clone(), nodeChildren(), particles(), and totalAbundance().

◆ m_total_particle_density

double ParticleLayout::m_total_particle_density {.01}
private

Definition at line 68 of file ParticleLayout.h.

Referenced by setTotalParticleSurfaceDensity(), and totalParticleSurfaceDensity().

◆ m_weight

double ParticleLayout::m_weight {1}
private

Definition at line 67 of file ParticleLayout.h.

Referenced by setWeight(), and weight().


The documentation for this class was generated from the following files: