Skip to content
Snippets Groups Projects
Commit d862d399 authored by Pospelov, Gennady's avatar Pospelov, Gennady
Browse files

Beam domain is build on board of corresponding item.

parent 79905f7d
No related branches found
No related tags found
No related merge requests found
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
#include "ScientificDoubleProperty.h" #include "ScientificDoubleProperty.h"
#include "BeamWavelengthItem.h" #include "BeamWavelengthItem.h"
#include "BeamAngleItems.h" #include "BeamAngleItems.h"
#include "GUIHelpers.h"
#include "Units.h"
#include "Beam.h"
const QString BeamItem::P_INTENSITY = QString::fromStdString(BornAgain::Intensity); const QString BeamItem::P_INTENSITY = QString::fromStdString(BornAgain::Intensity);
const QString BeamItem::P_WAVELENGTH = QString::fromStdString(BornAgain::Wavelength); const QString BeamItem::P_WAVELENGTH = QString::fromStdString(BornAgain::Wavelength);
...@@ -35,6 +38,8 @@ BeamItem::BeamItem() : SessionItem(Constants::BeamType) ...@@ -35,6 +38,8 @@ BeamItem::BeamItem() : SessionItem(Constants::BeamType)
addGroupProperty(P_AZIMUTHAL_ANGLE, Constants::BeamAzimuthalAngleType); addGroupProperty(P_AZIMUTHAL_ANGLE, Constants::BeamAzimuthalAngleType);
} }
BeamItem::~BeamItem(){}
double BeamItem::getIntensity() const double BeamItem::getIntensity() const
{ {
ScientificDoubleProperty intensity ScientificDoubleProperty intensity
...@@ -102,3 +107,16 @@ void BeamItem::setAzimuthalAngle(double value, const QString &distribution_name) ...@@ -102,3 +107,16 @@ void BeamItem::setAzimuthalAngle(double value, const QString &distribution_name)
Q_ASSERT(distributionItem); Q_ASSERT(distributionItem);
distributionItem->setItemValue(DistributionNoneItem::P_VALUE, value); distributionItem->setItemValue(DistributionNoneItem::P_VALUE, value);
} }
std::unique_ptr<Beam> BeamItem::createBeam() const
{
auto result = GUIHelpers::make_unique<Beam>();
result->setIntensity(getIntensity());
double lambda = getWavelength();
double inclination_angle = Units::deg2rad(getInclinationAngle());
double azimuthal_angle = Units::deg2rad(getAzimuthalAngle());
result->setCentralK(lambda, inclination_angle, azimuthal_angle);
return std::move(result);
}
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include "SessionItem.h" #include "SessionItem.h"
class Beam;
class BA_CORE_API_ BeamItem : public SessionItem class BA_CORE_API_ BeamItem : public SessionItem
{ {
...@@ -27,8 +29,8 @@ public: ...@@ -27,8 +29,8 @@ public:
static const QString P_WAVELENGTH; static const QString P_WAVELENGTH;
static const QString P_INCLINATION_ANGLE; static const QString P_INCLINATION_ANGLE;
static const QString P_AZIMUTHAL_ANGLE; static const QString P_AZIMUTHAL_ANGLE;
explicit BeamItem(); BeamItem();
virtual ~BeamItem(){} virtual ~BeamItem();
double getIntensity() const; double getIntensity() const;
void setIntensity(double value); void setIntensity(double value);
...@@ -41,6 +43,8 @@ public: ...@@ -41,6 +43,8 @@ public:
double getAzimuthalAngle() const; double getAzimuthalAngle() const;
void setAzimuthalAngle(double value, const QString &distribution_name = QString()); void setAzimuthalAngle(double value, const QString &distribution_name = QString());
std::unique_ptr<Beam> createBeam() const;
}; };
#endif // BEAMITEM_H #endif // BEAMITEM_H
......
...@@ -25,6 +25,12 @@ ...@@ -25,6 +25,12 @@
#include "ParticleLayoutItem.h" #include "ParticleLayoutItem.h"
#include "InterferenceFunctionItems.h" #include "InterferenceFunctionItems.h"
#include "TransformToDomain.h" #include "TransformToDomain.h"
#include "InstrumentItem.h"
#include "Instrument.h"
#include "BeamItem.h"
#include "DetectorItems.h"
#include "IResolutionFunction2D.h"
std::unique_ptr<MultiLayer> DomainObjectBuilder::buildMultiLayer( std::unique_ptr<MultiLayer> DomainObjectBuilder::buildMultiLayer(
const SessionItem& multilayer_item) const const SessionItem& multilayer_item) const
...@@ -124,25 +130,22 @@ DomainObjectBuilder::buildInterferenceFunction(const SessionItem& item) const ...@@ -124,25 +130,22 @@ DomainObjectBuilder::buildInterferenceFunction(const SessionItem& item) const
return iffItem->createInterferenceFunction(); return iffItem->createInterferenceFunction();
} }
std::unique_ptr<Instrument> DomainObjectBuilder::buildInstrument( std::unique_ptr<Instrument> DomainObjectBuilder::buildInstrument(const InstrumentItem& instrumentItem) const
const SessionItem& instrument_item) const
{ {
auto P_instrument = TransformToDomain::createInstrument(instrument_item); auto instrument = GUIHelpers::make_unique<Instrument>();
QVector<SessionItem *> children = instrument_item.childItems();
for (int i = 0; i < children.size(); ++i) {
if (children[i]->modelType() == Constants::BeamType) {
auto P_beam = buildBeam(*children[i]);
if (P_beam) {
P_instrument->setBeam(*P_beam);
}
} else if (children[i]->modelType() == Constants::DetectorContainerType) {
TransformToDomain::initInstrumentFromDetectorItem(*children[i], P_instrument.get());
}
}
return P_instrument;
}
std::unique_ptr<Beam> DomainObjectBuilder::buildBeam(const SessionItem& item) const auto beam = instrumentItem.beamItem()->createBeam();
{ instrument->setBeam(*beam);
return TransformToDomain::createBeam(item);
auto detector = instrumentItem.detectorItem()->createDetector();
instrument->setDetector(*detector);
auto resfunc = instrumentItem.detectorItem()->createResolutionFunction();
if(resfunc)
instrument->setDetectorResolutionFunction(*resfunc);
TransformToDomain::initInstrumentFromDetectorItem(*instrumentItem.detectorContainerItem(),
instrument.get());
return instrument;
} }
...@@ -27,6 +27,7 @@ class ParticleLayout; ...@@ -27,6 +27,7 @@ class ParticleLayout;
class IInterferenceFunction; class IInterferenceFunction;
class Beam; class Beam;
class SessionItem; class SessionItem;
class InstrumentItem;
class BA_CORE_API_ DomainObjectBuilder class BA_CORE_API_ DomainObjectBuilder
{ {
...@@ -36,8 +37,7 @@ public: ...@@ -36,8 +37,7 @@ public:
std::unique_ptr<ParticleLayout> buildParticleLayout(const SessionItem &item) const; std::unique_ptr<ParticleLayout> buildParticleLayout(const SessionItem &item) const;
std::unique_ptr<IInterferenceFunction> std::unique_ptr<IInterferenceFunction>
buildInterferenceFunction(const SessionItem &item) const; buildInterferenceFunction(const SessionItem &item) const;
std::unique_ptr<Instrument> buildInstrument(const SessionItem &instrument_item) const; std::unique_ptr<Instrument> buildInstrument(const InstrumentItem& instrumentItem) const;
std::unique_ptr<Beam> buildBeam(const SessionItem &item) const;
}; };
#endif // DOMAINOBJECTBUILDER_H #endif // DOMAINOBJECTBUILDER_H
...@@ -144,26 +144,6 @@ std::unique_ptr<ParticleDistribution> TransformToDomain::createParticleDistribut ...@@ -144,26 +144,6 @@ std::unique_ptr<ParticleDistribution> TransformToDomain::createParticleDistribut
return P_part_distr; return P_part_distr;
} }
std::unique_ptr<Instrument> TransformToDomain::createInstrument(const SessionItem& item)
{
Q_UNUSED(item);
return GUIHelpers::make_unique<Instrument>();
}
std::unique_ptr<Beam> TransformToDomain::createBeam(const SessionItem& item)
{
auto P_beam = GUIHelpers::make_unique<Beam>();
auto beamItem = dynamic_cast<const BeamItem*>(&item);
P_beam->setIntensity(beamItem->getIntensity());
double lambda = beamItem->getWavelength();
double inclination_angle = Units::deg2rad(beamItem->getInclinationAngle());
double azimuthal_angle = Units::deg2rad(beamItem->getAzimuthalAngle());
P_beam->setCentralK(lambda, inclination_angle, azimuthal_angle);
return P_beam;
}
void TransformToDomain::initInstrumentFromDetectorItem(const SessionItem& detectorItem, void TransformToDomain::initInstrumentFromDetectorItem(const SessionItem& detectorItem,
Instrument* instrument) Instrument* instrument)
{ {
...@@ -171,25 +151,8 @@ void TransformToDomain::initInstrumentFromDetectorItem(const SessionItem& detect ...@@ -171,25 +151,8 @@ void TransformToDomain::initInstrumentFromDetectorItem(const SessionItem& detect
Q_ASSERT(subDetector); Q_ASSERT(subDetector);
double scale(1.0); double scale(1.0);
if(auto sphericalDetector = dynamic_cast<SphericalDetectorItem*>(subDetector)) { if(dynamic_cast<SphericalDetectorItem*>(subDetector))
scale = Units::degree; scale = Units::degree;
auto detector = sphericalDetector->createDetector();
instrument->setDetector(*detector);
auto resfunc = sphericalDetector->createResolutionFunction();
if(resfunc) instrument->setDetectorResolutionFunction(*resfunc);
}
else if(auto rectangularDetector = dynamic_cast<RectangularDetectorItem*>(subDetector)) {
auto detector = rectangularDetector->createDetector();
instrument->setDetector(*detector);
auto resfunc = rectangularDetector->createResolutionFunction();
if(resfunc) instrument->setDetectorResolutionFunction(*resfunc);
} else {
throw GUIHelpers::Error(
"TransformToDomain::initInstrumentWithDetectorItem() -> Error. Unknown model type "
+ subDetector->modelType());
}
if(auto maskContainerItem = detectorItem.getChildOfType(Constants::MaskContainerType)) { if(auto maskContainerItem = detectorItem.getChildOfType(Constants::MaskContainerType)) {
for(int i_row = maskContainerItem->childItems().size(); i_row>0; --i_row) { for(int i_row = maskContainerItem->childItems().size(); i_row>0; --i_row) {
......
...@@ -35,10 +35,8 @@ class SessionItem; ...@@ -35,10 +35,8 @@ class SessionItem;
namespace TransformToDomain namespace TransformToDomain
{ {
BA_CORE_API_ std::unique_ptr<Beam> createBeam(const SessionItem& item);
BA_CORE_API_ std::unique_ptr<IMaterial> createDomainMaterial(const SessionItem& item); BA_CORE_API_ std::unique_ptr<IMaterial> createDomainMaterial(const SessionItem& item);
BA_CORE_API_ std::unique_ptr<IParticle> createIParticle(const SessionItem& item); BA_CORE_API_ std::unique_ptr<IParticle> createIParticle(const SessionItem& item);
BA_CORE_API_ std::unique_ptr<Instrument> createInstrument(const SessionItem& item);
BA_CORE_API_ std::unique_ptr<Layer> createLayer(const SessionItem& item); BA_CORE_API_ std::unique_ptr<Layer> createLayer(const SessionItem& item);
BA_CORE_API_ std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item); BA_CORE_API_ std::unique_ptr<LayerRoughness> createLayerRoughness(const SessionItem& item);
BA_CORE_API_ std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item); BA_CORE_API_ std::unique_ptr<MultiLayer> createMultiLayer(const SessionItem& item);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment