void setXValuesOn1DWorkspaceWithPointData( Mantid::API::MatrixWorkspace_sptr workspace, double xmin, double xmax) { auto &xValues = workspace->dataX(0); auto size = xValues.size(); double binWidth = (xmax - xmin) / static_cast<double>(size - 1); for (size_t index = 0; index < size; ++index) { xValues[index] = xmin; xmin += binWidth; } }
/** * Sum counts in detectors for purposes of rough plotting against the units on the x-axis. * Assumes that all spectra have different x vectors. * * @param dets :: A list of detector IDs to sum. * @param x :: (output) Time of flight values (or whatever values the x axis has) to plot against. * @param y :: (output) The sums of the counts for each bin. * @param size :: (input) Size of the output vectors. */ void InstrumentActor::sumDetectorsRagged(QList<int> &dets, std::vector<double> &x, std::vector<double> &y, size_t size) const { if ( dets.isEmpty() || size == 0 ) { x.clear(); y.clear(); return; } Mantid::API::MatrixWorkspace_const_sptr ws = getWorkspace(); // create a workspace to hold the data from the selected detectors Mantid::API::MatrixWorkspace_sptr dws = Mantid::API::WorkspaceFactory::Instance().create(ws,dets.size()); // x-axis limits double xStart = maxBinValue(); double xEnd = minBinValue(); size_t nSpec = 0; // number of actual spectra to add // fill in the temp workspace with the data from the detectors foreach(int id, dets) { try { size_t index = getWorkspaceIndex( id ); dws->dataX(nSpec) = ws->readX(index); dws->dataY(nSpec) = ws->readY(index); dws->dataE(nSpec) = ws->readE(index); double xmin = dws->readX(nSpec).front(); double xmax = dws->readX(nSpec).back(); if ( xmin < xStart ) { xStart = xmin; } if ( xmax > xEnd ) { xEnd = xmax; } ++nSpec; } catch (Mantid::Kernel::Exception::NotFoundError &) { continue; // Detector doesn't have a workspace index relating to it } } if ( nSpec == 0 ) { x.clear(); y.clear(); return; } // limits should exceed the integration range if ( xStart < minBinValue() ) { xStart = minBinValue(); } if ( xEnd > maxBinValue() ) { xEnd = maxBinValue(); } double dx = (xEnd - xStart) / static_cast<double>(size - 1); std::string params = QString("%1,%2,%3").arg(xStart).arg(dx).arg(xEnd).toStdString(); std::string outName = "_TMP_sumDetectorsRagged"; try { // rebin all spectra to the same binning Mantid::API::IAlgorithm * alg = Mantid::API::FrameworkManager::Instance().createAlgorithm("Rebin",-1); alg->setProperty( "InputWorkspace", dws ); alg->setPropertyValue( "OutputWorkspace", outName ); alg->setPropertyValue( "Params", params ); alg->execute(); ws = boost::dynamic_pointer_cast<Mantid::API::MatrixWorkspace>(Mantid::API::AnalysisDataService::Instance().retrieve(outName)); Mantid::API::AnalysisDataService::Instance().remove( outName ); x = ws->readX(0); y = ws->readY(0); // add the spectra for(size_t i = 0; i < nSpec; ++i) { const Mantid::MantidVec& Y = ws->readY(i); std::transform( y.begin(), y.end(), Y.begin(), y.begin(), std::plus<double>() ); } } catch(std::invalid_argument&) { // wrong Params for any reason x.resize(size,(xEnd + xStart)/2); y.resize(size,0.0); } }