BornAgain  1.19.79
Open-source research software to simulate and fit neutron and x-ray reflectometry and grazing-incidence small-angle scattering
PolFilter Class Reference

Description

Detector properties (efficiency, transmission).

Definition at line 27 of file PolFilter.h.

Inheritance diagram for PolFilter:
[legend]
Collaboration diagram for PolFilter:
[legend]

Public Member Functions

 PolFilter ()
 
 PolFilter (R3 direction, double efficiency, double total_transmission)
 
 ~PolFilter () override=default
 
R3 analyzerDirection () const
 Retrieve the analyzer characteristics. More...
 
double analyzerEfficiency () const
 will always return positive value More...
 
void checkNodeArgs () const
 Raises exception if a parameter value is invalid. More...
 
std::string className () const final
 Returns the class name, to be hard-coded in each leaf class that inherits from INode. More...
 
SpinMatrix matrix () const
 Return the polarization density matrix (in spin basis along z-axis) More...
 
virtual std::vector< const INode * > nodeChildren () const
 Returns all children. More...
 
std::vector< const INode * > nodeOffspring () const
 Returns all descendants. More...
 
std::vector< ParaMetaparDefs () const final
 Returns the parameter definitions, to be hard-coded in each leaf class. More...
 
double totalTransmission () const
 

Protected Attributes

std::vector< double > m_P
 

Private Attributes

R3 m_direction
 direction of polarization analysis More...
 
double m_efficiency
 efficiency of polarization analysis More...
 
double m_total_transmission
 total transmission of polarization analysis More...
 

Constructor & Destructor Documentation

◆ PolFilter() [1/2]

PolFilter::PolFilter ( R3  direction,
double  efficiency,
double  total_transmission 
)

Definition at line 18 of file PolFilter.cpp.

19 {
20  double aplus = total_transmission * (1.0 + efficiency);
21  double amin = total_transmission * (1.0 - efficiency);
22  if (aplus < 0.0 || aplus > 1.0 || amin < 0.0 || amin > 1.0)
23  throw std::runtime_error("Invalid efficiency and transmission for polarization analyzer");
24  if (efficiency == 0.0 || total_transmission == 0.0 || direction.mag() == 0.0) {
25  m_direction = {};
26  m_efficiency = 0;
27  m_total_transmission = total_transmission;
28  } else {
29  m_direction = direction.unit();
30  m_efficiency = efficiency;
31  m_total_transmission = total_transmission;
32  }
33 }
double m_efficiency
efficiency of polarization analysis
Definition: PolFilter.h:50
R3 m_direction
direction of polarization analysis
Definition: PolFilter.h:49
double m_total_transmission
total transmission of polarization analysis
Definition: PolFilter.h:51

References m_direction, m_efficiency, and m_total_transmission.

◆ PolFilter() [2/2]

PolFilter::PolFilter ( )

Definition at line 35 of file PolFilter.cpp.

36  : PolFilter({}, 0.0, 1.0)
37 {
38 }

◆ ~PolFilter()

PolFilter::~PolFilter ( )
overridedefault

Member Function Documentation

◆ analyzerDirection()

R3 PolFilter::analyzerDirection ( ) const

Retrieve the analyzer characteristics.

Definition at line 48 of file PolFilter.cpp.

49 {
50  return m_direction;
51 }

References m_direction.

Referenced by ISimulation2D::force_polarized().

◆ analyzerEfficiency()

double PolFilter::analyzerEfficiency ( ) const

will always return positive value

Definition at line 53 of file PolFilter.cpp.

54 {
55  return m_efficiency;
56 }

References m_efficiency.

◆ checkNodeArgs()

void INode::checkNodeArgs ( ) const
inherited

Raises exception if a parameter value is invalid.

Definition at line 27 of file INode.cpp.

28 {
29  size_t nP = m_P.size();
30  if (parDefs().size() != nP) {
31  std::cerr << "BUG in class " << className() << std::endl;
32  std::cerr << "#m_P = " << nP << std::endl;
33  std::cerr << "#PDf = " << parDefs().size() << std::endl;
34  for (const ParaMeta& pm : parDefs())
35  std::cerr << " PDf: " << pm.name << std::endl;
36  ASSERT(0);
37  }
38  ASSERT(parDefs().size() == nP);
39  for (size_t i = 0; i < nP; ++i) {
40  const ParaMeta pm = parDefs()[i];
41 
43  if (pm.vMin == -INF) {
44  ASSERT(pm.vMax == +INF);
45  // nothing to do
46  } else if (pm.vMax == +INF) {
47  ASSERT(pm.vMin == 0);
48  limits = RealLimits::nonnegative();
49  } else {
50  limits = RealLimits::limited(pm.vMin, pm.vMax);
51  }
52  limits.check(pm.name, m_P[i]);
53  }
54 }
#define ASSERT(condition)
Definition: Assert.h:45
const double INF
Definition: INode.h:26
virtual std::vector< ParaMeta > parDefs() const
Returns the parameter definitions, to be hard-coded in each leaf class.
Definition: INode.h:51
std::vector< double > m_P
Definition: INode.h:63
virtual std::string className() const =0
Returns the class name, to be hard-coded in each leaf class that inherits from INode.
Limits for a real fit parameter.
Definition: RealLimits.h:24
static RealLimits limitless()
Creates an object without bounds (default)
Definition: RealLimits.cpp:139
void check(const std::string &name, double value) const
Throws if value is outside limits. Parameter 'name' is for exception message.
Definition: RealLimits.cpp:170
static RealLimits nonnegative()
Creates an object which can have only positive values with 0. included.
Definition: RealLimits.cpp:124
static RealLimits limited(double left_bound_value, double right_bound_value)
Creates an object bounded from the left and right.
Definition: RealLimits.cpp:134
Metadata of one model parameter.
Definition: INode.h:29
double vMin
Definition: INode.h:33
double vMax
Definition: INode.h:34
std::string name
Definition: INode.h:30

References ASSERT, RealLimits::check(), INode::className(), INF, RealLimits::limited(), RealLimits::limitless(), INode::m_P, ParaMeta::name, RealLimits::nonnegative(), INode::parDefs(), ParaMeta::vMax, and ParaMeta::vMin.

Referenced by BarGauss::BarGauss(), BarLorentz::BarLorentz(), Bipyramid4::Bipyramid4(), Box::Box(), CantellatedCube::CantellatedCube(), Cone::Cone(), ConstantBackground::ConstantBackground(), CosineRippleBox::CosineRippleBox(), CosineRippleGauss::CosineRippleGauss(), CosineRippleLorentz::CosineRippleLorentz(), Cylinder::Cylinder(), DistributionCosine::DistributionCosine(), DistributionGate::DistributionGate(), DistributionGaussian::DistributionGaussian(), DistributionLogNormal::DistributionLogNormal(), DistributionLorentz::DistributionLorentz(), DistributionTrapezoid::DistributionTrapezoid(), Dodecahedron::Dodecahedron(), EllipsoidalCylinder::EllipsoidalCylinder(), FootprintGauss::FootprintGauss(), FootprintSquare::FootprintSquare(), FuzzySphere::FuzzySphere(), GaussSphere::GaussSphere(), HemiEllipsoid::HemiEllipsoid(), HollowSphere::HollowSphere(), HorizontalCylinder::HorizontalCylinder(), Icosahedron::Icosahedron(), LongBoxGauss::LongBoxGauss(), LongBoxLorentz::LongBoxLorentz(), PlatonicOctahedron::PlatonicOctahedron(), PlatonicTetrahedron::PlatonicTetrahedron(), Prism3::Prism3(), Prism6::Prism6(), Profile1DCauchy::Profile1DCauchy(), Profile1DCosine::Profile1DCosine(), Profile1DGate::Profile1DGate(), Profile1DGauss::Profile1DGauss(), Profile1DTriangle::Profile1DTriangle(), Profile1DVoigt::Profile1DVoigt(), Profile2DCauchy::Profile2DCauchy(), Profile2DCone::Profile2DCone(), Profile2DGate::Profile2DGate(), Profile2DGauss::Profile2DGauss(), Profile2DVoigt::Profile2DVoigt(), Pyramid2::Pyramid2(), Pyramid3::Pyramid3(), Pyramid4::Pyramid4(), Pyramid6::Pyramid6(), RotationEuler::RotationEuler(), RotationX::RotationX(), RotationY::RotationY(), RotationZ::RotationZ(), SawtoothRippleBox::SawtoothRippleBox(), SawtoothRippleGauss::SawtoothRippleGauss(), SawtoothRippleLorentz::SawtoothRippleLorentz(), Sphere::Sphere(), Spheroid::Spheroid(), TruncatedCube::TruncatedCube(), TruncatedSphere::TruncatedSphere(), and TruncatedSpheroid::TruncatedSpheroid().

