BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RadialParacrystalPositionBuilder Class Reference
Inheritance diagram for RadialParacrystalPositionBuilder:
[legend]
Collaboration diagram for RadialParacrystalPositionBuilder:
[legend]

Public Member Functions

 RadialParacrystalPositionBuilder (const InterferenceFunctionRadialParaCrystal *p_iff)
 
 ~RadialParacrystalPositionBuilder () override
 
std::vector< std::vector< double > > generatePositions (double layer_size, double density=0.0) const
 

Private Member Functions

std::vector< std::vector< double > > generatePositionsImpl (double layer_size, double density=0.0) const override
 
double positionVariance () const override
 

Private Attributes

std::unique_ptr< InterferenceFunctionRadialParaCrystalm_iff
 

Detailed Description

Definition at line 114 of file IPositionBuilder.h.

Constructor & Destructor Documentation

◆ RadialParacrystalPositionBuilder()

RadialParacrystalPositionBuilder::RadialParacrystalPositionBuilder ( const InterferenceFunctionRadialParaCrystal p_iff)

Definition at line 214 of file IPositionBuilder.cpp.

216  : m_iff(p_iff->clone())
217 {
218 }
InterferenceFunctionRadialParaCrystal * clone() const final
Returns a clone of this ISampleNode object.
std::unique_ptr< InterferenceFunctionRadialParaCrystal > m_iff

◆ ~RadialParacrystalPositionBuilder()

RadialParacrystalPositionBuilder::~RadialParacrystalPositionBuilder ( )
overridedefault

Member Function Documentation

◆ generatePositions()

std::vector< std::vector< double > > IPositionBuilder::generatePositions ( double  layer_size,
double  density = 0.0 
) const
inherited

Definition at line 28 of file IPositionBuilder.cpp.

30 {
31  std::vector<std::vector<double>> positions = generatePositionsImpl(layer_size, density);
32  double pos_var = positionVariance();
33  if (pos_var > 0.0) {
34  // random generator and distribution
35  std::random_device rd; // Will be used to obtain a seed for the random number engine
36  std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd()
37  std::normal_distribution<double> dis(0.0, std::sqrt(pos_var));
38  for (auto& position : positions) {
39  for (auto& coordinate : position)
40  coordinate += dis(gen);
41  }
42  }
43  return positions;
44 }
virtual std::vector< std::vector< double > > generatePositionsImpl(double layer_size, double density=0.0) const =0
virtual double positionVariance() const =0

References IPositionBuilder::generatePositionsImpl(), and IPositionBuilder::positionVariance().

Here is the call graph for this function:

◆ generatePositionsImpl()

std::vector< std::vector< double > > RadialParacrystalPositionBuilder::generatePositionsImpl ( double  layer_size,
double  density = 0.0 
) const
overrideprivatevirtual

Implements IPositionBuilder.

Definition at line 223 of file IPositionBuilder.cpp.

224 {
225  std::vector<std::vector<double>> lattice_positions;
226 
227  double distance = m_iff->peakDistance();
228 
229  // Estimate the limit n of the integer multiple i of the peakDistance required
230  // for populating particles correctly within the 3D model's boundaries
231  int n = distance <= 0.0 ? 1 : static_cast<int>(layer_size * std::sqrt(2.0) / distance);
232 
233  lattice_positions.resize(static_cast<size_t>(2 * n + 1));
234  for (auto& it : lattice_positions) {
235  it.resize(2);
236  }
237 
238  lattice_positions[0][0] = 0.0; // x coordinate of reference particle - at the origin
239  lattice_positions[0][1] = 0.0; // y coordinate of reference particle - at the origin
240 
241  for (int i = 1; i <= n; ++i) {
242  // positions of particles located along +x (store at odd index)
243  unsigned i_left = static_cast<unsigned>(std::max(0, 2 * i - 3));
244 
245  double offset = m_iff->randomSample();
246  lattice_positions[static_cast<size_t>(2 * i - 1)][0] =
247  lattice_positions[i_left][0] + distance + offset;
248  lattice_positions[static_cast<size_t>(2 * i - 1)][1] = 0.0;
249 
250  // positions of particles located along -x (store at even index)
251  unsigned i_right = static_cast<unsigned>(2 * (i - 1));
252 
253  offset = m_iff->randomSample();
254  lattice_positions[static_cast<size_t>(2 * i)][0] =
255  lattice_positions[i_right][0] - distance + offset;
256  lattice_positions[static_cast<size_t>(2 * i)][1] = 0.0;
257  }
258  return lattice_positions;
259 }

References m_iff.

◆ positionVariance()

double RadialParacrystalPositionBuilder::positionVariance ( ) const
overrideprivatevirtual

Implements IPositionBuilder.

Definition at line 261 of file IPositionBuilder.cpp.

262 {
263  return m_iff->positionVariance();
264 }

References m_iff.

Member Data Documentation

◆ m_iff

std::unique_ptr<InterferenceFunctionRadialParaCrystal> RadialParacrystalPositionBuilder::m_iff
private

Definition at line 123 of file IPositionBuilder.h.

Referenced by generatePositionsImpl(), and positionVariance().


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