Skip to content
Snippets Groups Projects
Commit 408b8dcb authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

PolFilter: internally, store Bloch vector

parent f31baa8e
No related branches found
No related tags found
1 merge request!1733Align polarization with PhysRef; simplify and unify API and GUI
......@@ -17,21 +17,13 @@
#include "Base/Util/Assert.h"
PolFilter::PolFilter(R3 direction, double efficiency, double transmission)
: m_vecBloch(direction * efficiency)
, m_transmission(transmission)
{
ASSERT(transmission == 0.5);
double aplus = transmission * (1.0 + efficiency);
double amin = transmission * (1.0 - efficiency);
if (aplus < 0.0 || aplus > 1.0 || amin < 0.0 || amin > 1.0)
throw std::runtime_error("Invalid efficiency and transmission for polarization analyzer");
if (efficiency == 0.0 || transmission == 0.0 || direction.mag() == 0.0) {
m_direction = {};
m_efficiency = 0;
m_transmission = transmission;
} else {
m_direction = direction.unit_or_throw();
m_efficiency = efficiency;
m_transmission = transmission;
}
if (m_transmission < 0 || m_transmission > 0.5)
throw std::runtime_error("Invalid polarizer transmission");
if (m_vecBloch.mag2() > 1)
throw std::runtime_error("Invalid polarizer Bloch vector");
}
PolFilter::PolFilter()
......@@ -41,20 +33,17 @@ PolFilter::PolFilter()
SpinMatrix PolFilter::matrix() const
{
if (m_direction.mag() == 0.0 || m_efficiency == 0.0)
return m_transmission * SpinMatrix::One();
R3 v = m_direction.unit_or_throw() * m_efficiency;
return 2 * m_transmission * SpinMatrix::FromBlochVector(v);
return 2 * m_transmission * SpinMatrix::FromBlochVector(m_vecBloch);
}
R3 PolFilter::analyzerDirection() const
{
return m_direction;
return m_vecBloch.unit_or_null();
}
double PolFilter::analyzerEfficiency() const
{
return m_efficiency;
return m_vecBloch.mag();
}
double PolFilter::transmission() const
......
......@@ -43,8 +43,7 @@ public:
double transmission() const;
private:
R3 m_direction; //!< direction of polarization analysis
double m_efficiency; //!< efficiency of polarization analysis
R3 m_vecBloch; //!< Bloch vector (efficiency * polarization_direction)
double m_transmission; //!< transmission of unpolarized beam
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment