Skip to content
Snippets Groups Projects
Commit 11f9db18 authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

bug found and resolved (ParticleDecoration::clone did not copy transform).

parent 18f07901
No related branches found
No related tags found
No related merge requests found
...@@ -43,6 +43,12 @@ class ITransform3D { ...@@ -43,6 +43,12 @@ class ITransform3D {
transformed(const BasicVector3D<complex_t>& v) const transformed(const BasicVector3D<complex_t>& v) const
{ return v; } { return v; }
friend std::ostream& operator<<(std::ostream& ostr, const ITransform3D& m)
{ m.print(ostr); return ostr; }
virtual void print(std::ostream& ostr) const
{ ostr << "Transform3D:Identity"; }
}; };
} // namespace Geometry } // namespace Geometry
......
...@@ -54,6 +54,9 @@ class RotateY_3D : public ITransform3D { ...@@ -54,6 +54,9 @@ class RotateY_3D : public ITransform3D {
-m_sa*v.x() + m_ca*v.z() ); -m_sa*v.x() + m_ca*v.z() );
} }
virtual void print(std::ostream& ostr) const
{ ostr << "Transform3D:Rotate_Y(" << m_ca << "," << m_sa << ")" ; }
private: private:
double m_ca, m_sa; double m_ca, m_sa;
...@@ -92,6 +95,9 @@ class RotateZ_3D : public ITransform3D { ...@@ -92,6 +95,9 @@ class RotateZ_3D : public ITransform3D {
v.z() ); v.z() );
} }
virtual void print(std::ostream& ostr) const
{ ostr << "Transform3D:Rotate_Z(" << m_ca << "," << m_sa << ")" ; }
private: private:
double m_ca, m_sa; double m_ca, m_sa;
......
...@@ -26,6 +26,8 @@ class IInterferenceFunction; ...@@ -26,6 +26,8 @@ class IInterferenceFunction;
//! Interface to equip a sample component with various properties. //! Interface to equip a sample component with various properties.
//! Currently (March 2013) the only child class is ParticleDecoration.
class IDecoration : public ICompositeSample class IDecoration : public ICompositeSample
{ {
public: public:
......
...@@ -89,7 +89,6 @@ class Layer : public ICompositeSample ...@@ -89,7 +89,6 @@ class Layer : public ICompositeSample
getParameterPool()->registerParameter("thickness", &m_thickness); getParameterPool()->registerParameter("thickness", &m_thickness);
} }
private:
void print(std::ostream& ostr) const; void print(std::ostream& ostr) const;
const IMaterial* mp_material; //!< pointer to the material const IMaterial* mp_material; //!< pointer to the material
......
...@@ -20,11 +20,12 @@ ...@@ -20,11 +20,12 @@
#include "ParticleDecoration.h" #include "ParticleDecoration.h"
#include "LayerDecoratorDWBASimulation.h" #include "LayerDecoratorDWBASimulation.h"
//! Equip a layer with thickness, material, refraction index, WHAT ELSE ? //! Combines a Layer with an IDecoration.
class LayerDecorator : public Layer class LayerDecorator : public Layer
{ {
public: public:
//! Constructs LayerDecorator object by cloning _layer_ and _decoration_.
LayerDecorator(const Layer& layer, const IDecoration& decoration) LayerDecorator(const Layer& layer, const IDecoration& decoration)
: mp_decorated_layer(layer.clone()), mp_decoration(decoration.clone()) : mp_decorated_layer(layer.clone()), mp_decoration(decoration.clone())
{ {
...@@ -89,7 +90,17 @@ class LayerDecorator : public Layer ...@@ -89,7 +90,17 @@ class LayerDecorator : public Layer
} }
protected: protected:
LayerDecorator(const LayerDecorator& layer); //! Constructs a new object by cloning _other_'s layer and decoration.
LayerDecorator(const LayerDecorator& other)
: Layer(other)
{
mp_decorated_layer = other.getDecoratedLayer()->clone();
mp_decoration = other.getDecoration()->clone();
setName("LayerDecorator");
registerChild(mp_decorated_layer);
registerChild(mp_decoration);
init_parameters();
}
Layer *mp_decorated_layer; Layer *mp_decorated_layer;
IDecoration *mp_decoration; IDecoration *mp_decoration;
......
...@@ -26,13 +26,34 @@ ...@@ -26,13 +26,34 @@
class ParticleDecoration : public IDecoration class ParticleDecoration : public IDecoration
{ {
public: public:
ParticleDecoration(); ParticleDecoration()
ParticleDecoration( : m_total_abundance(0.0)
Particle *p_particle, double depth=0.0, double abundance=1.0); {
setName("ParticleDecoration");
}
ParticleDecoration( ParticleDecoration(
const Particle& p_particle, double depth=0.0, double abundance=1.0); Particle* p_particle, double depth=0., double abundance=1.)
virtual ~ParticleDecoration(); : m_total_abundance(0.0)
{
setName("ParticleDecoration");
addParticle(p_particle, depth, abundance);
}
ParticleDecoration(
const Particle& p_particle, double depth=0., double abundance=1.)
: m_total_abundance(0.0)
{
setName("ParticleDecoration");
addParticle(p_particle.clone(), depth, abundance);
}
~ParticleDecoration()
{
for (size_t i=0; i<m_particles.size(); ++i)
delete m_particles[i];
}
virtual ParticleDecoration *clone() const; virtual ParticleDecoration *clone() const;
//! Adds generic particle, *-version. //! Adds generic particle, *-version.
...@@ -86,19 +107,12 @@ class ParticleDecoration : public IDecoration ...@@ -86,19 +107,12 @@ class ParticleDecoration : public IDecoration
private: private:
//! Adds particle information with simultaneous registration in parent class. //! Adds particle information with simultaneous registration in parent class.
void addAndRegisterParticleInfo(ParticleInfo *child) void addAndRegisterParticleInfo(ParticleInfo *child);
{
m_total_abundance += child->getAbundance();
m_particles.push_back(child);
registerChild(child);
}
//! Adds interference function with simultaneous registration in parent class //! Adds interference function with simultaneous registration in parent class
void addAndRegisterInterferenceFunction(IInterferenceFunction *child) void addAndRegisterInterferenceFunction(IInterferenceFunction *child);
{
m_interference_functions.push_back(child); void print(std::ostream& ostr) const;
registerChild(child);
}
//TODO: replace with SafePointerVector //TODO: replace with SafePointerVector
std::vector<ParticleInfo*> m_particles; std::vector<ParticleInfo*> m_particles;
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
//! Holds additional information about particle (used in ParticleDecoration). //! Holds additional information about particle (used in ParticleDecoration).
//! Currently (March 2013), child classes are
//! - DiffuseParticleInfo
//! - PositionParticleInfo
class ParticleInfo : public ICompositeSample class ParticleInfo : public ICompositeSample
{ {
public: public:
...@@ -36,9 +40,13 @@ class ParticleInfo : public ICompositeSample ...@@ -36,9 +40,13 @@ class ParticleInfo : public ICompositeSample
ParticleInfo(const Particle& p_particle, ParticleInfo(const Particle& p_particle,
double depth=0, double abundance=0); double depth=0, double abundance=0);
virtual ~ParticleInfo(); virtual ~ParticleInfo() { delete mp_particle; }
virtual ParticleInfo *clone() const; virtual ParticleInfo *clone() const
{
return new ParticleInfo(
mp_particle->clone(), mP_transform, m_depth, m_abundance);
}
//! Returns particle. //! Returns particle.
const Particle *getParticle() const { return mp_particle; } const Particle *getParticle() const { return mp_particle; }
...@@ -66,6 +74,8 @@ class ParticleInfo : public ICompositeSample ...@@ -66,6 +74,8 @@ class ParticleInfo : public ICompositeSample
protected: protected:
virtual void init_parameters(); virtual void init_parameters();
virtual void print(std::ostream& ostr) const;
Particle *mp_particle; Particle *mp_particle;
Geometry::PTransform3D mP_transform; Geometry::PTransform3D mP_transform;
double m_depth; double m_depth;
......
...@@ -44,20 +44,8 @@ DiffuseDWBASimulation* LayerDecorator::createDiffuseDWBASimulation() const ...@@ -44,20 +44,8 @@ DiffuseDWBASimulation* LayerDecorator::createDiffuseDWBASimulation() const
return 0; return 0;
} }
LayerDecorator::LayerDecorator(const LayerDecorator& other)
: Layer(other)
{
mp_decorated_layer = other.getDecoratedLayer()->clone();
mp_decoration = other.getDecoration()->clone();
setName("LayerDecorator");
registerChild(mp_decorated_layer);
registerChild(mp_decoration);
init_parameters();
}
void LayerDecorator::print(std::ostream& ostr) const void LayerDecorator::print(std::ostream& ostr) const
{ {
ICompositeSample::print(ostr); Layer::print(ostr);
ostr << "-->LayerDecorator{" << *mp_decoration << "}"; ostr << "-->LayerDecorator{" << *mp_decoration << "}";
} }
...@@ -19,38 +19,13 @@ ...@@ -19,38 +19,13 @@
#include "LocalMonodisperseApproximationStrategy.h" #include "LocalMonodisperseApproximationStrategy.h"
#include "InterferenceFunction1DParaCrystal.h" #include "InterferenceFunction1DParaCrystal.h"
#include "SizeSpacingCorrelationApproximationStrategy.h" #include "SizeSpacingCorrelationApproximationStrategy.h"
#include "MessageService.h"
#include <iomanip>
ParticleDecoration::ParticleDecoration()
: m_total_abundance(0.0)
{
setName("ParticleDecoration");
}
ParticleDecoration::ParticleDecoration(
Particle* p_particle, double depth, double abundance)
: m_total_abundance(0.0)
{
setName("ParticleDecoration");
addParticle(p_particle, depth, abundance);
}
ParticleDecoration::ParticleDecoration(
const Particle& p_particle, double depth, double abundance)
: m_total_abundance(0.0)
{
setName("ParticleDecoration");
addParticle(p_particle.clone(), depth, abundance);
}
ParticleDecoration::~ParticleDecoration()
{
for (size_t i=0; i<m_particles.size(); ++i)
delete m_particles[i];
}
ParticleDecoration* ParticleDecoration::clone() const ParticleDecoration* ParticleDecoration::clone() const
{ {
msglog(MSG::DEBUG) << "ParticleDecoration::clone()";
ParticleDecoration *p_new = new ParticleDecoration(); ParticleDecoration *p_new = new ParticleDecoration();
p_new->setName(getName()); p_new->setName(getName());
...@@ -105,7 +80,7 @@ void ParticleDecoration::addParticle( ...@@ -105,7 +80,7 @@ void ParticleDecoration::addParticle(
addParticle(p_particle.clone(), Geometry::PTransform3D(), depth, abundance); addParticle(p_particle.clone(), Geometry::PTransform3D(), depth, abundance);
} }
//! Adds particle info //! Adds particle info.
void ParticleDecoration::addParticleInfo(const ParticleInfo& info) void ParticleDecoration::addParticleInfo(const ParticleInfo& info)
{ {
...@@ -151,3 +126,33 @@ const IInterferenceFunction* ParticleDecoration::getInterferenceFunction( ...@@ -151,3 +126,33 @@ const IInterferenceFunction* ParticleDecoration::getInterferenceFunction(
"ParticleDecoration::getInterferenceFunction() ->" "ParticleDecoration::getInterferenceFunction() ->"
"Not so many interference functions in this decoration."); "Not so many interference functions in this decoration.");
} }
//! Adds particle information with simultaneous registration in parent class.
void ParticleDecoration::addAndRegisterParticleInfo(
ParticleInfo *child)
{
msglog(MSG::DEBUG) << "ParticleDecoration::addAndRegisterParticleInfo {" <<
*child << "}";
m_total_abundance += child->getAbundance();
m_particles.push_back(child);
registerChild(child);
}
//! Adds interference function with simultaneous registration in parent class.
void ParticleDecoration::addAndRegisterInterferenceFunction(
IInterferenceFunction *child)
{
m_interference_functions.push_back(child);
registerChild(child);
}
void ParticleDecoration::print(std::ostream& ostr) const
{
IDecoration::print(ostr);
ostr << "-->ParticleDecoration<" << this << ">{\n";
for( size_t i=0; i<m_particles.size(); ++i )
ostr << " - particle " << std::left << std::setw(2) << i << " { "
<< *(m_particles[i]) << "}\n";
ostr << "}";
}
...@@ -71,20 +71,22 @@ ParticleInfo::ParticleInfo( ...@@ -71,20 +71,22 @@ ParticleInfo::ParticleInfo(
init_parameters(); init_parameters();
} }
ParticleInfo::~ParticleInfo()
{
delete mp_particle;
}
//! Registers some class members for later access via parameter pool
void ParticleInfo::init_parameters() void ParticleInfo::init_parameters()
{ {
getParameterPool()->clear(); getParameterPool()->clear();
getParameterPool()->registerParameter("depth", &m_depth); getParameterPool()->registerParameter("depth", &m_depth);
} }
ParticleInfo *ParticleInfo::clone() const
void ParticleInfo::print(std::ostream& ostr) const
{ {
return new ParticleInfo( ostr << "ParticleInfo:" << getName() << "<" << this << "> : {" <<
mp_particle->clone(), m_depth, m_abundance); " depth=" << m_depth <<
", abundance=" << m_abundance <<
", transform=";
if ( mP_transform )
ostr << *mP_transform;
else
ostr << "NONE";
ostr << " }";
} }
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "Rotate3D.h" #include "Rotate3D.h"
#include "Utils.h" #include "Utils.h"
#include "InterferenceFunction1DParaCrystal.h" #include "InterferenceFunction1DParaCrystal.h"
#include "MessageService.h"
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>
...@@ -99,6 +100,7 @@ void FunctionalTests::IsGISAXS09::runpyramidZ45() ...@@ -99,6 +100,7 @@ void FunctionalTests::IsGISAXS09::runpyramidZ45()
Geometry::PTransform3D transform( Geometry::PTransform3D transform(
new Geometry::RotateZ_3D(45.*Units::degree) ); new Geometry::RotateZ_3D(45.*Units::degree) );
msglog(MSG::DEBUG) << "created rotZ45 {" << *transform << "}";
ParticleDecoration particle_decoration; ParticleDecoration particle_decoration;
particle_decoration.addParticle(pyramid, transform); particle_decoration.addParticle(pyramid, transform);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment