diff --git a/Code/Mantid/Framework/Algorithms/src/ExtractSingleSpectrum.cpp b/Code/Mantid/Framework/Algorithms/src/ExtractSingleSpectrum.cpp index 46eb8da4709a8123e919bbf08a931666035e606d..d1371627f13ea4ed39351deea6b1ed6cc9878fad 100644 --- a/Code/Mantid/Framework/Algorithms/src/ExtractSingleSpectrum.cpp +++ b/Code/Mantid/Framework/Algorithms/src/ExtractSingleSpectrum.cpp @@ -56,8 +56,17 @@ void ExtractSingleSpectrum::exec() const Axis * axisOne = inputWorkspace->getAxis(1); if( axisOne->isSpectra() ) { - outputWorkspace->getAxis(1)->spectraNo(0) = inputWorkspace->getAxis(1)->spectraNo(desiredSpectrum); + const specid_t outSpecNo = inputWorkspace->getAxis(1)->spectraNo(desiredSpectrum); + outputWorkspace->getAxis(1)->spectraNo(0) = outSpecNo; + ISpectrum* outSpec = outputWorkspace->getSpectrum(0); + // Also set the spectrum number to the group number + outSpec->setSpectrumNo(outSpecNo); + outSpec->clearDetectorIDs(); + const ISpectrum* inSpec = inputWorkspace->getSpectrum(desiredSpectrum); + // Add the detectors for this spectrum to the output workspace's spectra-detector map + outSpec->addDetectorIDs( inSpec->getDetectorIDs() ); } + setProperty("OutputWorkspace",outputWorkspace); progress(1.0); } diff --git a/Code/Mantid/Framework/Algorithms/test/ExtractSingleSpectrumTest.h b/Code/Mantid/Framework/Algorithms/test/ExtractSingleSpectrumTest.h index d2e92a33c00fb06c05294801cec36d4b107d6390..cf4ad86064d8e01c29d40a9482652420e4444de6 100644 --- a/Code/Mantid/Framework/Algorithms/test/ExtractSingleSpectrumTest.h +++ b/Code/Mantid/Framework/Algorithms/test/ExtractSingleSpectrumTest.h @@ -6,6 +6,8 @@ #include "MantidAlgorithms/ExtractSingleSpectrum.h" #include "MantidTestHelpers/WorkspaceCreationHelper.h" +using Mantid::detid_t; + class ExtractSingleSpectrumTest : public CxxTest::TestSuite { public: @@ -36,20 +38,25 @@ public: { using namespace Mantid::API; - MatrixWorkspace_sptr inputWS = WorkspaceCreationHelper::Create2DWorkspace154(5,5); - const int spectrum = 2; - for (int i=0; i<5; ++i) + const int nbins(5); + MatrixWorkspace_sptr inputWS = WorkspaceCreationHelper::create2DWorkspaceWithFullInstrument(5,nbins); + + const int wsIndex = 2; + for (int i=0; i<nbins+1; ++i) { - inputWS->dataX(spectrum)[i] = i; - inputWS->dataY(spectrum)[i] = 20-i; - inputWS->dataE(spectrum)[i] = 7; + inputWS->dataX(wsIndex)[i] = i; + if( i < nbins ) + { + inputWS->dataY(wsIndex)[i] = 20-i; + inputWS->dataE(wsIndex)[i] = 7; + } } - inputWS->getAxis(1)->spectraNo(spectrum) = spectrum; + inputWS->getAxis(1)->spectraNo(wsIndex) = wsIndex; AnalysisDataService::Instance().add("input",inputWS); TS_ASSERT_THROWS_NOTHING( extractor.setPropertyValue("InputWorkspace","input") ) TS_ASSERT_THROWS_NOTHING( extractor.setPropertyValue("OutputWorkspace","output") ) - TS_ASSERT_THROWS_NOTHING( extractor.setProperty("WorkspaceIndex",spectrum) ) + TS_ASSERT_THROWS_NOTHING( extractor.setProperty("WorkspaceIndex",wsIndex) ) TS_ASSERT_THROWS_NOTHING( extractor.execute() ) TS_ASSERT( extractor.isExecuted() ) @@ -59,13 +66,30 @@ public: MatrixWorkspace_const_sptr outputWS; TS_ASSERT( outputWS = boost::dynamic_pointer_cast<const MatrixWorkspace>(output) ) TS_ASSERT_EQUALS( outputWS->blocksize(), 5 ) - TS_ASSERT_EQUALS( outputWS->readX(0).size(), 5 ) - TS_ASSERT_EQUALS( outputWS->getAxis(1)->spectraNo(0), spectrum ) - for (int j=0; j<5; ++j) + TS_ASSERT_EQUALS( outputWS->readX(0).size(), nbins+1) + TS_ASSERT_EQUALS( outputWS->getAxis(1)->spectraNo(0), wsIndex ) + for (int j=0; j<nbins+1; ++j) + { + TS_ASSERT_EQUALS( outputWS->readX(0)[j], j ); + if( j < nbins ) + { + TS_ASSERT_EQUALS( outputWS->readY(0)[j], 20-j ); + TS_ASSERT_EQUALS( outputWS->readE(0)[j], 7 ); + } + } + + const Mantid::API::ISpectrum *spectrum(NULL); + TS_ASSERT_THROWS_NOTHING(spectrum = outputWS->getSpectrum(0)); + if( spectrum ) + { + std::set<detid_t> detids = spectrum->getDetectorIDs(); + TS_ASSERT_EQUALS(detids.size(), 1); + const detid_t id = *(detids.begin()); + TS_ASSERT_EQUALS(id, 3); + } + else { - TS_ASSERT_EQUALS( outputWS->readX(0)[j], j ) - TS_ASSERT_EQUALS( outputWS->readY(0)[j], 20-j ) - TS_ASSERT_EQUALS( outputWS->readE(0)[j], 7 ) + TS_FAIL("No spectra/detectors associated with extracted histogram."); } AnalysisDataService::Instance().remove("input");