80 void addDistributionToBeamItem(
const std::string& parameter_name,
const QString& item_name,
95 auto pdf = OnlyChildOfType<IFTDecayFunction1D>(sample);
97 SetDecayFunction1D(item, pdf, group_name);
98 setPositionVariance(item, sample);
104 set2DLatticeParameters(item, sample.
lattice());
109 auto p_pdf = OnlyChildOfType<IFTDecayFunction2D>(sample);
111 SetDecayFunction2D(item, p_pdf, group_name);
112 setPositionVariance(item, sample);
118 set2DLatticeParameters(item, sample.
lattice());
129 auto pdfs = ChildNodesOfType<IFTDistribution2D>(sample);
130 QStringList group_names;
133 for (
unsigned i = 0; i < pdfs.size(); ++i)
134 setPDF2D(item, pdfs[i], group_names[i]);
135 setPositionVariance(item, sample);
141 set2DLatticeParameters(item, sample.
lattice());
151 setPositionVariance(item, sample);
159 setPositionVariance(item, sample);
173 auto ipdf = OnlyChildOfType<IFTDistribution1D>(sample);
175 SetPDF1D(item, ipdf, group_name);
176 setPositionVariance(item, sample);
219 double unit_factor(1.0);
224 setDistribution(distItem, par_distr, group_name, unit_factor);
251 for (
size_t i = 0; i < distributions.size(); ++i) {
255 distributions[i], beam_item);
279 const Beam& beam = simulation.
beam();
296 if (!resolution->empty()) {
298 double std_dev = resolution->stdDevs(mean, 1).front();
300 *resolution->distribution(), mean, std_dev);
304 if (resolution && !resolution->empty()) {
305 double std_dev = resolution->
stdDevs(0.0, 1).front();
307 *resolution->distribution(), 0.0, std_dev);
337 "TransformFromDomain::setDetectorGeometry() -> Unknown detector type.");
351 p_convfunc->getResolutionFunction2D())) {
353 "ResolutionFunction2DGaussian");
355 if (detector_item->
modelType() ==
"SphericalDetector")
358 scale * resfunc->getSigmaX());
360 scale * resfunc->getSigmaY());
362 throw GUIHelpers::Error(
"TransformFromDomain::setDetectorResolution() -> Error. "
363 "Unknown detector resolution function");
366 throw GUIHelpers::Error(
"TransformFromDomain::setDetectorResolution() -> Error. "
367 "Not a ConvolutionDetectorResolution function");
375 if (total_transmission <= 0.0)
389 const IAxis& phi_axis = detector.
axis(0);
390 const IAxis& alpha_axis = detector.
axis(1);
407 auto xAxisItem = detector_item->
xAxisItem();
409 xAxisItem->setUpperBound(detector.
getWidth());
411 auto yAxisItem = detector_item->
yAxisItem();
413 yAxisItem->setUpperBound(detector.
getHeight());
459 "TransformFromDomain::setItemFromSample(RectangularDetectorItem* detectorItem "
460 "Error. Unknown detector arrangement");
473 if (detector_item->
modelType() ==
"SphericalDetector")
484 for (
size_t i_mask = 0; i_mask < detectorMask->numberOfMasks(); ++i_mask) {
485 bool mask_value(
false);
486 const IShape2D* shape = detectorMask->getMaskShape(i_mask, mask_value);
488 if (
const Ellipse* ellipse =
dynamic_cast<const Ellipse*
>(shape)) {
510 else if (
const Polygon* polygon =
dynamic_cast<const Polygon*
>(shape)) {
512 std::vector<double> xpos, ypos;
513 polygon->getPoints(xpos, ypos);
514 for (
size_t i_point = 0; i_point < xpos.size(); ++i_point) {
569 ASSERT(beam_distribution_item);
573 "TransformFromDomain::setItemFromSample(BeamDistributionItem* beamDistributionItem,"
574 "const ParameterDistribution& parameterDistribution) -> Error. ParameterDistribution "
575 "with defined min,max are not yet implemented in GUI");
578 const double unit_factor = 1.0 / beam_distribution_item->
scaleFactor();
580 setDistribution(beam_distribution_item, parameter_distribution, group_name, unit_factor);
588 auto constant_bg_item =
590 double value = p_constant_bg->backgroundValue();
602 if (
const auto gaussian_fp =
dynamic_cast<const FootprintGauss*
>(footprint)) {
603 auto gaussian_fp_item =
605 const double value = gaussian_fp->widthRatio();
607 }
else if (
const auto square_fp =
dynamic_cast<const FootprintSquare*
>(footprint)) {
608 auto square_fp_item =
610 const double value = square_fp->widthRatio();
618 throw GUIHelpers::Error(
"TransformFromDomain::setAxisItem() -> Error. Unexpected item.");
621 throw GUIHelpers::Error(
"TransformFromDomain::setAxisItem() -> Error. Unexpected axis");
753 if (lattice.
getName() ==
"SquareLattice2D") {
758 }
else if (lattice.
getName() ==
"HexagonalLattice2D") {
760 "HexagonalLattice2D");
782 QString group_name,
double factor)
793 item = part_distr_item->
setGroupProperty(group_name,
"DistributionLorentz");
798 item = part_distr_item->
setGroupProperty(group_name,
"DistributionGaussian");
803 item = part_distr_item->
setGroupProperty(group_name,
"DistributionLogNormal");
813 item = part_distr_item->
setGroupProperty(group_name,
"DistributionTrapezoid");
817 factor * distr->getMiddleWidth());
819 factor * distr->getRightWidth());
821 throw GUIHelpers::Error(
"TransformFromDomain::setDistribution: -> unknown distribution");
837 void addDistributionToBeamItem(
const std::string& parameter_name,
const QString& item_name,
Declares AngularSpecScan class.
#define ASSERT(condition)
Defines various axis items.
Defines BackgroundItem classes.
Defines class BeamAngleItems.
Defines class ConstantBackground.
Defines class ConvolutionDetectorResolution.
Defines classes representing one-dimensional distributions.
Defines FTDecayFunction1DItem classes.
Defines FTDistribution1DItem's classes.
Defines class GISASSimulation.
Defines class GUIHelpers functions.
Defines class InfinitePlane.
Defines InstrumentItems classes.
Defines InterferenceFunctionItems's classes.
Includes all interference function definitions.
Defines classes Lattice2DItems.
Defines class LayerInterface.
Defines classes LayerRoughnessItems.
Defines class LayerRoughness.
Defines MaskItems classes.
Defines namespace node_progeny.
Defines class OffSpecularSimulation.
Defines class ParameterPattern.
Defines class ParticleDistributionItem.
Defines class ParticleItem.
Defines class PoissonNoiseBackground.
Defines classes representing ranged one-dimensional distributions.
Defines class RectangularDetectorItem.
Defines class RectangularDetector.
Defines class RegionOfInterest.
Defines class ResolutionFunction2DGaussian.
Defines family of ResolutionFunctionItem.
Defines scan resolution class.
Declares the class SpecularBeamInclinationItem.
Defines class SpecularSimulation.
Defines class SphericalDetectorItem.
Defines class SphericalDetector.
Defines namespace TransformFromDomain.
Defines some unit conversion factors and other constants in namespace Units.
Defines class VectorItem.
Scan type with inclination angles as coordinate values and a unique wavelength.
const ScanResolution * wavelengthResolution() const
const ScanResolution * angleResolution() const
double wavelength() const
void setBinCount(int value)
static const QString P_NBINS
static const QString P_MAX_DEG
static const QString P_TITLE
static const QString P_MIN_DEG
static const QString P_LATTICE_ANGLE
static const QString P_LATTICE_LENGTH2
static const QString P_LATTICE_LENGTH1
The BeamDistributionItem handles wavelength, inclination and azimuthal parameter distribution for Bea...
static const QString P_DISTRIBUTION
virtual double scaleFactor() const
Scales the values provided by distribution (to perform deg->rad conversion in the case of AngleDistri...
static const QString P_AZIMUTHAL_ANGLE
void setWavelength(double value)
static const QString P_WAVELENGTH
static const QString P_INCLINATION_ANGLE
virtual void setInclinationAngle(double value)
void setIntensity(double value)
void setAzimuthalAngle(double value)
static const QString P_POLARIZATION
An incident neutron or x-ray beam.
Direction direction() const
double intensity() const
Returns the beam intensity in neutrons/sec.
double wavelength() const
kvector_t getBlochVector() const
static const QString P_VALUE
Class representing a constant background signal.
Convolutes the intensity in 1 or 2 dimensions with a resolution function.
double analyzerEfficiency() const
will always return positive value
double analyzerTotalTransmission() const
kvector_t analyzerDirection() const
Retrieve the analyzer characteristics.
MaskContainerItem * maskContainerItem() const
static const QString P_ANALYZER_EFFICIENCY
static const QString P_ANALYZER_DIRECTION
static const QString P_RESOLUTION_FUNCTION
static const QString P_ANALYZER_TOTAL_TRANSMISSION
void createMaskContainer()
size_t numberOfMasks() const
static const QString P_SIGMA
static const QString P_MAX
static const QString P_MIN
Uniform distribution function with half width hwhm.
static const QString P_STD_DEV
Gaussian distribution with standard deviation std_dev.
const Distributions_t & getDistributions() const
std::vector< ParameterDistribution > Distributions_t
void init_limits_group(const RealLimits &limits, double factor=1.0)
static const QString P_LIMITS
static const QString P_NUMBER_OF_SAMPLES
static const QString P_SIGMA_FACTOR
static const QString P_MEDIAN
static const QString P_SCALE_PAR
static const QString P_HWHM
Lorentz distribution with half width hwhm.
static const QString P_LEFTWIDTH
static const QString P_RIGHTWIDTH
static const QString P_MIDDLEWIDTH
static const QString P_CENTER
Trapezoidal distribution.
static const QString P_XRADIUS
static const QString P_YRADIUS
static const QString P_XCENTER
static const QString P_ANGLE
static const QString P_YCENTER
An ellipse, for use in detector masks.
One-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-|x|/decay_length) in r...
One-dimensional Gauss decay function in reciprocal space; corresponds to exp[-x^2/(2*decay_length^2)]...
static const QString P_DECAY_LENGTH
One-dimensional triangle decay function in reciprocal space; corresponds to 1-|x|/decay_length if |x|...
static const QString P_ETA
One-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*C...
Two-dimensional Cauchy decay function in reciprocal space; corresponds to exp(-r) in real space,...
Two-dimensional Gauss decay function in reciprocal space; corresponds to exp(-r^2/2) in real space,...
static const QString P_DECAY_LENGTH_X
static const QString P_DECAY_LENGTH_Y
static const QString P_GAMMA
static const QString P_ETA
Two-dimensional pseudo-Voigt decay function in reciprocal space; corresponds to eta*Gauss + (1-eta)*C...
Exponential IFTDistribution1D exp(-|omega*x|); its Fourier transform evaluate(q) is a Cauchy-Lorentzi...
IFTDistribution1D consisting of one cosine wave [1+cos(pi*x/omega) if |x|<omega, and 0 otherwise]; it...
Square gate IFTDistribution1D; its Fourier transform evaluate(q) is a sinc function starting at evalu...
Gaussian IFTDistribution1D; its Fourier transform evaluate(q) is a Gaussian starting at evaluate(0)=1...
static const QString P_OMEGA
Triangle IFTDistribution1D [1-|x|/omega if |x|<omega, and 0 otherwise]; its Fourier transform evaluat...
static const QString P_ETA
IFTDistribution1D that provides a Fourier transform evaluate(q) in form of a pseudo-Voigt decay funct...
Two-dimensional Cauchy distribution in Fourier space; corresponds to a normalized exp(-r) in real spa...
Two-dimensional cone distribution in Fourier space; corresponds to 1-r if r<1 (and 0 otherwise) in re...
Two-dimensional gate distribution in Fourier space; corresponds to normalized constant if r<1 (and 0 ...
Two-dimensional Gauss distribution in Fourier space; corresponds to normalized exp(-r^2/2) in real sp...
static const QString P_OMEGA_X
static const QString P_GAMMA
static const QString P_OMEGA_Y
static const QString P_ETA
Two-dimensional Voigt distribution in Fourier space; corresponds to eta*Gauss + (1-eta)*Cauchy.
Axis with fixed bin size.
Main class to run a Grazing-Incidence Small-Angle Scattering simulation.
static const QString P_LATTICE_LENGTH
static const QString P_POSY
An infinite horizontal line.
Interface for one-dimensional axes.
virtual double upperBound() const =0
Returns value of last point of axis.
virtual size_t size() const =0
retrieve the number of bins
virtual double lowerBound() const =0
Returns value of first point of axis.
std::string getName() const
retrieve the label of the axis
Interface for detector resolution algorithms.
Abstract detector interface.
virtual const DetectorMask * detectorMask() const =0
Returns detector masks container.
const IAxis & axis(size_t index) const
const IDetectorResolution * detectorResolution() const
Returns a pointer to detector resolution object.
virtual const RegionOfInterest * regionOfInterest() const =0
Returns region of interest if exists.
const DetectionProperties & detectionProperties() const
Returns detection properties.
Interface for one-dimensional distributions.
Interface for a one-dimensional decay function, with evaluate(q) returning the Fourier transform,...
Interface for two-dimensional decay function in reciprocal space.
Interface for a one-dimensional distribution, with normalization adjusted so that the Fourier transfo...
Interface for two-dimensional distributions in Fourier space.
Abstract base class of interference functions.
double positionVariance() const
Returns the position variance.
const std::string & getName() const
Interface for one-dimensional ranged distributions.
double sigmaFactor() const
Returns sigma factor to use during sampling.
std::unique_ptr< IDistribution1D > distribution(double mean, double stddev) const
Public interface function to underlying IDistribution1D object.
RealLimits limits() const
Returns current limits of the distribution.
size_t nSamples() const
Returns number of samples to generate.
Basic class for all shapes in 2D.
Abstract base class of OffSpecularSimulation and GISASSimulation.
Abstract base class of OffSpecularSimulation, GISASSimulation and SpecularSimulation.
const DistributionHandler & getDistributionHandler() const
const IBackground * background() const
IDetector * getDetector()
The infinite plane is used for masking the entire detector.
void setDetectorGroup(const QString &modelType)
DetectorItem * detectorItem() const
static const QString P_BACKGROUND
static const QString P_DECAY_FUNCTION
static const QString P_LENGTH
static const QString P_ROTATION_ANGLE
Interference function of a 1D lattice.
static const QString P_XI_INTEGRATION
static const QString P_LATTICE_TYPE
static const QString P_DECAY_FUNCTION
Interference function of a 2D lattice.
bool integrationOverXi() const
const Lattice2D & lattice() const
static const QString P_PDF1
static const QString P_XI_INTEGRATION
static const QString P_DOMAIN_SIZE2
static const QString P_PDF2
static const QString P_DAMPING_LENGTH
static const QString P_DOMAIN_SIZE1
Interference function of a 2D paracrystal.
std::vector< double > domainSizes() const
const Lattice2D & lattice() const
double dampingLength() const
bool integrationOverXi() const
static const QString P_XI_INTEGRATION
static const QString P_DOMAIN_SIZE_1
static const QString P_DOMAIN_SIZE_2
Interference function of a finite 2D lattice.
bool integrationOverXi() const
const Lattice2D & lattice() const
unsigned numberUnitCells1() const
unsigned numberUnitCells2() const
static const QString P_DENSITY
static const QString P_RADIUS
Percus-Yevick hard disk interference function.
static const QString P_POSITION_VARIANCE
static const QString P_KAPPA
static const QString P_PEAK_DISTANCE
static const QString P_DOMAIN_SIZE
static const QString P_PDF
static const QString P_DAMPING_LENGTH
Interference function of radial paracrystal.
double peakDistance() const
double domainSize() const
double dampingLength() const
static const QString P_LATTICE_ROTATION_ANGLE
A two-dimensional Bravais lattice.
double rotationAngle() const
virtual double latticeAngle() const =0
virtual double length2() const =0
virtual double length1() const =0
static const QString P_LATERAL_CORR_LENGTH
static const QString P_SIGMA
static const QString P_HURST
Interface between two layers, possibly with roughness.
const LayerRoughness * getRoughness() const
Returns roughness of the interface.
static const QString P_THICKNESS
static const QString P_ROUGHNESS
static const QString P_NSLICES
A roughness of interface between two layers.
double getSigma() const
Returns rms of roughness.
double getLatteralCorrLength() const
Returns lateral correlation length.
double getHurstParameter() const
Returns hurst parameter.
A layer in a MultiLayer sample.
unsigned int numberOfSlices() const
Container holding various masks as children.
static const QString P_MASK_VALUE
Main class to run an off-specular simulation.
A parametric distribution function, for use with any model parameter.
size_t getNbrSamples() const
get number of samples for this distribution
const IDistribution1D * getDistribution() const
double getMaxValue() const
double getSigmaFactor() const
get the sigma factor
double getMinValue() const
std::vector< std::string > getLinkedParameterNames() const
get list of linked parameter names
RealLimits getLimits() const
std::string getMainParameterName() const
get the main parameter's name
Helper class for constructing parameter patterns.
ParameterPattern & beginsWith(std::string start_type)
std::string toStdString() const
ParameterPattern & add(std::string object_type)
static const QString P_DISTRIBUTION
void setDomainCacheNames(const QString &name, const QStringList &linked)
A particle type that is a parametric distribution of IParticle's.
ParameterDistribution parameterDistribution() const
Returns the distributed parameter data.
std::string mainUnits() const
static const QString P_ABUNDANCE
Class representing Poisson noise on top of the scattered intensity.
static const QString P_ISCLOSED
static const QString P_POSX
static const QString P_POSY
A polygon, for use in detector masks.
static const QString P_XUP
static const QString P_YLOW
static const QString P_YUP
static const QString P_XLOW
A rectangle, for use in detector masks.
const BasicAxisItem * xAxisItem() const
static const QString P_DIRECTION
void setDetectorAlignment(const QString &alignment)
static const QString P_V0
static const QString P_NORMAL
static const QString P_DBEAM_V0
static const QString P_DISTANCE
static const QString P_U0
static const QString P_DBEAM_U0
const BasicAxisItem * yAxisItem() const
A flat rectangular detector with axes and resolution function.
double getDistance() const
@ PERPENDICULAR_TO_DIRECT_BEAM
@ PERPENDICULAR_TO_SAMPLE
@ PERPENDICULAR_TO_REFLECTED_BEAM_DPOS
@ PERPENDICULAR_TO_REFLECTED_BEAM
EDetectorArrangement getDetectorArrangment() const
double getDirectBeamV0() const
kvector_t getDirectionVector() const
double getDirectBeamU0() const
kvector_t getNormalVector() const
static const QString P_SIGMA_Y
static const QString P_SIGMA_X
Simple gaussian two-dimensional resolution function.
virtual std::vector< double > stdDevs(double mean, size_t n_times) const =0
bool isTag(const QString &name) const
Returns true if tag is available.
bool insertItem(int row, SessionItem *item, const QString &tag="")
Insert item into given tag into given row.
T * item(const QString &tag) const
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
SessionItem * setGroupProperty(const QString &groupTag, const QString &modelType) const
Set the current type of group item.
QString modelType() const
Get model type.
SessionItem * getItem(const QString &tag="", int row=0) const
Returns item in given row of given tag.
static const QString P_FOOPTPRINT
void setInclinationAngle(double value) override
BasicAxisItem * currentInclinationAxisItem()
Main class to run a specular simulation.
const IAxis * coordinateAxis() const
Returns a pointer to coordinate axis.
const IFootprintFactor * footprintFactor() const
Returns a pointer to footprint factor holder.
const ISpecularScan * dataHandler() const
Returns internal data handler.
const BasicAxisItem * alphaAxisItem() const
const BasicAxisItem * phiAxisItem() const
A detector with coordinate axes along angles phi and alpha.
static const QString P_LATTICE_LENGTH
static const QString P_MEAN
static const QString P_POSX
An infinite vertical line.
QStringList fromStdStrings(const std::vector< std::string > &container)
void setFinite2DLatticeItem(SessionItem *item, const InterferenceFunctionFinite2DLattice &sample)
void setRadialParaCrystalItem(SessionItem *item, const InterferenceFunctionRadialParaCrystal &sample)
bool isValidRoughness(const LayerRoughness *roughness)
Returns true if given roughness is non-zero roughness.
void setGISASBeamItem(BeamItem *beam_item, const GISASSimulation &simulation)
void setOffSpecularBeamItem(BeamItem *beam_item, const OffSpecularSimulation &simulation)
void setAxisItem(SessionItem *item, const IAxis &axis, double factor=1.0)
void setItemFromSample(BeamDistributionItem *beam_distribution_item, const ParameterDistribution ¶meter_distribution)
void setRectangularDetector(RectangularDetectorItem *detector_item, const RectangularDetector &detector)
void setHardDiskItem(SessionItem *item, const InterferenceFunctionHardDisk &sample)
void set2DParaCrystalItem(SessionItem *item, const InterferenceFunction2DParaCrystal &sample)
void setRoughnessItem(SessionItem *item, const LayerRoughness &sample)
void setSphericalDetector(SphericalDetectorItem *detector_item, const SphericalDetector &detector)
void setDetectorResolution(DetectorItem *detector_item, const IDetector &detector)
void setDetectorGeometry(Instrument2DItem *instrument_item, const IDetector &detector)
void setLayerItem(SessionItem *layer_item, const Layer *layer, const LayerInterface *top_interface)
void setDetector(Instrument2DItem *instrument_item, const ISimulation2D &simulation)
void setMaskContainer(MaskContainerItem *container_item, const IDetector &detector, double scale)
void set2DLatticeItem(SessionItem *item, const InterferenceFunction2DLattice &sample)
void setDetectorProperties(DetectorItem *detector_item, const IDetector &detector)
void setBackground(InstrumentItem *instrument_item, const ISimulation &simulation)
void set1DLatticeItem(SessionItem *item, const InterferenceFunction1DLattice &sample)
void setParticleDistributionItem(SessionItem *item, const ParticleDistribution &sample)
Initialization of ParticleDistributionItem.
void setDetectorMasks(DetectorItem *detector_item, const ISimulation &simulation)
void setFootprintFactor(const IFootprintFactor *footprint, SpecularBeamItem *beam_item)
void setSpecularBeamItem(SpecularBeamItem *beam_item, const SpecularSimulation &simulation)
static constexpr double deg
double rad2deg(double angle)