Here is the call graph for this function:

◆ className()

std::string PolFilter::className ( ) const
inlinefinalvirtual

Returns the class name, to be hard-coded in each leaf class that inherits from INode.

Implements INode.

Definition at line 33 of file PolFilter.h.

33 { return "PolFilter"; }

◆ matrix()

SpinMatrix PolFilter::matrix ( ) const

Return the polarization density matrix (in spin basis along z-axis)

Definition at line 40 of file PolFilter.cpp.

41 {
42  if (m_direction.mag() == 0.0 || m_efficiency == 0.0)
44  R3 v = m_direction.unit() * m_efficiency;
46 }
static SpinMatrix One()
Definition: SpinMatrix.cpp:36
static SpinMatrix FromBlochVector(const R3 &v)
Constructs matrix (I+v*s)/2, where s is the Pauli vector.
Definition: SpinMatrix.cpp:41

References SpinMatrix::FromBlochVector(), m_direction, m_efficiency, m_total_transmission, and SpinMatrix::One().

Referenced by ISimulation2D::generateElements(), and DetectorContext::setup_context().

Here is the call graph for this function:

◆ nodeChildren()

◆ nodeOffspring()

std::vector< const INode * > INode::nodeOffspring ( ) const
inherited

Returns all descendants.

Definition at line 61 of file INode.cpp.

62 {
63  std::vector<const INode*> result;
64  result.push_back(this);
65  for (const auto* child : nodeChildren()) {
66  for (const auto* p : child->nodeOffspring())
67  result.push_back(p);
68  }
69  return result;
70 }
virtual std::vector< const INode * > nodeChildren() const
Returns all children.
Definition: INode.cpp:56

References INode::nodeChildren().

Here is the call graph for this function:

◆ parDefs()

std::vector<ParaMeta> PolFilter::parDefs ( ) const
inlinefinalvirtual

Returns the parameter definitions, to be hard-coded in each leaf class.

Reimplemented from INode.

Definition at line 34 of file PolFilter.h.

35  {
36  return {{"Efficiency", "", "efficiency", 0, 1, 1},
37  {"Transmission", "", "total transmission", 0, 1, 1}};
38  }

◆ totalTransmission()

double PolFilter::totalTransmission ( ) const

Definition at line 58 of file PolFilter.cpp.

59 {
60  return m_total_transmission;
61 }

References m_total_transmission.

Member Data Documentation

◆ m_direction

R3 PolFilter::m_direction
private

direction of polarization analysis

Definition at line 49 of file PolFilter.h.

Referenced by PolFilter(), analyzerDirection(), and matrix().

◆ m_efficiency

double PolFilter::m_efficiency
private

efficiency of polarization analysis

Definition at line 50 of file PolFilter.h.

Referenced by PolFilter(), analyzerEfficiency(), and matrix().

◆ m_P

◆ m_total_transmission

double PolFilter::m_total_transmission
private

total transmission of polarization analysis

Definition at line 51 of file PolFilter.h.

Referenced by PolFilter(), matrix(), and totalTransmission().


The documentation for this class was generated from the following files: