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

Public Member Functions

 RealSpaceMesoCrystal (const MesoCrystalItem *mesoCrystalItem, double total_abundance, const QVector3D &origin)
 
 ~RealSpaceMesoCrystal ()
 
Particle3DContainer populateMesoCrystal ()
 

Private Attributes

const MesoCrystalItemm_mesoCrystalItem
 
QVector3D m_origin
 
double m_total_abundance
 

Detailed Description

Definition at line 26 of file RealSpaceMesoCrystalUtils.h.

Constructor & Destructor Documentation

◆ ~RealSpaceMesoCrystal()

RealSpaceMesoCrystal::~RealSpaceMesoCrystal ( )
default

◆ RealSpaceMesoCrystal()

RealSpaceMesoCrystal::RealSpaceMesoCrystal ( const MesoCrystalItem mesoCrystalItem,
double  total_abundance,
const QVector3D &  origin 
)

Definition at line 347 of file RealSpaceMesoCrystalUtils.cpp.

349 {
350  m_mesoCrystalItem = mesoCrystalItem;
351  m_total_abundance = total_abundance;
352  m_origin = origin;
353 }
const MesoCrystalItem * m_mesoCrystalItem

References m_mesoCrystalItem, m_origin, and m_total_abundance.

Member Function Documentation

◆ populateMesoCrystal()

Particle3DContainer RealSpaceMesoCrystal::populateMesoCrystal ( )

Definition at line 355 of file RealSpaceMesoCrystalUtils.cpp.

356 {
357  auto mesoCrystal = m_mesoCrystalItem->createMesoCrystal();
358 
359  std::unique_ptr<MesoCrystal> M_clone(mesoCrystal->clone()); // clone of the mesoCrystal
360 
361  // These methods DO NOT add rotation/translation of the mesoCrystal to its children
362  // and hence they need to be added manually
363  auto lattice = m_mesoCrystalItem->getLattice();
364  auto particleBasis = m_mesoCrystalItem->getBasis();
365  auto outerShapeff = m_mesoCrystalItem->getOuterShape();
366 
367  auto mesoCrystal_rotation = M_clone->rotation();
368  auto mesoCrystal_translation = M_clone->position();
369 
370  Particle3DContainer mesoCrystalBasis3DContainer;
371 
372  if (dynamic_cast<const ParticleComposition*>(particleBasis.get())) {
373  auto particleComposition = dynamic_cast<const ParticleComposition*>(particleBasis.get());
374  mesoCrystalBasis3DContainer = RealSpaceBuilderUtils::particleComposition3DContainer(
375  *particleComposition, 1.0, m_origin);
376  } else if (dynamic_cast<const ParticleCoreShell*>(particleBasis.get())) {
377  auto particleCoreShell = dynamic_cast<const ParticleCoreShell*>(particleBasis.get());
378  mesoCrystalBasis3DContainer =
380  } else if (dynamic_cast<const MesoCrystal*>(particleBasis.get())) {
381  // TODO: Implement method to populate MesoCrystal from CORE and NOT from MesoCrystalItem
382  // as it is done currently in RealSpaceBuilderUtils::mesoCrystal3DContainer
383  std::ostringstream ostr;
384  ostr << "Sorry, MesoCrystal inside MesoCrystal not yet implemented";
385  ostr << "\n\nStay tuned!";
386  throw std::runtime_error(ostr.str());
387  } else {
388  auto particle = dynamic_cast<const Particle*>(particleBasis.get());
389  mesoCrystalBasis3DContainer =
391  }
392 
394 
395  for (int k = -n; k <= n; k++) {
396  for (int j = -n; j <= n; j++) {
397  for (int i = -n; i <= n; i++) {
398  auto positionInside = i * lattice.getBasisVectorA() + j * lattice.getBasisVectorB()
399  + k * lattice.getBasisVectorC();
400 
401  if (isPositionInsideMesoCrystal(outerShapeff.get(), positionInside)) {
402  for (size_t it = 0; it < mesoCrystalBasis3DContainer.containerSize(); ++it) {
403  auto particle3D = mesoCrystalBasis3DContainer.createParticle(it);
404  particle3D->addTranslation(
405  QVector3D(static_cast<float>(positionInside.x()),
406  static_cast<float>(positionInside.y()),
407  static_cast<float>(positionInside.z())));
408 
409  particle3D->addExtrinsicRotation(
411  mesoCrystal_rotation));
412 
413  particle3D->addTranslation(
414  QVector3D(static_cast<float>(mesoCrystal_translation.x()),
415  static_cast<float>(mesoCrystal_translation.y()),
416  static_cast<float>(mesoCrystal_translation.z())));
417 
419  particle3D.release(), mesoCrystalBasis3DContainer.particle3DBlend(it));
420  }
421  }
422  }
423  }
424  }
425 
426  // Add outer shape for visualisation
427  auto outerShape3D = TransformTo3D::createParticlefromIFormFactor(outerShapeff.get());
428  outerShape3D->addTransform(
430  QVector3D(static_cast<float>(mesoCrystal_translation.x()),
431  static_cast<float>(mesoCrystal_translation.y()),
432  static_cast<float>(mesoCrystal_translation.z())));
433 
434  // assign grey (default) color to the outer shape
435  QColor color = {};
436  color.setAlphaF(0.3);
437  outerShape3D->color = color;
438  mesoCrystal3DContainer.addParticle(outerShape3D.release(), true);
439 
440  // set the correct abundance for the MesoCrystal
443 
444  return mesoCrystal3DContainer;
445 }
std::unique_ptr< IFormFactor > getOuterShape() const
std::unique_ptr< MesoCrystal > createMesoCrystal() const
std::unique_ptr< IParticle > getBasis() const
Lattice3D getLattice() const
A particle with an internal structure of smaller particles.
Definition: MesoCrystal.h:25
void setCumulativeAbundance(double cumulativeAbundance)
std::unique_ptr< RealSpace::Particles::Particle > createParticle(const size_t &index) const
void addParticle(RealSpace::Particles::Particle *particle3D, bool blend)
size_t containerSize() const
void setParticleType(QString particleType)
bool particle3DBlend(const size_t &index) const
A composition of particles at fixed positions.
A particle with a core/shell geometry.
A particle with a form factor and refractive index.
Definition: Particle.h:24
Particle3DContainer particleCoreShell3DContainer(const ParticleCoreShell &particleCoreShell, double total_abundance=1.0, const QVector3D &origin={})
Particle3DContainer particleComposition3DContainer(const ParticleComposition &particleComposition3DContainer, double total_abundance=1.0, const QVector3D &origin={})
Particle3DContainer mesoCrystal3DContainer(const MesoCrystalItem &mesoCrystalItem, double total_abundance=1.0, const QVector3D &origin={})
RealSpace::Vector3D implementParticleRotationfromIRotation(const IRotation *&rotation)
Particle3DContainer singleParticle3DContainer(const Particle &particle, double total_abundance=1.0, const QVector3D &origin={})
std::unique_ptr< RealSpace::Particles::Particle > createParticlefromIFormFactor(const IFormFactor *ff)

References Particle3DContainer::addParticle(), Particle3DContainer::containerSize(), MesoCrystalItem::createMesoCrystal(), Particle3DContainer::createParticle(), TransformTo3D::createParticlefromIFormFactor(), MesoCrystalItem::getBasis(), MesoCrystalItem::getLattice(), MesoCrystalItem::getOuterShape(), RealSpaceBuilderUtils::implementParticleRotationfromIRotation(), m_mesoCrystalItem, m_origin, m_total_abundance, RealSpaceBuilderUtils::mesoCrystal3DContainer(), Particle3DContainer::particle3DBlend(), RealSpaceBuilderUtils::particleComposition3DContainer(), RealSpaceBuilderUtils::particleCoreShell3DContainer(), Particle3DContainer::setCumulativeAbundance(), Particle3DContainer::setParticleType(), RealSpaceBuilderUtils::singleParticle3DContainer(), BasicVector3D< T >::x(), BasicVector3D< T >::y(), and BasicVector3D< T >::z().

Referenced by RealSpaceBuilderUtils::mesoCrystal3DContainer().

Here is the call graph for this function:

Member Data Documentation

◆ m_mesoCrystalItem

const MesoCrystalItem* RealSpaceMesoCrystal::m_mesoCrystalItem
private

Definition at line 36 of file RealSpaceMesoCrystalUtils.h.

Referenced by RealSpaceMesoCrystal(), and populateMesoCrystal().

◆ m_origin

QVector3D RealSpaceMesoCrystal::m_origin
private

Definition at line 38 of file RealSpaceMesoCrystalUtils.h.

Referenced by RealSpaceMesoCrystal(), and populateMesoCrystal().

◆ m_total_abundance

double RealSpaceMesoCrystal::m_total_abundance
private

Definition at line 37 of file RealSpaceMesoCrystalUtils.h.

Referenced by RealSpaceMesoCrystal(), and populateMesoCrystal().


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