void MDHistoToWorkspace2D::recurseData(IMDHistoWorkspace_sptr inWS,
                                       Workspace2D_sptr outWS,
                                       size_t currentDim, coord_t *pos) {
  boost::shared_ptr<const IMDDimension> dim = inWS->getDimension(currentDim);
  if (currentDim == rank - 1) {
    MantidVec &Y = outWS->dataY(currentSpectra);
    for (unsigned int j = 0; j < dim->getNBins(); j++) {
      pos[currentDim] = dim->getX(j);
      Y[j] = inWS->getSignalAtCoord(
          pos, static_cast<Mantid::API::MDNormalization>(0));
    }
    MantidVec &E = outWS->dataE(currentSpectra);
    // MSVC compiler can't figure out the correct overload with out the function
    // cast on sqrt
    std::transform(Y.begin(), Y.end(), E.begin(),
                   (double (*)(double))std::sqrt);
    std::vector<double> xData;
    for (unsigned int i = 0; i < dim->getNBins(); i++) {
      xData.push_back(dim->getX(i));
    }
    outWS->setX(currentSpectra, xData);
    outWS->getSpectrum(currentSpectra)
        ->setSpectrumNo(static_cast<specid_t>(currentSpectra));
    currentSpectra++;
  } else {
    // recurse deeper
    for (int i = 0; i < static_cast<int>(dim->getNBins()); i++) {
      pos[currentDim] = dim->getX(i);
      recurseData(inWS, outWS, currentDim + 1, pos);
    }
  }
}