BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
Particle.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Sample/Particle/Particle.cpp
6 //! @brief Implements class Particle.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************** //
14 
19 
21 {
22  initialize();
23 }
24 
25 Particle::Particle(Material material) : m_material(std::move(material))
26 {
27  initialize();
28 }
29 
30 Particle::Particle(Material material, const IFormFactor& form_factor)
31  : m_material(std::move(material)), mP_form_factor(form_factor.clone())
32 {
33  initialize();
35 }
36 
37 Particle::Particle(Material material, const IFormFactor& form_factor, const IRotation& rotation)
38  : m_material(std::move(material)), mP_form_factor(form_factor.clone())
39 {
40  initialize();
43 }
44 
46 {
47  Particle* p_result = new Particle(m_material);
48  p_result->setAbundance(m_abundance);
49  if (mP_form_factor)
50  p_result->setFormFactor(*mP_form_factor);
51  if (mP_rotation)
52  p_result->setRotation(*mP_rotation);
53  p_result->setPosition(m_position);
54 
55  return p_result;
56 }
57 
59 {
60  if (!mP_form_factor)
61  return {};
62  std::unique_ptr<IRotation> P_rotation(IRotation::createIdentity());
63  if (mP_rotation)
64  P_rotation.reset(mP_rotation->clone());
65  std::unique_ptr<IFormFactor> P_temp_ff(
66  mP_form_factor->createSlicedFormFactor(limits, *P_rotation, m_position));
67  if (!P_temp_ff)
68  return {};
69  std::unique_ptr<FormFactorDecoratorMaterial> P_ff(new FormFactorDecoratorMaterial(*P_temp_ff));
70  double volume = P_temp_ff->volume();
71  Material transformed_material(m_material.rotatedMaterial(P_rotation->getTransform3D()));
72  P_ff->setMaterial(transformed_material);
73  SlicedParticle result;
74  result.m_regions.push_back({volume, transformed_material});
75  result.mP_slicedff = std::move(P_ff);
76  return result;
77 }
78 
80 {
81  m_material = std::move(material);
82 }
83 
84 void Particle::setFormFactor(const IFormFactor& form_factor)
85 {
86  if (&form_factor != mP_form_factor.get()) {
87  mP_form_factor.reset(form_factor.clone());
89  }
90 }
91 
92 std::vector<const INode*> Particle::getChildren() const
93 {
94  return std::vector<const INode*>() << IParticle::getChildren() << mP_form_factor;
95 }
96 
98 {
99  setName("Particle");
101 }
Defines class FormFactorDecoratorPositionFactor.
Factory functions used to create material instances.
Defines class Particle.
Defines class SlicedParticle.
Decorates a scalar formfactor with the correct factor for the material's refractive index and that of...
void setAbundance(double abundance)
Sets particle abundance.
Pure virtual base class for all form factors.
Definition: IFormFactor.h:40
IFormFactor * clone() const override=0
Returns a clone of this ISample object.
void registerChild(INode *node)
Definition: INode.cpp:58
void setName(const std::string &name)
std::vector< const INode * > getChildren() const override
Returns a vector of children (const).
Definition: IParticle.cpp:61
void setPosition(kvector_t position)
Sets relative position of the particle's reference point in the coordinate system of parent.
Definition: IParticle.h:50
std::unique_ptr< IRotation > mP_rotation
Definition: IParticle.h:95
const IRotation * rotation() const
Returns rotation object.
Definition: IParticle.cpp:39
kvector_t m_position
Definition: IParticle.h:94
void setRotation(const IRotation &rotation)
Sets transformation.
Definition: IParticle.cpp:44
void registerParticleProperties()
Registers abundance and position.
Definition: IParticle.cpp:125
Pure virtual interface for rotations.
Definition: Rotations.h:27
static IRotation * createIdentity()
Definition: Rotations.cpp:53
A wrapper for underlying material implementation.
Definition: Material.h:29
Material rotatedMaterial(const Transform3D &transform) const
Definition: Material.cpp:104
A particle with a form factor and refractive index.
Definition: Particle.h:26
Particle * clone() const override final
Returns a clone of this ISample object.
Definition: Particle.cpp:45
Particle()
Definition: Particle.cpp:20
const Material * material() const override final
Returns nullptr, unless overwritten to return a specific material.
Definition: Particle.h:40
std::vector< const INode * > getChildren() const override final
Returns a vector of children (const).
Definition: Particle.cpp:92
void setFormFactor(const IFormFactor &form_factor)
Definition: Particle.cpp:84
void initialize()
Definition: Particle.cpp:97
SlicedParticle createSlicedParticle(ZLimits limits) const override final
Creates a sliced form factor for this particle.
Definition: Particle.cpp:58
Material m_material
Definition: Particle.h:47
std::unique_ptr< IFormFactor > mP_form_factor
Definition: Particle.h:48
void setMaterial(Material material)
Definition: Particle.cpp:79
Class that contains upper and lower limits of the z-coordinate for the slicing of form factors.
Definition: ZLimits.h:41
Material HomogeneousMaterial(const std::string &name, complex_t refractive_index, kvector_t magnetization)
Constructs a material with name, refractive_index and magnetization (in A/m).
Struct that contains information on a sliced particle.
std::vector< HomogeneousRegion > m_regions
std::unique_ptr< IFormFactor > mP_slicedff