/** Construct output */ Workspace2D_sptr RefinePowderInstrumentParameters2::genOutputWorkspace(FunctionDomain1DVector domain, FunctionValues rawvalues) { // 1. Create and set up output workspace size_t lenx = m_dataWS->readX(m_wsIndex).size(); size_t leny = m_dataWS->readY(m_wsIndex).size(); Workspace2D_sptr outws = boost::dynamic_pointer_cast<Workspace2D> (WorkspaceFactory::Instance().create("Workspace2D", 6, lenx, leny)); outws->getAxis(0)->setUnit("dSpacing"); TextAxis* taxis = new TextAxis(outws->getNumberHistograms()); taxis->setLabel(0, "Data"); taxis->setLabel(1, "Model"); taxis->setLabel(2, "DiffDM"); taxis->setLabel(3, "Start"); taxis->setLabel(4, "DiffDS"); taxis->setLabel(5, "Zdiff"); outws->replaceAxis(1, taxis); // 3. Re-calculate values FunctionValues funcvalues(domain); m_positionFunc->function(domain, funcvalues); // 4. Add values // a) X axis for (size_t iws = 0; iws < outws->getNumberHistograms(); ++iws) { MantidVec& vecX = outws->dataX(iws); for (size_t n = 0; n < lenx; ++n) vecX[n] = domain[n]; } // b) Y axis const MantidVec& dataY = m_dataWS->readY(m_wsIndex); for (size_t i = 0; i < domain.size(); ++i) { outws->dataY(0)[i] = dataY[i]; outws->dataY(1)[i] = funcvalues[i]; outws->dataY(2)[i] = dataY[i] - funcvalues[i]; outws->dataY(3)[i] = rawvalues[i]; outws->dataY(4)[i] = dataY[i] - rawvalues[i]; } // 5. Zscore vector<double> zscore = Kernel::getZscore(outws->readY(2)); for (size_t i = 0; i < domain.size(); ++i) outws->dataY(5)[i] = zscore[i]; return outws; }
/** Executes the algorithm * * @throw Exception::FileError If the grouping file cannot be opened or read successfully * @throw runtime_error If unable to run one of the Child Algorithms successfully */ void ReadGroupsFromFile::exec() { MatrixWorkspace_const_sptr ws = getProperty("InstrumentWorkspace"); // Get the instrument. Instrument_const_sptr inst = ws->getInstrument(); // Create a copy (without the data) of the workspace - it will contain the Workspace2D_sptr localWorkspace = boost::dynamic_pointer_cast<Workspace2D>(WorkspaceFactory::Instance().create(ws, ws->getNumberHistograms(), 2, 1)); if (!localWorkspace) throw std::runtime_error("Failed when creating a Workspace2D from the input!"); const std::string groupfile=getProperty("GroupingFilename"); if ( ! groupfile.empty() ) { std::string filename(groupfile); std::transform(filename.begin(), filename.end(), filename.begin(), tolower); if ( filename.find(".xml") != std::string::npos ) { readXMLGroupingFile(groupfile); } else { readGroupingFile(groupfile); } } // Get the instrument. const int64_t nHist=localWorkspace->getNumberHistograms(); // Determine whether the user wants to see unselected detectors or not const std::string su=getProperty("ShowUnselected"); bool showunselected=(!su.compare("True")); bool success=false; for (int64_t i=0;i<nHist;i++) { ISpectrum * spec = localWorkspace->getSpectrum(i); const std::set<detid_t> & dets = spec->getDetectorIDs(); if (dets.empty()) // Nothing { spec->dataY()[0]=0.0; continue; } // Find the first detector ID in the list calmap::const_iterator it=calibration.find(*dets.begin()); if (it==calibration.end()) //Could not find the detector { spec->dataY()[0]=0.0; continue; } if (showunselected) { if (((*it).second).second==0) spec->dataY()[0]=0.0; else spec->dataY()[0]=static_cast<double>(((*it).second).first); } else spec->dataY()[0]=static_cast<double>(((*it).second).first); if (!success) success=true; //At least one detector is found in the cal file } progress(1); calibration.clear(); if (!success) //Do some cleanup { localWorkspace.reset(); throw std::runtime_error("Fail to found a detector in "+groupfile+" existing in instrument "+inst->getName()); } setProperty("OutputWorkspace",localWorkspace); return; }