-
Nick Draper authored
re #8840
Nick Draper authoredre #8840
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
DiffractionFocussing2.h 5.80 KiB
#ifndef MANTID_ALGORITHMS_DIFFRACTIONFOCUSSING2_H_
#define MANTID_ALGORITHMS_DIFFRACTIONFOCUSSING2_H_
//----------------------------------------------------------------------
// Includes
//----------------------------------------------------------------------
#include "MantidAPI/Algorithm.h"
#include "MantidDataObjects/EventWorkspace.h"
#include "MantidDataObjects/GroupingWorkspace.h"
#include "MantidKernel/System.h"
namespace Mantid {
namespace Algorithms {
/**
Algorithm to focus powder diffraction data into a number of histograms
according to a
grouping scheme defined in a file.
The structure of the grouping file is as follows:
# Format: number UDET offset select group
0 611 0.0000000 1 0
1 612 0.0000000 1 0
2 601 0.0000000 0 0
3 602 0.0000000 0 0
4 621 0.0000000 1 0
The first column is simply an index, the second is a UDET identifier for the
detector,
the third column corresponds to an offset in Deltad/d (not applied, usually
applied using
the AlignDetectors algorithm). The forth column is a flag to indicate whether
the detector
is selected. The fifth column indicates the group this detector belongs to
(number >=1),
zero is not considered as a group.
Given an InputWorkspace and a Grouping filename, the algorithm follows:
1) The calibration file is read and a map of corresponding udet-group is
created.
2) The algorithm determine the X boundaries for each group as the upper and
lower limits
of all contributing detectors to this group and determine a logarithmic step
that will ensure
preserving the number of bins in the initial workspace.
3) All histograms are read and rebinned to the new grid for their group.
4) A new workspace with N histograms is created.
Since the new X boundaries depend on the group and not the entire workspace,
this focusing algorithm does not create overestimated Xranges for multi-group
intruments.
Required Properties:
<UL>
<LI> InputWorkspace - The name of the 2D Workspace to take as input.
It should be an histogram and the X-unit should be d-spacing. </LI>
<LI> GroupingFileName - The path to a grouping file</LI>
<LI> OutputWorkspace - The name of the 2D workspace in which to store the
result </LI>
</UL>
@author Laurent Chapon, ISIS Facility, Rutherford Appleton Laboratory
@date 08/03/2009
Copyright © 2009 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
National Laboratory & European Spallation Source
This file is part of Mantid.
Mantid is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
Mantid is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
File change history is stored at: <https://github.com/mantidproject/mantid>
Code Documentation is available at: <http://doxygen.mantidproject.org>
*/
class DLLExport DiffractionFocussing2 : public API::Algorithm {
public:
/// Default constructor
DiffractionFocussing2();
/// Destructor
virtual ~DiffractionFocussing2();
/// Algorithm's name for identification overriding a virtual method
virtual const std::string name() const { return "DiffractionFocussing"; }
/// Summary of algorithms purpose
virtual const std::string summary() const {
return "Algorithm to focus powder diffraction data into a number of "
"histograms according to a grouping scheme defined in a CalFile.";
}
/// Algorithm's version for identification overriding a virtual method
virtual int version() const { return 2; }
/// Algorithm's category for identification overriding a virtual method
virtual const std::string category() const { return "Diffraction\\Focussing"; }
private:
// Overridden Algorithm methods
void init();
void exec();
void cleanup();
std::size_t setupGroupToWSIndices();
// For events
void execEvent();
/// Loop over the workspace and determine the rebin parameters
/// (Xmin,Xmax,step) for each group.
/// The result is stored in group2params
void determineRebinParameters();
int validateSpectrumInGroup(size_t wi);
/// Shared pointer to the input workspace
API::MatrixWorkspace_const_sptr m_matrixInputW;
/// Grouping workspace with groups to build
Mantid::DataObjects::GroupingWorkspace_sptr groupWS;
/// Shared pointer to the event workspace
DataObjects::EventWorkspace_const_sptr m_eventW;
// This map does not need to be ordered, just a lookup for udet
/// typedef for the storage of the UDET-group mapping
typedef std::map<detid_t, int> udet2groupmap;
// This map needs to be ordered to process the groups in order.
/// typedef for the storage of each group's X vector
typedef std::map<int, boost::shared_ptr<MantidVec>> group2vectormap;
/// Map from udet to group
std::vector<int> udet2group;
/// The list of group numbers
std::vector<int> groupAtWorkspaceIndex;
/// Map from the group number to the group's X vector
group2vectormap group2xvector;
/// Map from the group number to the group's summed weight vector
group2vectormap group2wgtvector;
/// The number of (used) groups
int64_t nGroups;
/// Number of histograms
int nHist;
/// Number of points in the 2D workspace
int nPoints;
/// Mapping of group number to vector of inputworkspace indices.
std::vector<std::vector<std::size_t>> m_wsIndices;
/// List of valid group numbers
std::vector<int> m_validGroups;
};
} // namespace Algorithm
} // namespace Mantid
#endif /*MANTID_ALGORITHM_DIFFRACTIONFOCUSSING2_H_*/