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 @@
// ************************************************************************** //
#include "BeamAngleItems.h"
#include "Distributions.h"
#include "GUIHelpers.h"
#include "Units.h"
BeamInclinationAngleItem::BeamInclinationAngleItem()
: BeamDistributionItem(Constants::BeamInclinationAngleType)
BeamAzimuthalAngleItem::BeamAzimuthalAngleItem()
: BeamDistributionItem(Constants::BeamAzimuthalAngleType)
{
register_distribution_group();
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->setValue(0.2);
valueItem->setValue(0.0);
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();
if(domainDistr)
return Units::rad2deg(domainDistr->getMean());
else
return getGroupItem(P_DISTRIBUTION)->getItemValue(DistributionNoneItem::P_VALUE).toDouble();
return BeamDistributionItem::meanValue();
}
std::unique_ptr<IDistribution1D> BeamInclinationAngleItem::createDistribution1D() const
double BeamAzimuthalAngleItem::scaleFactor() const
{
if(auto distItem = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION)))
return distItem->createDistribution(Units::degree);
return {};
return Units::degree;
}
// -------------------------------------------------------------------------- //
// ------------------------------------------------------------------------------------------------
BeamAzimuthalAngleItem::BeamAzimuthalAngleItem()
: BeamDistributionItem(Constants::BeamAzimuthalAngleType)
BeamInclinationAngleItem::BeamInclinationAngleItem()
: BeamDistributionItem(Constants::BeamInclinationAngleType)
{
register_distribution_group();
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->setValue(0.0);
valueItem->setValue(0.2);
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();
if(domainDistr)
return Units::rad2deg(domainDistr->getMean());
else
return getGroupItem(P_DISTRIBUTION)->getItemValue(DistributionNoneItem::P_VALUE).toDouble();
return BeamDistributionItem::meanValue();
}
std::unique_ptr<IDistribution1D> BeamAzimuthalAngleItem::createDistribution1D() const
double BeamInclinationAngleItem::scaleFactor() const
{
if(auto distItem = dynamic_cast<DistributionItem *>(getGroupItem(P_DISTRIBUTION)))
return distItem->createDistribution(Units::degree);
return {};
return Units::degree;
}
......@@ -27,7 +27,7 @@ public:
double azimuthalAngle() const;
protected:
virtual std::unique_ptr<IDistribution1D> createDistribution1D() const override;
virtual double scaleFactor() const;
};
class BA_CORE_API_ BeamInclinationAngleItem : public BeamDistributionItem
......@@ -38,7 +38,7 @@ public:
double inclinationAngle() const;
protected:
virtual std::unique_ptr<IDistribution1D> createDistribution1D() const override;
virtual double scaleFactor() const;
};
#endif // BEAMANGLEITEMS_H
......@@ -55,21 +55,20 @@ BeamDistributionItem::getParameterDistributionForName(const std::string& paramet
sigma_factor
= distributionItem->getItemValue(DistributionItem::P_SIGMA_FACTOR).toInt();
}
RealLimits limits;
SessionItem* distributionNoneValueItem
= getGroupItem(P_DISTRIBUTION, Constants::DistributionNoneType)
->getItem(DistributionNoneItem::P_VALUE);
if (modelType() == Constants::BeamWavelengthType) {
limits = distributionNoneValueItem->limits();
} else {
RealLimits orig = distributionNoneValueItem->limits();
if (orig.hasLowerLimit())
limits.setLowerLimit(Units::deg2rad(orig.getLowerLimit()));
if (orig.hasUpperLimit())
limits.setUpperLimit(Units::deg2rad(orig.getUpperLimit()));
}
SessionItem* valueItem = getGroupItem(P_DISTRIBUTION, Constants::DistributionNoneType)
->getItem(DistributionNoneItem::P_VALUE);
RealLimits origLimits = valueItem->limits();
RealLimits domainLimits;
if (origLimits.hasLowerLimit())
domainLimits.setLowerLimit(origLimits.getLowerLimit()/scaleFactor());
if (origLimits.hasUpperLimit())
domainLimits.setUpperLimit(origLimits.getUpperLimit()/scaleFactor());
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;
......@@ -114,11 +113,19 @@ double BeamDistributionItem::meanValue() const
{
std::unique_ptr<IDistribution1D> domainDistr = createDistribution1D();
if (domainDistr)
return domainDistr->getMean();
return scaleFactor()*domainDistr->getMean();
else
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()
{
addGroupProperty(P_DISTRIBUTION, Constants::DistributionExtendedGroup);
......@@ -128,7 +135,7 @@ void BeamDistributionItem::register_distribution_group()
std::unique_ptr<IDistribution1D> BeamDistributionItem::createDistribution1D() const
{
if (auto distItem = dynamic_cast<DistributionItem*>(getGroupItem(P_DISTRIBUTION)))
return distItem->createDistribution();
return distItem->createDistribution(scaleFactor());
return {};
}
......@@ -23,6 +23,7 @@ class ParameterDistribution;
//! The BeamDistributionItem handles wavelength, inclination and azimuthal parameter
//! distribution for BeamItem
class BA_CORE_API_ BeamDistributionItem : public SessionItem
{
public:
......@@ -35,6 +36,7 @@ public:
virtual double meanValue() const;
protected:
virtual double scaleFactor() const;
void register_distribution_group();
void initDistributionItem();
......
......@@ -33,5 +33,5 @@ BeamWavelengthItem::BeamWavelengthItem()
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