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

Virtual scaleFactor introduced for distribution items to provide rad2deg convertion.

parent 65318af5
No related branches found
No related tags found
No related merge requests found
...@@ -15,72 +15,57 @@ ...@@ -15,72 +15,57 @@
// ************************************************************************** // // ************************************************************************** //
#include "BeamAngleItems.h" #include "BeamAngleItems.h"
#include "Distributions.h"
#include "GUIHelpers.h"
#include "Units.h" #include "Units.h"
BeamInclinationAngleItem::BeamInclinationAngleItem() BeamAzimuthalAngleItem::BeamAzimuthalAngleItem()
: BeamDistributionItem(Constants::BeamInclinationAngleType) : BeamDistributionItem(Constants::BeamAzimuthalAngleType)
{ {
register_distribution_group(); register_distribution_group();
SessionItem *valueItem = getGroupItem(P_DISTRIBUTION)->getItem(DistributionNoneItem::P_VALUE); SessionItem *valueItem = getGroupItem(P_DISTRIBUTION)->getItem(DistributionNoneItem::P_VALUE);
valueItem->setLimits(RealLimits::limited(0.0, 90.0)); valueItem->setLimits(RealLimits::limited(-90.0, 90.0));
valueItem->setDecimals(3); valueItem->setDecimals(3);
valueItem->setValue(0.2); valueItem->setValue(0.0);
initDistributionItem(); initDistributionItem();
} }
//! Returns beam inclination angle. In the case of distribution applied, returns its mean. //! Returns beam azimuthal angle. In the case of distribution applied, returns its mean.
double BeamInclinationAngleItem::inclinationAngle() const double BeamAzimuthalAngleItem::azimuthalAngle() const
{ {
std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D(); return BeamDistributionItem::meanValue();
if(domainDistr)
return Units::rad2deg(domainDistr->getMean());
else
return getGroupItem(P_DISTRIBUTION)->getItemValue(DistributionNoneItem::P_VALUE).toDouble();
} }
std::unique_ptr<IDistribution1D> BeamInclinationAngleItem::createDistribution1D() const double BeamAzimuthalAngleItem::scaleFactor() const
{ {
if(auto distItem = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION))) return Units::degree;
return distItem->createDistribution(Units::degree);
return {};
} }
// -------------------------------------------------------------------------- // // ------------------------------------------------------------------------------------------------
BeamAzimuthalAngleItem::BeamAzimuthalAngleItem() BeamInclinationAngleItem::BeamInclinationAngleItem()
: BeamDistributionItem(Constants::BeamAzimuthalAngleType) : BeamDistributionItem(Constants::BeamInclinationAngleType)
{ {
register_distribution_group(); register_distribution_group();
SessionItem *valueItem = getGroupItem(P_DISTRIBUTION)->getItem(DistributionNoneItem::P_VALUE); SessionItem *valueItem = getGroupItem(P_DISTRIBUTION)->getItem(DistributionNoneItem::P_VALUE);
valueItem->setLimits(RealLimits::limited(-90.0, 90.0)); valueItem->setLimits(RealLimits::limited(0.0, 90.0));
valueItem->setDecimals(3); valueItem->setDecimals(3);
valueItem->setValue(0.0); valueItem->setValue(0.2);
initDistributionItem(); initDistributionItem();
} }
//! Returns beam azimuthal angle. In the case of distribution applied, returns its mean. //! Returns beam inclination angle. In the case of distribution applied, returns its mean.
double BeamAzimuthalAngleItem::azimuthalAngle() const double BeamInclinationAngleItem::inclinationAngle() const
{ {
std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D(); return BeamDistributionItem::meanValue();
if(domainDistr)
return Units::rad2deg(domainDistr->getMean());
else
return getGroupItem(P_DISTRIBUTION)->getItemValue(DistributionNoneItem::P_VALUE).toDouble();
} }
std::unique_ptr<IDistribution1D> BeamAzimuthalAngleItem::createDistribution1D() const double BeamInclinationAngleItem::scaleFactor() const
{ {
if(auto distItem = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION))) return Units::degree;
return distItem->createDistribution(Units::degree);
return {};
} }
...@@ -27,7 +27,7 @@ public: ...@@ -27,7 +27,7 @@ public:
double azimuthalAngle() const; double azimuthalAngle() const;
protected: protected:
virtual std::unique_ptr<IDistribution1D> createDistribution1D() const override; virtual double scaleFactor() const;
}; };
class BA_CORE_API_ BeamInclinationAngleItem : public BeamDistributionItem class BA_CORE_API_ BeamInclinationAngleItem : public BeamDistributionItem
...@@ -38,7 +38,7 @@ public: ...@@ -38,7 +38,7 @@ public:
double inclinationAngle() const; double inclinationAngle() const;
protected: protected:
virtual std::unique_ptr<IDistribution1D> createDistribution1D() const override; virtual double scaleFactor() const;
}; };
#endif // BEAMANGLEITEMS_H #endif // BEAMANGLEITEMS_H
...@@ -55,21 +55,20 @@ BeamDistributionItem::getParameterDistributionForName(const std::string& paramet ...@@ -55,21 +55,20 @@ BeamDistributionItem::getParameterDistributionForName(const std::string& paramet
sigma_factor sigma_factor
= distributionItem->getItemValue(DistributionItem::P_SIGMA_FACTOR).toInt(); = distributionItem->getItemValue(DistributionItem::P_SIGMA_FACTOR).toInt();
} }
RealLimits limits;
SessionItem* distributionNoneValueItem SessionItem* valueItem = getGroupItem(P_DISTRIBUTION, Constants::DistributionNoneType)
= getGroupItem(P_DISTRIBUTION, Constants::DistributionNoneType) ->getItem(DistributionNoneItem::P_VALUE);
->getItem(DistributionNoneItem::P_VALUE);
if (modelType() == Constants::BeamWavelengthType) { RealLimits origLimits = valueItem->limits();
limits = distributionNoneValueItem->limits();
} else { RealLimits domainLimits;
RealLimits orig = distributionNoneValueItem->limits(); if (origLimits.hasLowerLimit())
if (orig.hasLowerLimit()) domainLimits.setLowerLimit(origLimits.getLowerLimit()/scaleFactor());
limits.setLowerLimit(Units::deg2rad(orig.getLowerLimit())); if (origLimits.hasUpperLimit())
if (orig.hasUpperLimit()) domainLimits.setUpperLimit(origLimits.getUpperLimit()/scaleFactor());
limits.setUpperLimit(Units::deg2rad(orig.getUpperLimit()));
}
P_par_distr = GUIHelpers::make_unique<ParameterDistribution>( P_par_distr = GUIHelpers::make_unique<ParameterDistribution>(
parameter_name, *P_distribution, nbr_samples, sigma_factor, limits); parameter_name, *P_distribution, nbr_samples, sigma_factor, domainLimits);
} }
} }
return P_par_distr; return P_par_distr;
...@@ -114,11 +113,19 @@ double BeamDistributionItem::meanValue() const ...@@ -114,11 +113,19 @@ double BeamDistributionItem::meanValue() const
{ {
std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D(); std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D();
if (domainDistr) if (domainDistr)
return domainDistr->getMean(); return scaleFactor()*domainDistr->getMean();
else else
return getGroupItem(P_DISTRIBUTION)->getItemValue(DistributionNoneItem::P_VALUE).toDouble(); return getGroupItem(P_DISTRIBUTION)->getItemValue(DistributionNoneItem::P_VALUE).toDouble();
} }
//! Scales the values provided by distribution (to perform deg->rad convertion in the case
//! of AngleDistributionItems.
double BeamDistributionItem::scaleFactor() const
{
return 1.0;
}
void BeamDistributionItem::register_distribution_group() void BeamDistributionItem::register_distribution_group()
{ {
addGroupProperty(P_DISTRIBUTION, Constants::DistributionExtendedGroup); addGroupProperty(P_DISTRIBUTION, Constants::DistributionExtendedGroup);
...@@ -128,7 +135,7 @@ void BeamDistributionItem::register_distribution_group() ...@@ -128,7 +135,7 @@ void BeamDistributionItem::register_distribution_group()
std::unique_ptr<IDistribution1D> BeamDistributionItem::createDistribution1D() const std::unique_ptr<IDistribution1D> BeamDistributionItem::createDistribution1D() const
{ {
if (auto distItem = dynamic_cast<DistributionItem*>(getGroupItem(P_DISTRIBUTION))) if (auto distItem = dynamic_cast<DistributionItem*>(getGroupItem(P_DISTRIBUTION)))
return distItem->createDistribution(); return distItem->createDistribution(scaleFactor());
return {}; return {};
} }
...@@ -23,6 +23,7 @@ class ParameterDistribution; ...@@ -23,6 +23,7 @@ class ParameterDistribution;
//! The BeamDistributionItem handles wavelength, inclination and azimuthal parameter //! The BeamDistributionItem handles wavelength, inclination and azimuthal parameter
//! distribution for BeamItem //! distribution for BeamItem
class BA_CORE_API_ BeamDistributionItem : public SessionItem class BA_CORE_API_ BeamDistributionItem : public SessionItem
{ {
public: public:
...@@ -35,6 +36,7 @@ public: ...@@ -35,6 +36,7 @@ public:
virtual double meanValue() const; virtual double meanValue() const;
protected: protected:
virtual double scaleFactor() const;
void register_distribution_group(); void register_distribution_group();
void initDistributionItem(); void initDistributionItem();
......
...@@ -33,5 +33,5 @@ BeamWavelengthItem::BeamWavelengthItem() ...@@ -33,5 +33,5 @@ BeamWavelengthItem::BeamWavelengthItem()
double BeamWavelengthItem::wavelength() const double BeamWavelengthItem::wavelength() const
{ {
return this->meanValue(); return BeamDistributionItem::meanValue();
} }
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