BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ProcessedLayout Class Reference

Data structure that contains preprocessed data for a single layout. More...

Collaboration diagram for ProcessedLayout:
[legend]

Public Member Functions

 ProcessedLayout (const ParticleLayout &layout, const std::vector< Slice > &slices, double z_ref, const IFresnelMap *p_fresnel_map, bool polarized)
 
 ProcessedLayout (ProcessedLayout &&other)
 
 ~ProcessedLayout ()
 
const std::vector< FormFactorCoherentSum > & formFactorList () const
 
const IInterferenceFunctioninterferenceFunction () const
 
size_t numberOfSlices () const
 
std::map< size_t, std::vector< HomogeneousRegion > > regionMap () const
 
double surfaceDensity () const
 

Private Member Functions

void collectFormFactors (const ParticleLayout &layout, const std::vector< Slice > &slices, double z_ref)
 
void mergeRegionMap (const std::map< size_t, std::vector< HomogeneousRegion >> &region_map)
 
FormFactorCoherentSum processParticle (const IParticle &particle, const std::vector< Slice > &slices, double z_ref)
 

Private Attributes

std::vector< FormFactorCoherentSumm_formfactors
 
const IFresnelMapm_fresnel_map
 
std::unique_ptr< IInterferenceFunctionm_iff
 
size_t m_n_slices
 
bool m_polarized
 
std::map< size_t, std::vector< HomogeneousRegion > > m_region_map
 
double m_surface_density
 

Detailed Description

Data structure that contains preprocessed data for a single layout.

If particles in the layout crossed the limits of the layer slices, these particles will be sliced themselves.

Definition at line 42 of file ProcessedLayout.h.

Constructor & Destructor Documentation

◆ ProcessedLayout() [1/2]

ProcessedLayout::ProcessedLayout ( const ParticleLayout layout,
const std::vector< Slice > &  slices,
double  z_ref,
const IFresnelMap p_fresnel_map,
bool  polarized 
)

Definition at line 42 of file ProcessedLayout.cpp.

44  : m_fresnel_map(p_fresnel_map), m_polarized(polarized)
45 {
46  m_n_slices = slices.size();
47  collectFormFactors(layout, slices, z_ref);
48  if (const auto* iff = layout.interferenceFunction())
49  m_iff.reset(iff->clone());
50 }
const IInterferenceFunction * interferenceFunction() const
std::unique_ptr< IInterferenceFunction > m_iff
void collectFormFactors(const ParticleLayout &layout, const std::vector< Slice > &slices, double z_ref)
const IFresnelMap * m_fresnel_map
matrixFFVector_t polarized(const SimulationElement &sim_element, const std::vector< FormFactorCoherentSum > &ff_wrappers)

References collectFormFactors(), ParticleLayout::interferenceFunction(), m_iff, and m_n_slices.

Here is the call graph for this function:

◆ ProcessedLayout() [2/2]

ProcessedLayout::ProcessedLayout ( ProcessedLayout &&  other)

Definition at line 52 of file ProcessedLayout.cpp.

53 {
55  m_polarized = other.m_polarized;
56  m_n_slices = other.m_n_slices;
58  m_formfactors = std::move(other.m_formfactors);
59  m_iff = std::move(other.m_iff);
60  m_region_map = std::move(other.m_region_map);
61 }
std::map< size_t, std::vector< HomogeneousRegion > > m_region_map
std::vector< FormFactorCoherentSum > m_formfactors
double m_surface_density

References m_formfactors, m_fresnel_map, m_iff, m_n_slices, m_polarized, m_region_map, and m_surface_density.

◆ ~ProcessedLayout()

ProcessedLayout::~ProcessedLayout ( )
default

Member Function Documentation

◆ collectFormFactors()

void ProcessedLayout::collectFormFactors ( const ParticleLayout layout,
const std::vector< Slice > &  slices,
double  z_ref 
)
private

Definition at line 90 of file ProcessedLayout.cpp.

92 {
93  double layout_abundance = layout.getTotalAbundance();
94  for (const auto* particle : layout.particles()) {
95  FormFactorCoherentSum ff_coh = processParticle(*particle, slices, z_ref);
96  ff_coh.scaleRelativeAbundance(layout_abundance);
97  m_formfactors.emplace_back(ff_coh);
98  }
99  double weight = layout.weight();
101  double scale_factor = m_surface_density / layout_abundance;
102  ScaleRegionMap(m_region_map, scale_factor);
103 }
Information about particle form factor and abundance.
void scaleRelativeAbundance(double total_abundance)
double weight() const
Returns the relative weight of this layout.
double getTotalAbundance() const
SafePointerVector< IParticle > particles() const
Returns information on all particles (type and abundance) and generates new particles if an IAbstract...
double totalParticleSurfaceDensity() const
FormFactorCoherentSum processParticle(const IParticle &particle, const std::vector< Slice > &slices, double z_ref)

References ParticleLayout::getTotalAbundance(), m_formfactors, m_region_map, m_surface_density, ParticleLayout::particles(), processParticle(), FormFactorCoherentSum::scaleRelativeAbundance(), ParticleLayout::totalParticleSurfaceDensity(), and ParticleLayout::weight().

Referenced by ProcessedLayout().

Here is the call graph for this function:

◆ formFactorList()

const std::vector< FormFactorCoherentSum > & ProcessedLayout::formFactorList ( ) const

Definition at line 73 of file ProcessedLayout.cpp.

74 {
75  return m_formfactors;
76 }

References m_formfactors.

◆ interferenceFunction()

const IInterferenceFunction * ProcessedLayout::interferenceFunction ( ) const

Definition at line 78 of file ProcessedLayout.cpp.

79 {
80  return m_iff.get();
81 }

References m_iff.

◆ mergeRegionMap()

void ProcessedLayout::mergeRegionMap ( const std::map< size_t, std::vector< HomogeneousRegion >> &  region_map)
private

Definition at line 142 of file ProcessedLayout.cpp.

144 {
145  for (const auto& entry : region_map) {
146  size_t layer_index = entry.first;
147  auto regions = entry.second;
148  m_region_map[layer_index].insert(m_region_map[layer_index].begin(), regions.begin(),
149  regions.end());
150  }
151 }

References m_region_map.

Referenced by processParticle().

◆ numberOfSlices()

size_t ProcessedLayout::numberOfSlices ( ) const

Definition at line 63 of file ProcessedLayout.cpp.

64 {
65  return m_n_slices;
66 }

References m_n_slices.

◆ processParticle()

FormFactorCoherentSum ProcessedLayout::processParticle ( const IParticle particle,
const std::vector< Slice > &  slices,
double  z_ref 
)
private

Definition at line 105 of file ProcessedLayout.cpp.

108 {
109  double abundance = particle.abundance();
110  auto sliced_ffs = SlicedFormFactorList::createSlicedFormFactors(particle, slices, z_ref);
111  auto region_map = sliced_ffs.regionMap();
112  ScaleRegionMap(region_map, abundance);
113  mergeRegionMap(region_map);
114  auto result = FormFactorCoherentSum(abundance);
115  for (size_t i = 0; i < sliced_ffs.size(); ++i) {
116  const auto ff_pair = sliced_ffs[i];
117  std::unique_ptr<IComputeFF> ff_framework;
118  if (slices.size() > 1) {
119  if (m_polarized)
120  ff_framework = std::make_unique<ComputeDWBAPol>(*ff_pair.first);
121  else
122  ff_framework = std::make_unique<ComputeDWBA>(*ff_pair.first);
123  } else {
124  if (m_polarized)
125  ff_framework = std::make_unique<ComputeBAPol>(*ff_pair.first);
126  else
127  ff_framework = std::make_unique<ComputeBA>(*ff_pair.first);
128  }
129 
130  size_t slice_index = ff_pair.second;
131  const Material slice_material = slices[slice_index].material();
132  ff_framework->setAmbientMaterial(slice_material);
133 
134  auto part = FormFactorCoherentPart(ff_framework.release());
135  part.setSpecularInfo(m_fresnel_map, slice_index);
136 
137  result.addCoherentPart(part);
138  }
139  return result;
140 }
Information about single particle form factor and specular info of the embedding layer.
double abundance() const
A wrapper for underlying material implementation.
Definition: Material.h:29
void mergeRegionMap(const std::map< size_t, std::vector< HomogeneousRegion >> &region_map)
static SlicedFormFactorList createSlicedFormFactors(const IParticle &particle, const std::vector< Slice > &slices, double z_ref)

References IAbstractParticle::abundance(), SlicedFormFactorList::createSlicedFormFactors(), m_fresnel_map, m_polarized, and mergeRegionMap().

Referenced by collectFormFactors().

Here is the call graph for this function:

◆ regionMap()

std::map< size_t, std::vector< HomogeneousRegion > > ProcessedLayout::regionMap ( ) const

Definition at line 83 of file ProcessedLayout.cpp.

84 {
85  return m_region_map;
86 }

References m_region_map.

◆ surfaceDensity()

double ProcessedLayout::surfaceDensity ( ) const

Definition at line 68 of file ProcessedLayout.cpp.

69 {
70  return m_surface_density;
71 }

References m_surface_density.

Referenced by ParticleLayoutComputation::compute().

Member Data Documentation

◆ m_formfactors

std::vector<FormFactorCoherentSum> ProcessedLayout::m_formfactors
private

Definition at line 65 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), collectFormFactors(), and formFactorList().

◆ m_fresnel_map

const IFresnelMap* ProcessedLayout::m_fresnel_map
private

Definition at line 61 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), and processParticle().

◆ m_iff

std::unique_ptr<IInterferenceFunction> ProcessedLayout::m_iff
private

Definition at line 66 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), and interferenceFunction().

◆ m_n_slices

size_t ProcessedLayout::m_n_slices
private

Definition at line 63 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), and numberOfSlices().

◆ m_polarized

bool ProcessedLayout::m_polarized
private

Definition at line 62 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), and processParticle().

◆ m_region_map

std::map<size_t, std::vector<HomogeneousRegion> > ProcessedLayout::m_region_map
private

Definition at line 67 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), collectFormFactors(), mergeRegionMap(), and regionMap().

◆ m_surface_density

double ProcessedLayout::m_surface_density
private

Definition at line 64 of file ProcessedLayout.h.

Referenced by ProcessedLayout(), collectFormFactors(), and surfaceDensity().


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