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

Description

A crystal structure, defined by a Bravais lattice, a basis, and a position variance.

Computations are delegated to class ReMesocrystal.

Used in MesoCrystal, where it is given an outer shape.

Definition at line 34 of file Crystal.h.

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

Public Member Functions

 Crystal (const IParticle &basis, const Lattice3D &lattice, double position_variance=0)
 
 ~Crystal () override
 
const IParticlebasis () const
 
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...
 
Crystalclone () 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...
 
bool isMagnetic () const
 Returns true if there is any magnetic material in this ISampleNode. More...
 
const Lattice3Dlattice () const
 
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...
 
double position_variance () const
 
virtual void transferToCPP ()
 Used for Python overriding of clone (see swig/tweaks.py) More...
 
Crystaltransformed (const IRotation *rotation, const R3 &translation) const
 

Protected Attributes

std::vector< double > m_P
 

Private Member Functions

 Crystal (IParticle *basis, const Lattice3D &lattice, double position_variance=0)
 

Private Attributes

std::unique_ptr< IParticlem_basis
 
std::unique_ptr< Lattice3Dm_lattice
 
const double m_position_variance
 

Constructor & Destructor Documentation

◆ Crystal() [1/2]

Crystal::Crystal ( const IParticle basis,
const Lattice3D lattice,
double  position_variance = 0 
)

Definition at line 22 of file Crystal.cpp.

24 {
25 }
Crystal(const IParticle &basis, const Lattice3D &lattice, double position_variance=0)
Definition: Crystal.cpp:22
const IParticle * basis() const
Definition: Crystal.h:47
double position_variance() const
Definition: Crystal.h:49
const Lattice3D * lattice() const
Definition: Crystal.h:48
IParticle * clone() const override=0
Returns a clone of this ISampleNode object.

Referenced by clone(), and transformed().

◆ ~Crystal()

Crystal::~Crystal ( )
overridedefault

◆ Crystal() [2/2]

Crystal::Crystal ( IParticle basis,
const Lattice3D lattice,
double  position_variance = 0 
)
private

Definition at line 27 of file Crystal.cpp.

28  : m_basis(basis)
29  , m_lattice(std::make_unique<Lattice3D>(lattice))
31 {
32 }
std::unique_ptr< Lattice3D > m_lattice
Definition: Crystal.h:57
std::unique_ptr< IParticle > m_basis
Definition: Crystal.h:56
const double m_position_variance
Definition: Crystal.h:58

Member Function Documentation

◆ basis()

const IParticle* Crystal::basis ( ) const
inline

Definition at line 47 of file Crystal.h.

47 { return m_basis.get(); }

References m_basis.

Referenced by Compute::Slicing::createParticleInSlice().

◆ 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 Crystal::className ( ) const
inlinefinalvirtual

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

Implements INode.

Definition at line 40 of file Crystal.h.

40 { return "Crystal"; }

◆ clone()

Crystal * Crystal::clone ( ) const
overridevirtual

Returns a clone of this ISampleNode object.

Implements ISampleNode.

Definition at line 36 of file Crystal.cpp.

37 {
39 }

References Crystal(), m_basis, m_lattice, and m_position_variance.

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:

◆ 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:

◆ lattice()

const Lattice3D* Crystal::lattice ( ) const
inline

Definition at line 48 of file Crystal.h.

48 { return m_lattice.get(); }

References m_lattice.

Referenced by Compute::Slicing::createParticleInSlice().

◆ 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 * > Crystal::nodeChildren ( ) const
overridevirtual

Returns all children.

Reimplemented from INode.

Definition at line 41 of file Crystal.cpp.

42 {
43  return std::vector<const INode*>() << m_basis << m_lattice;
44 }

References m_basis, and m_lattice.

◆ 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> Crystal::parDefs ( ) const
inlinefinalvirtual

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

Reimplemented from INode.

Definition at line 42 of file Crystal.h.

43  {
44  return {{"Variance", "nm?", "position variance", 0, +INF, 0}};
45  }

References INF.

◆ position_variance()

double Crystal::position_variance ( ) const
inline

Definition at line 49 of file Crystal.h.

49 { return m_position_variance; }

References m_position_variance.

◆ transferToCPP()

virtual void ICloneable::transferToCPP ( )
inlinevirtualinherited

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

Definition at line 32 of file ICloneable.h.

◆ transformed()

Crystal * Crystal::transformed ( const IRotation rotation,
const R3 &  translation 
) const

Definition at line 46 of file Crystal.cpp.

47 {
48  const Lattice3D new_lattice = rotation ? m_lattice->rotated(rotation->rotMatrix()) : *m_lattice;
49  IParticle* new_basis{m_basis->clone()};
50  if (rotation)
51  new_basis->rotate(*rotation);
52  new_basis->translate(translation);
53  return new Crystal(new_basis, new_lattice, m_position_variance);
54 }
Abstract base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal....
Definition: IParticle.h:31
virtual RotMatrix rotMatrix() const =0
Returns transformation.
A Bravais lattice, characterized by three basis vectors, and optionally an ISelectionRule.
Definition: Lattice3D.h:30

References Crystal(), m_basis, m_lattice, m_position_variance, and IRotation::rotMatrix().

Referenced by Compute::Slicing::createParticleInSlice().

Here is the call graph for this function:

Member Data Documentation

◆ m_basis

std::unique_ptr<IParticle> Crystal::m_basis
private

Definition at line 56 of file Crystal.h.

Referenced by basis(), clone(), nodeChildren(), and transformed().

◆ m_lattice

std::unique_ptr<Lattice3D> Crystal::m_lattice
private

Definition at line 57 of file Crystal.h.

Referenced by clone(), lattice(), nodeChildren(), and transformed().

◆ m_P

◆ m_position_variance

const double Crystal::m_position_variance
private

Definition at line 58 of file Crystal.h.

Referenced by clone(), position_variance(), and transformed().


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