diff --git a/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp b/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp index 68d1342a98f7ac56c1f931442ff970487d01ae9c..d834c27ded871c0ad68cf1b4187dd7b2c4b07f82 100644 --- a/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp +++ b/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp @@ -34,13 +34,16 @@ getSampleSpeciesInfo(const API::MatrixWorkspace_const_sptr ws) { for (const Kernel::Material::Material::FormulaUnit element : formula) { const std::map<std::string, double> atomMap{ {"mass", element.atom->mass}, - {"concentration", element.multiplicity}, + {"stoich", element.multiplicity}, {"bSqrdBar", bSqrdBar}}; atomSpecies[element.atom->symbol] = atomMap; totalStoich += element.multiplicity; } - for (auto atom : atomSpecies) { - atom.second["concentration"] = atom.second["stoich"] / totalStoich; + std::map<std::string, std::map<std::string, double>>::iterator atom = + atomSpecies.begin(); + while (atom != atomSpecies.end()) { + atom->second["concentration"] = atom->second["stoich"] / totalStoich; + atom++; } return atomSpecies; } @@ -113,8 +116,8 @@ void CalculatePlaczekSelfScattering::exec() { // set detector law term (eps1) const double lambdaD = 1.44; std::vector<double> eps1; - for (size_t i = 0; i < xLambda.size(); i++) { - double xTerm = -xLambda[i] / lambdaD; + for (size_t i = 0; i < xLambda.size() - 1; i++) { + double xTerm = -(xLambda[i] + dx) / lambdaD; eps1.push_back(xTerm * exp(xTerm) / (1.0 - exp(xTerm))); } /* Placzek @@ -148,7 +151,6 @@ void CalculatePlaczekSelfScattering::exec() { outputWS->setDistribution(true); outputWS->setYUnit(""); outputWS->setYUnitLabel("Counts"); - int nSpec = 0; for (size_t specIndex = 0; specIndex < specInfo.size(); specIndex++) { auto &y = outputWS->mutableY(specIndex); auto &x = outputWS->mutableX(specIndex); @@ -156,28 +158,29 @@ void CalculatePlaczekSelfScattering::exec() { const double pathLength = specInfo.l1() + specInfo.l2(specIndex); const double f = specInfo.l1() / pathLength; const double sinThetaBy2 = sin(specInfo.twoTheta(specIndex) / 2.0); + Kernel::Units::Wavelength wavelength; + wavelength.initialize(specInfo.l1(), specInfo.l2(specIndex), + specInfo.twoTheta(specIndex), 0, 1.0, 1.0); for (size_t xIndex = 0; xIndex < xLambda.size() - 1; xIndex++) { const double term1 = (f - 1.0) * phi1[xIndex]; - const double term2 = f * eps1[xIndex]; - const double term3 = f - 3; + const double term2 = -f * eps1[xIndex]; + const double term3 = f - 3.0; const double inelasticPlaczekSelfCorrection = - 2.0 * (term1 - term2 + term3) * sinThetaBy2 * sinThetaBy2 * + 2.0 * (term1 + term2 + term3) * sinThetaBy2 * sinThetaBy2 * summationTerm; - x[xIndex] = xLambda[xIndex]; + x[xIndex] = wavelength.singleToTOF(xLambda[xIndex]); y[xIndex] = inelasticPlaczekSelfCorrection; } - xLambdas.push_back(xLambda.back()); - nSpec += 1; + x.back() = wavelength.singleToTOF(xLambda.back()); } else { for (size_t xIndex = 0; xIndex < xLambda.size() - 1; xIndex++) { x[xIndex] = xLambda[xIndex]; y[xIndex] = 0; } x.back() = xLambda.back(); - nSpec += 1; } } - auto incidentUnit = incidentWS->getAxis(0)->unit(); + auto incidentUnit = inWS->getAxis(0)->unit(); outputWS->getAxis(0)->unit() = incidentUnit; setProperty("OutputWorkspace", outputWS); } diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py index 2368c051045d3be087be3972f396cf5a22238ce3..bdefcd7ba63ce080f3d644b77d6c09d2f9f96589 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py @@ -133,33 +133,51 @@ def _generate_grouped_ts_pdf(run_number, focused_ws, q_lims, cal_file_name, samp min_x = min(np.min(x_data), min_x) max_x = max(np.max(x_data), max_x) num_x = max(x_data.size, num_x) - binning = [min_x, (max_x-min_x)/num_x, max_x] + width_x = (max_x-min_x)/num_x + binning = [min_x, width_x, max_x] focused_ws = mantid.Rebin(InputWorkspace=focused_ws, Params=binning) focused_data_combined = mantid.ConjoinSpectra(InputWorkspaces=focused_ws) mantid.ConvertFromDistribution(Workspace=focused_data_combined) + raw_ws = mantid.LoadRaw(Filename='POL'+str(run_number)) mantid.SetSample(InputWorkspace=raw_ws, Geometry=common.generate_sample_geometry(sample_details), Material=common.generate_sample_material(sample_details)) - monitor = mantid.ExtractSpectra(InputWorkspace=raw_ws, WorkspaceIndexList=[11]) - - fit_spectra = mantid.FitIncidentSpectrum(InputWorkspace=monitor, FitSpectrumWith="GaussConvCubicSpline") + monitor = mantid.ConvertUnits(InputWorkspace=monitor, Target="Wavelength") + x_data = monitor.dataX(0) + min_x = np.min(x_data) + max_x = np.max(x_data) + width_x = (max_x-min_x)/x_data.size + fit_spectra = mantid.FitIncidentSpectrum(InputWorkspace=monitor, + BinningForCalc=[min_x, 1*width_x, max_x], + BinningForFit=[min_x, 50*width_x, max_x], + FitSpectrumWith="GaussConvCubicSpline") placzek = mantid.CalculatePlaczekSelfScattering(InputWorkspace=raw_ws, IncidentSpecta=fit_spectra) mantid.ConvertFromDistribution(Workspace=placzek) + cal_workspace = mantid.LoadCalFile(InputWorkspace=placzek, + CalFileName=cal_file_name, + Workspacename='cal_workspace', + MakeOffsetsWorkspace=False, + MakeMaskWorkspace=False) placzek = mantid.AlignDetectors(InputWorkspace=placzek, CalibrationFile=cal_file_name) - placzek = mantid.DiffractionFocussing(InputWorkspace=placzek, GroupingFileName=cal_file_name) + placzek = mantid.DiffractionFocussing(InputWorkspace=placzek, GroupingFilename=cal_file_name) + n_pixel = np.zeros(placzek.getNumberHistograms()) + for i in range(cal_workspace.getNumberHistograms()): + grouping = cal_workspace.dataY(i) + if grouping[0] > 0: + n_pixel[int(grouping[0]-1)] += 1 + correction_ws = mantid.CreateWorkspace(DataY=n_pixel, DataX=[0, 1], NSpec=placzek.getNumberHistograms()) + placzek = mantid.Divide(LHSWorkspace=placzek, RHSWorkspace=correction_ws) placzek = mantid.ConvertUnits(InputWorkspace=placzek, Target="MomentumTransfer", EMode='Elastic') - mantid.RebinToWorkspace(WorkspaceToRebin=placzek, - WorkspaceToMatch=focused_data_combined, - OutputWorkspace=placzek) + placzek = mantid.RebinToWorkspace(WorkspaceToRebin=placzek, WorkspaceToMatch=focused_data_combined) mantid.Subtract(LHSWorkspace=focused_data_combined, RHSWorkspace=placzek, OutputWorkspace=focused_data_combined) mantid.MatchSpectra(InputWorkspace=focused_data_combined, OutputWorkspace=focused_data_combined, - ReferenceSpectrum=5) + ReferenceSpectrum=1) if type(q_lims) == str: q_min = [] q_max = []