/** * @brief Handle setting fit workspace. * * Creates a list of Q values from each spectrum to be used with WorkspaceIndex * attribute. * * @param ws Pointer to workspace */ void InelasticDiffSphere::setWorkspace( boost::shared_ptr<const API::Workspace> ws) { m_qValueCache.clear(); auto workspace = boost::dynamic_pointer_cast<const API::MatrixWorkspace>(ws); if (!workspace) return; size_t numHist = workspace->getNumberHistograms(); for (size_t idx = 0; idx < numHist; idx++) { Mantid::Geometry::IDetector_const_sptr det; try { det = workspace->getDetector(idx); } catch (Kernel::Exception::NotFoundError &) { m_qValueCache.clear(); g_log.information("Cannot populate Q values from workspace"); break; } try { double efixed = workspace->getEFixed(det); double usignTheta = 0.5 * workspace->detectorTwoTheta(*det); double q = Mantid::Kernel::UnitConversion::run(usignTheta, efixed); m_qValueCache.push_back(q); } catch (std::runtime_error &) { m_qValueCache.clear(); g_log.information("Cannot populate Q values from workspace"); return; } } }
void SANSSolidAngleCorrection::execEvent() { MatrixWorkspace_sptr inputWS = getProperty("InputWorkspace"); // generate the output workspace pointer MatrixWorkspace_sptr outputWS = getProperty("OutputWorkspace"); if (outputWS != inputWS) { outputWS = inputWS->clone(); setProperty("OutputWorkspace", outputWS); } auto outputEventWS = boost::dynamic_pointer_cast<EventWorkspace>(outputWS); const int numberOfSpectra = static_cast<int>(outputEventWS->getNumberHistograms()); Progress progress(this, 0.0, 1.0, numberOfSpectra); progress.report("Solid Angle Correction"); PARALLEL_FOR1(outputEventWS) for (int i = 0; i < numberOfSpectra; i++) { PARALLEL_START_INTERUPT_REGION IDetector_const_sptr det; try { det = outputEventWS->getDetector(i); } catch (Exception::NotFoundError &) { g_log.warning() << "Workspace index " << i << " has no detector assigned to it - discarding\n"; // Catch if no detector. Next line tests whether this happened - test // placed // outside here because Mac Intel compiler doesn't like 'continue' in a // catch // in an openmp block. } if (!det) continue; // Skip if we have a monitor or if the detector is masked. if (det->isMonitor() || det->isMasked()) continue; // Compute solid angle correction factor const bool is_tube = getProperty("DetectorTubes"); const double tanTheta = tan(outputEventWS->detectorTwoTheta(*det)); const double theta_term = sqrt(tanTheta * tanTheta + 1.0); double corr; if (is_tube) { const double tanAlpha = tan(getYTubeAngle(det, inputWS)); const double alpha_term = sqrt(tanAlpha * tanAlpha + 1.0); corr = alpha_term * theta_term * theta_term; } else { corr = theta_term * theta_term * theta_term; } EventList &el = outputEventWS->getSpectrum(i); el *= corr; progress.report("Solid Angle Correction"); PARALLEL_END_INTERUPT_REGION } PARALLEL_CHECK_INTERUPT_REGION setProperty("OutputMessage", "Solid angle correction applied"); }