From a4db2b1f5410a65703dd33b46e00886164704764 Mon Sep 17 00:00:00 2001 From: Vickie Lynch <lynchve@ornl.gov> Date: Thu, 17 Jan 2019 09:06:38 -0500 Subject: [PATCH] Refs #24333 optimize sample position for each run --- .../Crystal/src/OptimizeCrystalPlacement.cpp | 2 +- .../OptimizeCrystalPlacementByRun.py | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 Framework/PythonInterface/plugins/algorithms/OptimizeCrystalPlacementByRun.py diff --git a/Framework/Crystal/src/OptimizeCrystalPlacement.cpp b/Framework/Crystal/src/OptimizeCrystalPlacement.cpp index 257a0f8129e..7a5eff13303 100644 --- a/Framework/Crystal/src/OptimizeCrystalPlacement.cpp +++ b/Framework/Crystal/src/OptimizeCrystalPlacement.cpp @@ -449,7 +449,7 @@ void OptimizeCrystalPlacement::exec() { UBinv.Invert(); UBinv /= (2 * M_PI); for (int i = 0; i < outPeaks->getNumberPeaks(); ++i) { - auto peak = outPeaks->getPeak(i); + auto &peak = outPeaks->getPeak(i); peak.setSamplePos(peak.getSamplePos() + newSampPos); int RunNum = peak.getRunNumber(); std::string RunNumStr = std::to_string(RunNum); diff --git a/Framework/PythonInterface/plugins/algorithms/OptimizeCrystalPlacementByRun.py b/Framework/PythonInterface/plugins/algorithms/OptimizeCrystalPlacementByRun.py new file mode 100644 index 00000000000..5a2907267b4 --- /dev/null +++ b/Framework/PythonInterface/plugins/algorithms/OptimizeCrystalPlacementByRun.py @@ -0,0 +1,78 @@ +# Mantid Repository : https://github.com/mantidproject/mantid +# +# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# NScD Oak Ridge National Laboratory, European Spallation Source +# & Institut Laue - Langevin +# SPDX - License - Identifier: GPL - 3.0 + +#pylint: disable=no-init +from __future__ import (absolute_import, division, print_function) + +from mantid.api import PythonAlgorithm, AlgorithmFactory, ITableWorkspaceProperty, WorkspaceFactory +from mantid.kernel import Direction +from mantid.simpleapi import * +from mantid import mtd + +# Create an empty table workspace to be populated by a python script. + + +class OptimizeCrystalPlacementByRun(PythonAlgorithm): + + def summary(self): + return "Optimizes the sample position for each run in a peaks workspace." + + def category(self): + return 'Crystal\\Corrections' + + def seeAlso(self): + return [ "OptimizeCrystalPlacement" ] + + def PyInit(self): + # Declare properties + self.declareProperty(ITableWorkspaceProperty("InputWorkspace", "", Direction.Input), + "The name of the peaks workspace that will be optimized.") + self.declareProperty("Tolerance", 0.15, "Tolerance of indexing of peaks.") + self.declareProperty(ITableWorkspaceProperty("OutputWorkspace", "", Direction.Output), + "The name of the peaks workspace that will be created.") + + def PyExec(self): + ws = self.getProperty("InputWorkspace").value + ws_append = self.getProperty("OutputWorkspace").value + ws_group = 'ws_group' + tolerance = self.getProperty("Tolerance").value + if not ws.sample().hasOrientedLattice(): + FindUBUsingIndexedPeaks(PeaksWorkspace=ws,Tolerance=tolerance) + num,err=IndexPeaks(PeaksWorkspace=ws,Tolerance=tolerance) + print('Initial Number indexed: %s error: %s\n'%(num, err)) + stats = StatisticsOfTableWorkspace(InputWorkspace=ws) + stat_col = stats.column('Statistic') + minR = int(stats.column('RunNumber')[stat_col.index('Minimum')]) + maxR = int(stats.column('RunNumber')[stat_col.index('Maximum')]) + 1 + + group = [] + for run in range(minR, maxR): + FilterPeaks(InputWorkspace=ws, OutputWorkspace=str(run), FilterVariable='RunNumber', FilterValue=run, Operator='=') + run = mtd[str(run)] + peaks = run.getNumberPeaks() + if peaks == 0: + AnalysisDataService.remove( str(run)) + else: + group.append(str(run)) + GroupWorkspaces(InputWorkspaces=group, OutputWorkspace=ws_group) + + OptimizeCrystalPlacement(PeaksWorkspace=ws_group, ModifiedPeaksWorkspace=ws_group, AdjustSampleOffsets=True, MaxSamplePositionChangeMeters=0.005,MaxIndexingError=tolerance) + + CloneWorkspace(InputWorkspace=str(minR),OutputWorkspace=ws_append) + for run in range(minR+1, maxR): + if AnalysisDataService.doesExist( str(run)): + CombinePeaksWorkspaces(LHSWorkspace=ws_append, RHSWorkspace=str(run),OutputWorkspace=ws_append) + print('Optimized %s sample position: %s\n'%(str(run),mtd[str(run)].getPeak(0).getSamplePos())) + AnalysisDataService.remove( str(run)) + num,err=IndexPeaks(PeaksWorkspace=ws_append,Tolerance=tolerance) + print('After Optimization Number indexed: %s error: %s\n'%(num, err)) + AnalysisDataService.remove(ws_group) + + self.setProperty("OutputWorkspace", ws_append) + + +# Register algorithm with Mantid +AlgorithmFactory.subscribe(OptimizeCrystalPlacementByRun) -- GitLab