23 #if !defined(LSST_AFW_IMAGE_PIXEL_H) 
   24 #define LSST_AFW_IMAGE_PIXEL_H 
   29 #include <type_traits> 
   38 template <
typename, 
typename, 
typename, 
typename, 
typename>
 
   72 template <
typename _ImagePixelT, 
typename _MaskPixelT, 
typename _VariancePixelT = 
double>
 
   75     template <
typename, 
typename, 
typename>
 
   87     template <
typename rhsExpr>
 
  104             : _image(
std::numeric_limits<_ImagePixelT>::has_quiet_NaN
 
  105                              ? 
std::numeric_limits<_ImagePixelT>::quiet_NaN()
 
  108               _variance(
std::numeric_limits<_VariancePixelT>::has_quiet_NaN
 
  109                                 ? 
std::numeric_limits<_VariancePixelT>::quiet_NaN()
 
  118 template <
typename PixelT>
 
  127 template <
typename _ImagePixelT, 
typename _MaskPixelT, 
typename _VariancePixelT>
 
  140 template <
typename ImagePixelT, 
typename MaskPixelT, 
typename VariancePixelT>
 
  147 template <
typename _ImagePixelT, 
typename _MaskPixelT, 
typename _VariancePixelT = 
double>
 
  169             : _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {}
 
  178         _image = rhs.
image();
 
  188     template <
typename rhsExpr>
 
  190         _variance = rhs.variance();  
 
  191         _image = rhs.image();
 
  227     template <
typename T1>
 
  229         return lhs.
image() == rhs.image() && lhs.
mask() == rhs.mask() && lhs.
variance() == rhs.variance();
 
  233     template <
typename T1>
 
  235         return !(lhs == rhs);
 
  250     template <
typename ExprT>
 
  259     template <
typename ExprT>
 
  268     template <
typename ExprT>
 
  277     template <
typename ExprT>
 
  292 template <
typename ExprT>
 
  337 template <
typename T1>
 
  347 template <
typename T1>
 
  358 template <
typename T1>
 
  360     T1 
operator()(T1 
const& 
x, T1 
const& 
y, T1 
const& vx, T1 
const& vy)
 const {
 
  363         T1 
const iy2 = 1.0 / y2;
 
  364         return x2 * vy * iy2 * iy2 + vx * iy2;
 
  367     T1 
operator()(T1 
const&, T1 
const& 
y, T1 
const& vx)
 const { 
return vx / (
y * 
y); }
 
  375 template <
typename T1>
 
  377     T1 
operator()(T1 
const& 
x, T1 
const& 
y, T1 
const& vx, T1 
const& vy)
 const {
 
  380         return x2 * vy + y2 * vx;
 
  383     T1 
operator()(T1 
const&, T1 
const& 
y, T1 
const& vx)
 const { 
return vx * 
y * 
y; }
 
  391 template <
typename T1>
 
  393     T1 
operator()(T1 
const&, T1 
const&, T1 
const& vx, T1 
const& vy)
 const { 
return vx + vy; }
 
  395     T1 
operator()(T1 
const&, T1 
const&, T1 
const& vx)
 const { 
return vx; }
 
  405 template <
typename T1>
 
  409     T1 
operator()(T1 
const&, T1 
const&, T1 
const& vx, T1 
const& vy)
 const {
 
  410         return vx + vy + 2 * _alpha * sqrt(vx * vy);
 
  412     T1 
operator()(T1 
const&, T1 
const&, T1 
const& vx)
 const { 
return vx; }
 
  419 template <
typename ExprT1, 
typename ImageBinOp, 
typename MaskBinOp, 
typename VarianceBinOp>
 
  426     UnaryExpr(ExprT1 e1, ImageBinOp imageOp = ImageBinOp(), MaskBinOp maskOp = MaskBinOp(),
 
  427               VarianceBinOp varOp = VarianceBinOp())
 
  428             : _expr1(e1), _imageOp(imageOp), _maskOp(maskOp), _varOp(varOp) {}
 
  443     VarianceBinOp _varOp;
 
  447 template <
typename ExprT1, 
typename ExprT2, 
typename ImageBinOp, 
typename MaskBinOp, 
typename VarianceBinOp>
 
  454     BinaryExpr(ExprT1 e1, ExprT2 e2, ImageBinOp imageOp = ImageBinOp(), MaskBinOp maskOp = MaskBinOp(),
 
  455                VarianceBinOp varOp = VarianceBinOp())
 
  456             : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(varOp) {}
 
  460     BinaryExpr(ExprT1 e1, ExprT2 e2, 
double const alpha, ImageBinOp imageOp = ImageBinOp(),
 
  461                MaskBinOp maskOp = MaskBinOp(), VarianceBinOp = VarianceBinOp())
 
  462             : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(VarianceBinOp(alpha)) {}
 
  471         return _varOp(_expr1.image(), _expr2.image(), _expr1.variance(), _expr2.variance());
 
  479     VarianceBinOp _varOp;
 
  486 template <
typename ExprT1, 
typename ImageBinOp, 
typename MaskBinOp, 
typename VarianceBinOp>
 
  493     BinaryExpr(ExprT1 e1, 
double e2, ImageBinOp imageOp = ImageBinOp(), MaskBinOp maskOp = MaskBinOp(),
 
  494                VarianceBinOp varOp = VarianceBinOp())
 
  495             : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(varOp) {}
 
  499     BinaryExpr(ExprT1 e1, 
double e2, 
double const alpha, ImageBinOp imageOp = ImageBinOp(),
 
  500                MaskBinOp maskOp = MaskBinOp(), VarianceBinOp = VarianceBinOp())
 
  501             : _expr1(e1), _expr2(e2), _imageOp(imageOp), _maskOp(maskOp), _varOp(VarianceBinOp(alpha)) {}
 
  516     VarianceBinOp _varOp;
 
  520 template <
typename ExprT1>
 
  522           noop<typename exprTraits<ExprT1>::MaskPixelT>, noop<typename exprTraits<ExprT1>::VariancePixelT> >
 
  531 template <
class T, 
template <
class...> 
class Template>
 
  534 template <
template <
class...> 
class Template, 
class... Args>
 
  537 template <
typename ExprT1, 
typename ExprT2,
 
  538    typename = std::enable_if_t <
 
  541             is_specialization<ExprT1,SinglePixel>{} ||
 
  542             is_specialization<ExprT1,Pixel>{})
 
  545             is_specialization<ExprT2,BinaryExpr>{} ||
 
  546             is_specialization<ExprT2,SinglePixel>{} ||
 
  547             is_specialization<ExprT2,Pixel>{} )
 
  553 operator+(ExprT1 e1, ExprT2 e2) {
 
  560 template <
typename ExprT1, 
typename ExprT2>
 
  573 template <
typename ExprT1, 
typename ExprT2>
 
  574 ExprT1 doPlus(ExprT1 e1, ExprT2 e2, 
double const, boost::mpl::true_) {
 
  578 template <
typename ExprT1, 
typename ExprT2>
 
  580            bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
 
  581            variance_plus_covar<typename exprTraits<ExprT1>::VariancePixelT> >
 
  582 doPlus(ExprT1 e1, ExprT2 e2, 
double const alpha, boost::mpl::false_) {
 
  584                       bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
 
  585                       variance_plus_covar<typename exprTraits<ExprT1>::VariancePixelT> >(e1, e2, alpha);
 
  590 template <
typename ExprT1, 
typename ExprT2>
 
  601 template <
typename ExprT1, 
typename ExprT2>
 
  603            bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
 
  604            variance_plus<typename exprTraits<ExprT1>::VariancePixelT> >
 
  612 template <
typename ExprT1, 
typename ExprT2>
 
  622 template <
typename ExprT1, 
typename ExprT2>
 
  624            bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
 
  625            variance_multiplies<typename exprTraits<ExprT1>::VariancePixelT> >
 
  633 template <
typename ExprT1, 
typename ExprT2>
 
  643 template <
typename ExprT1, 
typename ExprT2>
 
  645            bitwise_or<typename exprTraits<ExprT1>::MaskPixelT>,
 
  646            variance_divides<typename exprTraits<ExprT1>::VariancePixelT> >
 
  654 template <
typename ExprT1, 
typename ExprT2>
 
  663 template <
typename ImagePixelT, 
typename MaskPixelT, 
typename VariancePixelT>
 
  669 template <
typename ImagePixelT, 
typename MaskPixelT, 
typename VariancePixelT>
 
  675 template <
typename ExprT1, 
typename ExprT2, 
typename BinOp, 
typename MaskBinOp, 
typename VarBinOp>
 
  685 template <
typename ImagePixelT, 
typename MaskPixelT, 
typename VariancePixelT>
 
  697 template <
typename ImagePixelT, 
typename MaskPixelT, 
typename VariancePixelT>
 
  698 struct hash<
lsst::afw::image::pixel::SinglePixel<ImagePixelT, MaskPixelT, VariancePixelT>> {
 
table::PointKey< int > pixel
 
VariancePixelT variance() const
evaluate the variance part of the expression
 
MaskPixelT mask() const
evaluate the mask part of the expression
 
BinaryExpr(ExprT1 e1, double e2, double const alpha, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations and an extra ...
 
typename exprTraits< ExprT1 >::MaskPixelT MaskPixelT
 
ImagePixelT image() const
evaluate the image part of the expression
 
typename exprTraits< ExprT1 >::VariancePixelT VariancePixelT
 
BinaryExpr(ExprT1 e1, double e2, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp varOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations.
 
typename exprTraits< ExprT1 >::ImagePixelT ImagePixelT
 
Class for representing binary operations.
 
typename exprTraits< ExprT1 >::VariancePixelT VariancePixelT
 
ImagePixelT image() const
evaluate the image part of the expression
 
typename exprTraits< ExprT1 >::ImagePixelT ImagePixelT
 
BinaryExpr(ExprT1 e1, ExprT2 e2, double const alpha, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations and an extra ...
 
BinaryExpr(ExprT1 e1, ExprT2 e2, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp varOp=VarianceBinOp())
A binary operation, with three functors to represent the image/mask/variance operations.
 
typename exprTraits< ExprT1 >::MaskPixelT MaskPixelT
 
VariancePixelT variance() const
evaluate the variance part of the expression
 
MaskPixelT mask() const
evaluate the mask part of the expression
 
A pixel of a MaskedImage.
 
MaskPixelT mask() const
Return the mask part of a Pixel.
 
Pixel(ImagePixelT const &image, MaskPixelT const &mask=0x0, VariancePixelT const &variance=0)
Construct a Pixel from references to its image/mask/variance components.
 
_VariancePixelT VariancePixelT
 
friend Pixel operator/=(Pixel const &e1, ExprT const &e2)
Evaluate e1 /= e2, and return e1.
 
Pixel operator=(Pixel const &rhs)
 
friend Pixel operator-=(Pixel const &e1, ExprT const &e2)
Evaluate e1 -= e2, and return e1.
 
Pixel(Pixel const &rhs)=default
 
ImagePixelT image() const
Return the image part of a Pixel.
 
Pixel(SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > &rhs)
 
friend bool operator==(Pixel const &lhs, T1 const &rhs)
Return true iff two pixels are equal (in all three of image, mask, and variance)
 
friend Pixel operator*=(Pixel const &e1, ExprT const &e2)
Evaluate e1 *= e2, and return e1.
 
Pixel operator=(rhsExpr const &rhs)
Assign a Pixel by evaluating an expression.
 
friend Pixel operator+=(Pixel const &e1, ExprT const &e2)
Evaluate e1 += e2, and return e1.
 
std::size_t hash_value() const noexcept
Return a hash of this object.
 
Pixel operator=(double const &rhs_image)
set the image part of a Pixel to rhs_image (the mask and variance are set to 0)
 
Pixel operator=(int const &rhs_image)
set the image part of a Pixel to rhs_image (the mask and variance are set to 0)
 
friend bool operator!=(Pixel const &lhs, T1 const &rhs)
Return true iff two pixels are unequal (in at least one of image, mask, and variance)
 
Pixel(Pixel &&rhs)=default
 
VariancePixelT variance() const
Return the variance part of a Pixel.
 
Pixel operator=(Pixel &&rhs)
 
A single pixel of the same type as a MaskedImage.
 
SinglePixel(rhsExpr const &rhs, typename std::enable_if<!std::is_fundamental< rhsExpr >::value, void * >::type dummy=nullptr)
 
VariancePixelT variance() const
 
SinglePixel(ImagePixelT image, MaskPixelT mask=0, VariancePixelT variance=0)
 
_VariancePixelT VariancePixelT
 
ImagePixelT image() const
 
Class for representing Unary operations.
 
VariancePixelT variance() const
evaluate the variance part of the expression
 
MaskPixelT mask() const
evaluate the mask part of the expression
 
UnaryExpr(ExprT1 e1, ImageBinOp imageOp=ImageBinOp(), MaskBinOp maskOp=MaskBinOp(), VarianceBinOp varOp=VarianceBinOp())
a unary expression, with three functors to represent the image/mask/variance operations
 
typename exprTraits< ExprT1 >::ImagePixelT ImagePixelT
 
typename exprTraits< ExprT1 >::VariancePixelT VariancePixelT
 
ImagePixelT image() const
evaluate the image part of the expression
 
typename exprTraits< ExprT1 >::MaskPixelT MaskPixelT
 
ExprT1 operator*=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 *= e2.
 
UnaryExpr< ExprT1, std::negate< typename exprTraits< ExprT1 >::ImagePixelT >, noop< typename exprTraits< ExprT1 >::MaskPixelT >, noop< typename exprTraits< ExprT1 >::VariancePixelT > > operator-(ExprT1 e1)
Template for -e1.
 
BinaryExpr< ExprT1, ExprT2, std::divides< typename exprTraits< ExprT1 >::ImagePixelT >, bitwise_or< typename exprTraits< ExprT1 >::MaskPixelT >, variance_divides< typename exprTraits< ExprT1 >::VariancePixelT > > operator/(ExprT1 e1, ExprT2 e2)
Template to evaluate (e1 / e2)
 
ExprT1 operator/=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 /= e2.
 
ExprT1 operator+=(ExprT1 &e1, ExprT2 e2)
template for e1 += e2
 
SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > makeSinglePixel(ImagePixelT x, MaskPixelT m, VariancePixelT v)
Return a SinglePixel.
 
std::ostream & operator<<(std::ostream &os, SinglePixel< ImagePixelT, MaskPixelT, VariancePixelT > const &v)
Print a SinglePixel.
 
ExprT1 operator-=(ExprT1 &e1, ExprT2 e2)
Template to evaluate e1 -= e2.
 
BinaryExpr< ExprT1, ExprT2, std::multiplies< typename exprTraits< ExprT1 >::ImagePixelT >, bitwise_or< typename exprTraits< ExprT1 >::MaskPixelT >, variance_multiplies< typename exprTraits< ExprT1 >::VariancePixelT > > operator*(ExprT1 e1, ExprT2 e2)
Template to evaluate (e1 * e2)
 
ExprT1 plus(ExprT1 &lhs, ExprT2 const &rhs, float covariance)
Like operator+(), but assume that covariance's 2*alpha*sqrt(vx*vy)
 
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
 
class[[deprecated("Removed with no replacement (but see lsst::afw::image::TransmissionCurve). Will be " "removed after v22.")]] FilterProperty final
Describe the properties of a Filter (e.g.
 
std::size_t hashCombine(std::size_t seed) noexcept
Combine hashes.
 
float Pixel
Typedefs to be used for pixel values.
 
A base class for image defects.
 
A class used to identify classes that represent MaskedImage pixels.
 
static const PixelT padValue()
The quantity to use when a pixel value is undefined.
 
static const PixelT padValue()
The quantity to use when a pixel value is undefined.
 
bitwise_or doesn't seem to be in std::
 
T1 operator()(const T1 &x, const T1 &y) const
 
T1 operator()(const T1 &x) const
 
exprTraits< double >::VariancePixelT VariancePixelT
 
exprTraits< double >::MaskPixelT MaskPixelT
 
exprTraits< double >::VariancePixelT VariancePixelT
 
exprTraits< double >::MaskPixelT MaskPixelT
 
exprTraits< double >::VariancePixelT VariancePixelT
 
exprTraits< double >::MaskPixelT MaskPixelT
 
A traits class to return the types of the image/mask/variance.
 
typename ExprT::ImagePixelT ImagePixelT
 
typename ExprT::MaskPixelT MaskPixelT
 
typename ExprT::VariancePixelT VariancePixelT
 
A noop functor (useful for e.g. masks and variances when changing the sign of the image)
 
T1 operator()(const T1 &x) const
 
Calculate the variance when we divide two Pixels.
 
T1 operator()(T1 const &, T1 const &y, T1 const &vx) const
 
T1 operator()(T1 const &x, T1 const &y, T1 const &vx, T1 const &vy) const
 
Calculate the variance when we multiply two Pixels.
 
T1 operator()(T1 const &x, T1 const &y, T1 const &vx, T1 const &vy) const
 
T1 operator()(T1 const &, T1 const &y, T1 const &vx) const
 
The variance of the sum of a pair of correlated pixels.
 
variance_plus_covar(double alpha=0)
 
T1 operator()(T1 const &, T1 const &, T1 const &vx) const
 
T1 operator()(T1 const &, T1 const &, T1 const &vx, T1 const &vy) const
 
Calculate the variance when we add (or subtract) two Pixels.
 
T1 operator()(T1 const &, T1 const &, T1 const &vx, T1 const &vy) const
 
T1 operator()(T1 const &, T1 const &, T1 const &vx) const
 
size_t operator()(argument_type const &obj) const noexcept
 
size_t operator()(argument_type const &obj) const noexcept