diff --git a/Base/Axis/Frame.cpp b/Base/Axis/Frame.cpp
index 42fcd01187e4992049c9bb378cb14ef64f0b4a1f..a0be8e6bc83fc715fe0b86faf3ffaa3f0433634a 100644
--- a/Base/Axis/Frame.cpp
+++ b/Base/Axis/Frame.cpp
@@ -27,7 +27,12 @@ Frame::Frame(const std::vector<IAxis*>& axes)
 
 const IAxis& Frame::axis(size_t k_axis) const
 {
-    return *m_axes.at(k_axis);
+    return *m_axes[k_axis];
+}
+
+size_t Frame::projectedSize(size_t k_axis) const
+{
+    return m_axes[k_axis]->size();
 }
 
 double Frame::projectedCoord(size_t i_flat, size_t k_axis) const
diff --git a/Base/Axis/Frame.h b/Base/Axis/Frame.h
index 6e92e93c5e2544d10a297efb494cd3f4ec42c5a9..9c8a0f45253e15f3280291b73e2ce6b072364b55 100644
--- a/Base/Axis/Frame.h
+++ b/Base/Axis/Frame.h
@@ -36,6 +36,9 @@ public:
     //! Returns total number of bins.
     size_t size() const { return m_size; }
 
+    //! Returns number of bins along axis.
+    size_t projectedSize(size_t k_axis) const;
+
     //! Returns axis with given serial number
     const IAxis& axis(size_t k_axis) const;
 
diff --git a/Device/Histo/Histogram2D.cpp b/Device/Histo/Histogram2D.cpp
index 2e8eacdecd7b3c71857edd947939a8a9dd72329c..b97c52da08a8fa1e902848bf2a52e92fe2b025cf 100644
--- a/Device/Histo/Histogram2D.cpp
+++ b/Device/Histo/Histogram2D.cpp
@@ -100,15 +100,8 @@ void Histogram2D::addContent(const std::vector<std::vector<double>>& data)
     auto shape = DataUtils::Array::getShape(data);
     const size_t nrows = shape.first;
     const size_t ncols = shape.second;
-
-    if (nrows != m_data->axis(1).size() || ncols != m_data->axis(0).size()) {
-        std::ostringstream ostr;
-        ostr << "Histogram2D::addContent() -> Shape of input array [" << nrows << ", " << ncols
-             << "] doesn't mach histogram axes. "
-             << "X-axis size: " << m_data->axis(0).size()
-             << "Y-axis size: " << m_data->axis(1).size();
-        throw std::runtime_error(ostr.str());
-    }
+    ASSERT(ncols == m_frame->projectedSize(0));
+    ASSERT(nrows == m_frame->projectedSize(1));
 
     for (size_t row = 0; row < nrows; ++row) {
         for (size_t col = 0; col < ncols; ++col) {
diff --git a/auto/Wrap/doxygenBase.i b/auto/Wrap/doxygenBase.i
index 99025d8ab3419a4ad828fb1225cf70c789ef3ed9..04711bb51f916ded5cd7ec5d706ac6d2a6366fe7 100644
--- a/auto/Wrap/doxygenBase.i
+++ b/auto/Wrap/doxygenBase.i
@@ -364,6 +364,11 @@ Returns number of dimensions.
 Returns total number of bins. 
 ";
 
+%feature("docstring")  Frame::projectedSize "size_t Frame::projectedSize(size_t k_axis) const
+
+Returns number of bins along axis. 
+";
+
 %feature("docstring")  Frame::axis "const IAxis & Frame::axis(size_t k_axis) const
 
 Returns axis with given serial number. 
diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py
index e4b392593b6b3d3a4349ad9598db23a2f6767b1e..35577951fd526a8929345884f75b254c94b0256e 100644
--- a/auto/Wrap/libBornAgainBase.py
+++ b/auto/Wrap/libBornAgainBase.py
@@ -2793,6 +2793,16 @@ class Frame(object):
         """
         return _libBornAgainBase.Frame_size(self)
 
+    def projectedSize(self, k_axis):
+        r"""
+        projectedSize(Frame self, size_t k_axis) -> size_t
+        size_t Frame::projectedSize(size_t k_axis) const
+
+        Returns number of bins along axis. 
+
+        """
+        return _libBornAgainBase.Frame_projectedSize(self, k_axis)
+
     def axis(self, k_axis):
         r"""
         axis(Frame self, size_t k_axis) -> IAxis
diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp
index 7dfce8e9590207dc7f2a2bcbdfbf8d13262ba99c..fc77dc4abca7de7363d7c9b1f0c37491dae6e805 100644
--- a/auto/Wrap/libBornAgainBase_wrap.cpp
+++ b/auto/Wrap/libBornAgainBase_wrap.cpp
@@ -27345,6 +27345,36 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_Frame_projectedSize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Frame *arg1 = (Frame *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  size_t result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Frame_projectedSize", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Frame, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Frame_projectedSize" "', argument " "1"" of type '" "Frame const *""'"); 
+  }
+  arg1 = reinterpret_cast< Frame * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Frame_projectedSize" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = ((Frame const *)arg1)->projectedSize(arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_Frame_axis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Frame *arg1 = (Frame *) 0 ;
@@ -30219,6 +30249,13 @@ static PyMethodDef SwigMethods[] = {
 		"Returns total number of bins. \n"
 		"\n"
 		""},
+	 { "Frame_projectedSize", _wrap_Frame_projectedSize, METH_VARARGS, "\n"
+		"Frame_projectedSize(Frame self, size_t k_axis) -> size_t\n"
+		"size_t Frame::projectedSize(size_t k_axis) const\n"
+		"\n"
+		"Returns number of bins along axis. \n"
+		"\n"
+		""},
 	 { "Frame_axis", _wrap_Frame_axis, METH_VARARGS, "\n"
 		"Frame_axis(Frame self, size_t k_axis) -> IAxis\n"
 		"const IAxis & Frame::axis(size_t k_axis) const\n"