/** * Return true if the two workspaces are compatible for this operation * Virtual: will be overridden as needed. * @param lhs :: left-hand workspace to check * @param rhs :: right-hand workspace to check * @return flag for the compatibility to the two workspaces */ bool BinaryOperation::checkCompatibility(const API::MatrixWorkspace_const_sptr lhs,const API::MatrixWorkspace_const_sptr rhs) const { Unit_const_sptr lhs_unit; Unit_const_sptr rhs_unit; if ( lhs->axes() && rhs->axes() ) // If one of these is a WorkspaceSingleValue then we don't want to check units match { lhs_unit = lhs->getAxis(0)->unit(); rhs_unit = rhs->getAxis(0)->unit(); } const std::string lhs_unitID = ( lhs_unit ? lhs_unit->unitID() : "" ); const std::string rhs_unitID = ( rhs_unit ? rhs_unit->unitID() : "" ); // Check the workspaces have the same units and distribution flag if ( lhs_unitID != rhs_unitID && lhs->blocksize() > 1 && rhs->blocksize() > 1 ) { g_log.error("The two workspace are not compatible because they have different units on the X axis."); return false; } // Check the size compatibility if (!checkSizeCompatibility(lhs,rhs)) { std::ostringstream ostr; ostr<<"The sizes of the two workspaces " << "(" << lhs->getName() << ": " << lhs->getNumberHistograms() << " spectra, blocksize " << lhs->blocksize() << ")" << " and " << "(" << rhs->getName() << ": " << rhs->getNumberHistograms() << " spectra, blocksize " << rhs->blocksize() << ")" << " are not compatible for algorithm "<<this->name(); g_log.error() << ostr.str() << std::endl; throw std::invalid_argument( ostr.str() ); } return true; }
/** * Return true if the two workspaces are compatible for this operation * Virtual: will be overridden as needed. * @param lhs :: left-hand workspace to check * @param rhs :: right-hand workspace to check * @return flag for the compatibility to the two workspaces */ bool BinaryOperation::checkCompatibility( const API::MatrixWorkspace_const_sptr lhs, const API::MatrixWorkspace_const_sptr rhs) const { Unit_const_sptr lhs_unit; Unit_const_sptr rhs_unit; if (lhs->axes() && rhs->axes()) // If one of these is a WorkspaceSingleValue // then we don't want to check units match { lhs_unit = lhs->getAxis(0)->unit(); rhs_unit = rhs->getAxis(0)->unit(); } const std::string lhs_unitID = (lhs_unit ? lhs_unit->unitID() : ""); const std::string rhs_unitID = (rhs_unit ? rhs_unit->unitID() : ""); // Check the workspaces have the same units and distribution flag if (lhs_unitID != rhs_unitID && lhs->blocksize() > 1 && rhs->blocksize() > 1) { g_log.error("The two workspace are not compatible because they have " "different units on the X axis."); return false; } // Check the size compatibility std::string checkSizeCompatibilityResult = checkSizeCompatibility(lhs, rhs); if (!checkSizeCompatibilityResult.empty()) { throw std::invalid_argument(checkSizeCompatibilityResult); } return true; }