BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ParticleDistribution.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file Sample/Particle/ParticleDistribution.cpp
6 //! @brief Implements class ParticleDistribution.
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 #include "Param/Node/NodeUtils.h"
22 #include <map>
23 
25  const ParameterDistribution& par_distr)
26  : m_par_distribution(par_distr)
27 {
28  setName("ParticleDistribution");
29  m_particle.reset(prototype.clone());
31  m_particle->registerAbundance(false);
32  if (auto* dist = m_par_distribution.getDistribution())
33  registerChild(dist);
34  registerParameter("Abundance", &m_abundance);
35 }
36 
38 {
40  result->setAbundance(m_abundance);
41  return result;
42 }
43 
45 {
46  m_particle->translate(translation);
47 }
48 
50 {
51  m_particle->rotate(rotation);
52 }
53 
54 //! Returns particle clones with parameter values drawn from distribution.
55 
57 {
58  // createParameterTree
59  ParameterPool pool;
60  for (const INode* child : m_particle->progeny()) {
61  const std::string path = NodeUtils::nodePath(child, m_particle->parent()) + "/";
62  child->parameterPool()->copyToExternalPool(path, &pool);
63  }
64  std::string main_par_name = m_par_distribution.getMainParameterName();
65  double main_par_value = pool.getUniqueMatch(main_par_name)->value();
66 
67  // Preset link ratios:
68  std::map<std::string, double> linked_ratios;
69  for (const std::string& name : m_par_distribution.getLinkedParameterNames())
70  linked_ratios[name] =
71  main_par_value == 0 ? 1.0 : pool.getUniqueMatch(name)->value() / main_par_value;
72 
73  // Draw distribution samples; for each sample, create one particle clone:
74  std::vector<ParameterSample> main_par_samples = m_par_distribution.generateSamples();
76  for (const ParameterSample& main_sample : main_par_samples) {
77  IParticle* particle_clone = m_particle->clone();
78  ParameterPool pool2;
79  for (const INode* child : particle_clone->progeny()) {
80  const std::string path = NodeUtils::nodePath(child, particle_clone->parent()) + "/";
81  child->parameterPool()->copyToExternalPool(path, &pool2);
82  }
83  pool2.setUniqueMatchValue(main_par_name, main_sample.value);
84  for (const auto& it : linked_ratios)
85  pool2.setUniqueMatchValue(it.first, main_sample.value * it.second);
86  particle_clone->setAbundance(abundance() * main_sample.weight);
87  result.push_back(particle_clone);
88  }
89  return result;
90 }
91 
92 std::vector<const INode*> ParticleDistribution::getChildren() const
93 {
94  std::vector<const INode*> result = std::vector<const INode*>() << m_particle;
95  if (const auto* dist = m_par_distribution.getDistribution())
96  result.emplace_back(dist);
97  return result;
98 }
99 
101 {
103  parameterDistribution().getMainParameterName());
104 }
Defines classes representing one-dimensional distributions.
Defines interface IParticle.
Defines collection of utility functions for INode.
Defines class ParameterPool.
Defines namespace ParameterUtils.
Defines class ParticleDistribution.
Defines class RealParameter.
void setAbundance(double abundance)
Sets particle abundance.
double abundance() const
Base class for tree-like structures containing parameterized objects.
Definition: INode.h:49
std::vector< const INode * > progeny() const
Returns a vector of all descendants.
Definition: INode.cpp:68
const INode * parent() const
Definition: INode.cpp:84
void registerChild(INode *node)
Definition: INode.cpp:57
void setName(const std::string &name)
RealParameter & registerParameter(const std::string &name, double *parpointer)
Abstract base class for Particle, ParticleComposition, ParticleCoreShell, MesoCrystal.
Definition: IParticle.h:33
IParticle * clone() const override=0
Returns a clone of this ISampleNode object.
Abstract base class for rotations.
Definition: Rotations.h:28
A parametric distribution function, for use with any model parameter.
const IDistribution1D * getDistribution() const
std::vector< ParameterSample > generateSamples() const
generate list of sampled values with their weight
std::vector< std::string > getLinkedParameterNames() const
get list of linked parameter names
std::string getMainParameterName() const
get the main parameter's name
Container with parameters for IParametricComponent object.
Definition: ParameterPool.h:29
void setUniqueMatchValue(const std::string &pattern, double value)
Sets value of the one parameter that matches pattern ('*' allowed), or throws.
RealParameter * getUniqueMatch(const std::string &pattern) const
Returns the one parameter that matches the pattern (wildcards '*' allowed), or throws.
A parameter value with a weight, as obtained when sampling from a distribution.
A particle type that is a parametric distribution of IParticle's.
ParameterDistribution m_par_distribution
const IParticle & prototype() const
Returns the prototype particle, used for generating multiple ones.
ParticleDistribution * clone() const final
Returns a clone of this ISampleNode object.
std::vector< const INode * > getChildren() const final
Returns a vector of children.
void translate(kvector_t translation) final
Translates the particle with the given vector.
void rotate(const IRotation &rotation) final
Applies the given rotation to the particle.
SafePointerVector< IParticle > generateParticles() const
Returns list of new particles generated according to a distribution.
ParameterDistribution parameterDistribution() const
Returns the distributed parameter data.
std::string mainUnits() const
ParticleDistribution(const IParticle &prototype, const ParameterDistribution &par_distr)
std::unique_ptr< IParticle > m_particle
double value() const
Returns value of wrapped parameter.
A vector of pointers, owned by *this, with methods to handle them safely.
void push_back(T *pointer)
std::string nodePath(const INode *node, const INode *root=nullptr)
Returns path composed of node's displayName, with respect to root node.
Definition: NodeUtils.cpp:89
std::string poolParameterUnits(const IParametricComponent &node, const std::string &parName)
Returns units of main parameter.
QString const & name(EShape k)
Definition: particles.cpp:21