Index: src/Fragmentation/Summation/SetValues/SamplingGrid.cpp
===================================================================
--- src/Fragmentation/Summation/SetValues/SamplingGrid.cpp	(revision 9782343547485222db9fb33957f011b49e93d4b7)
+++ src/Fragmentation/Summation/SetValues/SamplingGrid.cpp	(revision c1948cb9ade8dfb874db487da9a669d67a386881)
@@ -424,4 +424,34 @@
       boost::bind(addElements, _1, _2, boost::cref(prefactor)),
       sourcewindow);
+}
+
+void SamplingGrid::getDiscreteWindowIndices(
+    size_t _wbegin[NDIM],
+    size_t _wlength[NDIM],
+    size_t _wend[NDIM]) const
+{
+  const double round_offset =
+      (std::numeric_limits<size_t>::round_style == std::round_toward_zero) ?
+          0.5 : 0.; // need offset to get to round_toward_nearest behavior
+  for(size_t index=0;index<NDIM;++index) {
+    if (fabs(end[index] - begin[index]) > std::numeric_limits<double>::epsilon()*1e4) {
+      // we refrain from using floor/ceil as the window's starts and ends,
+      // the grids have to be compatible (equal level), should always be on
+      // discrete grid point locations.
+      const double delta = getDeltaPerAxis(index);
+      // delta is conversion factor from box length to discrete length, i.e. number of points
+      _wbegin[index] = (begin_window[index] - begin[index])/delta+round_offset;
+      _wlength[index] = (end_window[index] - begin_window[index])/delta+round_offset;
+      _wend[index] = (end_window[index] - begin[index])/delta+round_offset;
+    } else {
+      _wbegin[index] = 0;
+      _wlength[index] = 0;
+      _wend[index] = 0;
+    }
+    // total is used as safe-guard against loss due to discrete conversion
+    ASSERT( (_wend[index] - _wbegin[index]) == _wlength[index],
+        "SamplingGrid::getDiscreteWindowCopyIndices() - end - begin is not equal to length for "
+        +toString(index)+"th component.");
+  }
 }
 
Index: src/Fragmentation/Summation/SetValues/SamplingGrid.hpp
===================================================================
--- src/Fragmentation/Summation/SetValues/SamplingGrid.hpp	(revision 9782343547485222db9fb33957f011b49e93d4b7)
+++ src/Fragmentation/Summation/SetValues/SamplingGrid.hpp	(revision c1948cb9ade8dfb874db487da9a669d67a386881)
@@ -200,4 +200,11 @@
   const double getWindowLengthPerAxis(const size_t axis) const;
 
+  /** Returns the discrete length in grid cells of the window for the given \a axis.
+   *
+   * \param axis axis for which to get step length
+   * \return window length in grid cells for the given axis
+   */
+  const size_t getDiscreteWindowLengthPerAxis(const size_t axis) const;
+
   /** Returns the volume of the domain covered by the current window.
    *
@@ -236,4 +243,13 @@
       size_t *length,
       size_t *total) const;
+
+  /** Returns begin, length and end of window relative to the full domain in discrete
+   * grid points, i.e. begin gives the first grid points with the window and end its
+   * last plus 1.
+   */
+  void getDiscreteWindowIndices(
+      size_t _wbegin[NDIM],
+      size_t _wlength[NDIM],
+      size_t _wend[NDIM]) const;
 
   /** Equality operator.
Index: src/Fragmentation/Summation/SetValues/SamplingGrid_inline.hpp
===================================================================
--- src/Fragmentation/Summation/SetValues/SamplingGrid_inline.hpp	(revision 9782343547485222db9fb33957f011b49e93d4b7)
+++ src/Fragmentation/Summation/SetValues/SamplingGrid_inline.hpp	(revision c1948cb9ade8dfb874db487da9a669d67a386881)
@@ -38,4 +38,17 @@
 inline
 #endif
+const size_t SamplingGrid::getDiscreteWindowLengthPerAxis(const size_t axis) const
+{
+  const double round_offset =
+      (std::numeric_limits<size_t>::round_style == std::round_toward_zero) ?
+          0.5 : 0.; // need offset to get to round_toward_nearest behavior
+  const double length =
+    (double)getGridPointsPerAxis()*getWindowLengthPerAxis(axis)/getTotalLengthPerAxis(axis)+round_offset;
+  return length;
+}
+
+#ifdef HAVE_INLINE
+inline
+#endif
 const size_t SamplingGrid::getWindowGridPoints() const
 {
