/**
 * Create the output workspace in the right shape.
 * @param inWS : Input workspace for dimensionality
 * @param pbins : User provided binning
 * @param logger : Logging object
 * @return
 */
MDHistoWorkspace_sptr createShapedOutput(IMDHistoWorkspace const *const inWS,
                                         std::vector<std::vector<double>> pbins,
                                         Logger &logger) {
  const size_t nDims = inWS->getNumDims();
  std::vector<Mantid::Geometry::IMDDimension_sptr> dimensions(nDims);
  for (size_t i = 0; i < nDims; ++i) {

    IMDDimension_const_sptr inDim = inWS->getDimension(i);
    auto outDim = boost::make_shared<MDHistoDimension>(inDim.get());
    // Apply dimensions as inputs.
    if (i < pbins.size() && integrationBinning(pbins[i])) {
      auto binning = pbins[i];
      outDim->setRange(
          1 /*single bin*/,
          static_cast<Mantid::coord_t>(binning.front()) /*min*/,
          static_cast<Mantid::coord_t>(
              binning.back()) /*max*/); // Set custom min, max and nbins.
    } else if (i < pbins.size() && similarBinning(pbins[i])) {
      auto binning = pbins[i];

      Mantid::coord_t pMin = static_cast<Mantid::coord_t>(binning.front());
      Mantid::coord_t pMax = static_cast<Mantid::coord_t>(binning.back());
      size_t numberOfBins;

      setMinMaxBins(pMin, pMax, numberOfBins, inDim, logger);

      outDim->setRange(numberOfBins, static_cast<Mantid::coord_t>(pMin) /*min*/,
                       static_cast<Mantid::coord_t>(
                           pMax) /*max*/); // Set custom min, max and nbins.
    }
    dimensions[i] = outDim;
  }
  return boost::make_shared<MDHistoWorkspace>(dimensions);
}
bool MDGeometryBuilderXML<CheckDimensionPolicy>::addZDimension(
    IMDDimension_const_sptr dimension) const {
  bool bAdded = false;
  if (dimension.get() != NULL) {
    applyPolicyChecking(dimension);
    addOrdinaryDimension(dimension);
    m_spZDimension = dimension;
    m_changed = true;
    bAdded = true;
  }
  return bAdded;
}
bool MDGeometryBuilderXML<CheckDimensionPolicy>::addOrdinaryDimension(
    IMDDimension_const_sptr dimensionToAdd) const {
  bool bAdded = false; // Addition fails by default.
  if (dimensionToAdd.get() != NULL) {
    CompareIMDDimension_const_sptr comparitor(dimensionToAdd);
    DimensionContainerType::iterator location = std::find_if(
        m_vecDimensions.begin(), m_vecDimensions.end(), comparitor);
    if (location == m_vecDimensions.end()) {
      m_vecDimensions.push_back(dimensionToAdd);
      bAdded = true;
      m_changed = true;
    }
  }
  return bAdded;
}