MatrixWorkspace.h 21.1 KB
Newer Older
1
#ifndef MANTID_API_MATRIXWORKSPACE_H_
2
#define MANTID_API_MATRIXWORKSPACE_H_
3
4
5
6

//----------------------------------------------------------------------
// Includes
//----------------------------------------------------------------------
7
#ifndef Q_MOC_RUN
8
#include <boost/scoped_ptr.hpp>
9
#endif
10

11
12
#include "MantidAPI/DllConfig.h"
#include "MantidAPI/ExperimentInfo.h"
13
#include "MantidAPI/IMDWorkspace.h"
14
#include "MantidAPI/ISpectrum.h"
15
#include "MantidAPI/MatrixWorkspace_fwd.h"
16
#include "MantidAPI/MatrixWSIndexCalculator.h"
17

18
19
20
21
22
23
24
25
26
namespace Mantid {
//----------------------------------------------------------------------------
// Forward declarations
//----------------------------------------------------------------------------
namespace Geometry {
class ParameterMap;
class INearestNeighbours;
class INearestNeighboursFactory;
}
27

28
namespace API {
29
class Axis;
30
31
32
33
34
35
36
37
class SpectrumDetectorMapping;

/// typedef for the image type
typedef std::vector<std::vector<double>> MantidImage;
/// shared pointer to MantidImage
typedef boost::shared_ptr<MantidImage> MantidImage_sptr;
/// shared pointer to const MantidImage
typedef boost::shared_ptr<const MantidImage> MantidImage_const_sptr;
38

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//----------------------------------------------------------------------
/** Base MatrixWorkspace Abstract Class.

@author Laurent C Chapon, ISIS, RAL
@date 26/09/2007

Copyright &copy; 2007-2010 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 MANTID_API_DLL MatrixWorkspace : public IMDWorkspace,
                                       public ExperimentInfo {

private:
  using ExperimentInfo::toString;

public:
  // The Workspace Factory create-from-parent method needs direct access to the
  // axes.
  friend class WorkspaceFactoryImpl;

  /// Initialize
  void initialize(const std::size_t &NVectors, const std::size_t &XLength,
                  const std::size_t &YLength);
80
81

  MatrixWorkspace &operator=(const MatrixWorkspace &other) = delete;
82
  /// Delete
83
  ~MatrixWorkspace() override;
84

85
  /// Returns a clone of the workspace
Martyn Gigg's avatar
Martyn Gigg committed
86
  MatrixWorkspace_uptr clone() const { return MatrixWorkspace_uptr(doClone()); }
87

88
89
  using IMDWorkspace::toString;
  /// String description of state
90
  const std::string toString() const override;
91
92
93
94
95
96

  /**@name Instrument queries */
  //@{
  Geometry::IDetector_const_sptr getDetector(const size_t workspaceIndex) const;
  double detectorTwoTheta(Geometry::IDetector_const_sptr det) const;
  double detectorSignedTwoTheta(Geometry::IDetector_const_sptr det) const;
97

98
99
  //@}

100
  void populateInstrumentParameters() override;
101
102
103
104
105
106
107

  /** @name Nearest neighbours */
  /// Build and populate the NearestNeighbours object
  void buildNearestNeighbours(const bool ignoreMaskedDetectors = false) const;
  /// Causes the nearest neighbours map to be rebuilt
  void rebuildNearestNeighbours();
  /// Query the NearestNeighbours object for a detector
108
  std::map<specnum_t, Mantid::Kernel::V3D>
109
110
111
112
  getNeighbours(const Geometry::IDetector *comp, const double radius = 0.0,
                const bool ignoreMaskedDetectors = false) const;
  /// Query the NearestNeighbours object for a given spectrum index using a
  /// search radius
113
114
  std::map<specnum_t, Mantid::Kernel::V3D>
  getNeighbours(specnum_t spec, const double radius,
115
116
117
                const bool ignoreMaskedDetectors = false) const;
  /// Query the NearestNeighbours object for a given spectrum index using the
  /// direct number of nearest neighbours
118
119
  std::map<specnum_t, Mantid::Kernel::V3D>
  getNeighboursExact(specnum_t spec, const int nNeighbours,
120
121
122
                     const bool ignoreMaskedDetectors = false) const;
  //@}

Owen Arnold's avatar
Owen Arnold committed
123
  virtual void updateSpectraUsing(const SpectrumDetectorMapping &map);
124
125
126
127
128
129
130
131
  /// Build the default spectra mapping, most likely wanted after an instrument
  /// update
  void rebuildSpectraMapping(const bool includeMonitors = true);

  // More mapping
  spec2index_map getSpectrumToWorkspaceIndexMap() const;
  detid2index_map
  getDetectorIDToWorkspaceIndexMap(bool throwIfMultipleDets = false) const;
132
133
  virtual std::vector<size_t>
  getDetectorIDToWorkspaceIndexVector(detid_t &offset,
134
                                      bool throwIfMultipleDets = false) const;
Nick Draper's avatar
Nick Draper committed
135

136
  virtual std::vector<size_t>
Nick Draper's avatar
Nick Draper committed
137
  getSpectrumToWorkspaceIndexVector(specnum_t &offset) const;
138
  std::vector<size_t>
Nick Draper's avatar
Nick Draper committed
139
140
  getIndicesFromSpectra(const std::vector<specnum_t> &spectraList) const;
  size_t getIndexFromSpectrumNumber(const specnum_t specNo) const;
141
142
  std::vector<size_t>
  getIndicesFromDetectorIDs(const std::vector<detid_t> &detIdList) const;
Nick Draper's avatar
Nick Draper committed
143
  std::vector<specnum_t>
144
  getSpectraFromDetectorIDs(const std::vector<detid_t> &detIdList) const;
145
146
147
148

  bool hasGroupedDetectors() const;

  /// Get the footprint in memory in bytes.
149
  size_t getMemorySize() const override;
150
151
152
153
154
155
156
157
158
159
160
  virtual size_t getMemorySizeForXAxes() const;

  // Section required for iteration
  /// Returns the number of single indexable items in the workspace
  virtual std::size_t size() const = 0;
  /// Returns the size of each block of data returned by the dataY accessors
  virtual std::size_t blocksize() const = 0;
  /// Returns the number of histograms in the workspace
  virtual std::size_t getNumberHistograms() const = 0;

  /// Sets MatrixWorkspace title
161
  void setTitle(const std::string &) override;
162
  /// Gets MatrixWorkspace title (same as Run object run_title property)
163
  const std::string getTitle() const override;
164

Owen Arnold's avatar
Owen Arnold committed
165
  virtual Kernel::DateAndTime getFirstPulseTime() const;
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
  Kernel::DateAndTime getLastPulseTime() const;

  /// Returns the bin index for a given X value of a given workspace index
  size_t binIndexOf(const double xValue, const std::size_t = 0) const;

  //----------------------------------------------------------------------
  // DATA ACCESSORS
  //----------------------------------------------------------------------

  /// Return the underlying ISpectrum ptr at the given workspace index.
  virtual ISpectrum *getSpectrum(const size_t index) = 0;

  /// Return the underlying ISpectrum ptr (const version) at the given workspace
  /// index.
  virtual const ISpectrum *getSpectrum(const size_t index) const = 0;

  // Methods for getting read-only access to the data.
  // Just passes through to the virtual dataX/Y/E function (const version)
  /// Returns a read-only (i.e. const) reference to the specified X array
  /// @param index :: workspace index to retrieve.
  const MantidVec &readX(std::size_t const index) const {
    return getSpectrum(index)->dataX();
  }
  /// Returns a read-only (i.e. const) reference to the specified Y array
  /// @param index :: workspace index to retrieve.
  const MantidVec &readY(std::size_t const index) const {
    return getSpectrum(index)->dataY();
  }
  /// Returns a read-only (i.e. const) reference to the specified E array
  /// @param index :: workspace index to retrieve.
  const MantidVec &readE(std::size_t const index) const {
    return getSpectrum(index)->dataE();
  }
  /// Returns a read-only (i.e. const) reference to the specified X error array
  /// @param index :: workspace index to retrieve.
  const MantidVec &readDx(size_t const index) const {
    return getSpectrum(index)->dataDx();
  }

  /// Returns the x data
  virtual MantidVec &dataX(const std::size_t index) {
    invalidateCommonBinsFlag();
    return getSpectrum(index)->dataX();
  }
  /// Returns the y data
  virtual MantidVec &dataY(const std::size_t index) {
    return getSpectrum(index)->dataY();
  }
  /// Returns the error data
  virtual MantidVec &dataE(const std::size_t index) {
    return getSpectrum(index)->dataE();
  }
  /// Returns the x error data
  virtual MantidVec &dataDx(const std::size_t index) {
    return getSpectrum(index)->dataDx();
  }

  /// Returns the x data const
  virtual const MantidVec &dataX(const std::size_t index) const {
    return getSpectrum(index)->dataX();
  }
  /// Returns the y data const
  virtual const MantidVec &dataY(const std::size_t index) const {
    return getSpectrum(index)->dataY();
  }
  /// Returns the error const
  virtual const MantidVec &dataE(const std::size_t index) const {
    return getSpectrum(index)->dataE();
  }
  /// Returns the error const
  virtual const MantidVec &dataDx(const std::size_t index) const {
    return getSpectrum(index)->dataDx();
238
  }
239

240
241
242
  virtual double getXMin() const;
  virtual double getXMax() const;
  virtual void getXMinMax(double &xmin, double &xmax) const;
243

244
245
246
247
248
  /// Returns a pointer to the x data
  virtual Kernel::cow_ptr<MantidVec> refX(const std::size_t index) const {
    return getSpectrum(index)->ptrX();
  }

249
250
251
252
253
  /// Returns a pointer to the dX  (X Error) data
  virtual Kernel::cow_ptr<MantidVec> refDx(const std::size_t index) const {
    return getSpectrum(index)->ptrDx();
  }

254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
  /// Set the specified X array to point to the given existing array
  virtual void setX(const std::size_t index, const MantidVec &X) {
    getSpectrum(index)->setX(X);
    invalidateCommonBinsFlag();
  }

  /// Set the specified X array to point to the given existing array
  virtual void setX(const std::size_t index, const MantidVecPtr &X) {
    getSpectrum(index)->setX(X);
    invalidateCommonBinsFlag();
  }

  /// Set the specified X array to point to the given existing array
  virtual void setX(const std::size_t index, const MantidVecPtr::ptr_type &X) {
    getSpectrum(index)->setX(X);
    invalidateCommonBinsFlag();
  }

272
273
274
275
276
277
278
279
280
281
282
283
284
  /// Set the specified Dx (X Error) array to point to the given existing array
  virtual void setDx(const std::size_t index, const MantidVec &Dx) {
    getSpectrum(index)->setDx(Dx);
    invalidateCommonBinsFlag();
  }

  /// Set the specified Dx (X Error) array to point to the given existing array
  virtual void setDx(const std::size_t index, const MantidVecPtr &Dx) {
    getSpectrum(index)->setDx(Dx);
    invalidateCommonBinsFlag();
  }

  /// Set the specified Dx (X Error) array to point to the given existing array
285
286
  virtual void setDx(const std::size_t index,
                     const MantidVecPtr::ptr_type &Dx) {
287
288
289
290
    getSpectrum(index)->setX(Dx);
    invalidateCommonBinsFlag();
  }

291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  /** Sets the data in the workspace
  @param index :: the workspace index to set.
  @param Y :: Y vector  */
  virtual void setData(const std::size_t index, const MantidVecPtr &Y) {
    getSpectrum(index)->setData(Y);
  }

  /** Sets the data in the workspace
  @param index :: the workspace index to set.
  @param Y :: Y vector
  @param E :: Error vector   */
  virtual void setData(const std::size_t index, const MantidVecPtr &Y,
                       const MantidVecPtr &E) {
    getSpectrum(index)->setData(Y, E);
  }

  /** Sets the data in the workspace
  @param index :: the workspace index to set.
  @param Y :: Y vector
  @param E :: Error vector   */
  virtual void setData(const std::size_t index, const MantidVecPtr::ptr_type &Y,
                       const MantidVecPtr::ptr_type &E) {
    getSpectrum(index)->setData(Y, E);
  }

316
317
318
319
320
321
322
323
  /**
   * Probes if DX (X Error) values were set on a particular spectrum
   * @param index: the spectrum index
   */
  virtual bool hasDx(const std::size_t index) const {
    return getSpectrum(index)->hasDx();
  }

324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  /// Generate the histogram or rebin the existing histogram.
  virtual void generateHistogram(const std::size_t index, const MantidVec &X,
                                 MantidVec &Y, MantidVec &E,
                                 bool skipError = false) const = 0;

  /// Return a vector with the integrated counts for all spectra withing the
  /// given range
  virtual void getIntegratedSpectra(std::vector<double> &out, const double minX,
                                    const double maxX,
                                    const bool entireRange) const;

  /// Return an index in the X vector for an x-value close to a given value
  std::pair<size_t, double> getXIndex(size_t i, double x, bool isLeft = true,
                                      size_t start = 0) const;

  //----------------------------------------------------------------------

  int axes() const;
Owen Arnold's avatar
Owen Arnold committed
342
  virtual Axis *getAxis(const std::size_t &axisIndex) const;
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
  void replaceAxis(const std::size_t &axisIndex, Axis *const newAxis);

  /// Returns true if the workspace contains data in histogram form (as opposed
  /// to point-like)
  virtual bool isHistogramData() const;

  /// Returns true if the workspace contains has common X bins
  virtual bool isCommonBins() const;

  std::string YUnit() const;
  void setYUnit(const std::string &newUnit);
  std::string YUnitLabel() const;
  void setYUnitLabel(const std::string &newLabel);

  /// Are the Y-values dimensioned?
  const bool &isDistribution() const;
  bool &isDistribution(bool newValue);

  /// Mask a given workspace index, setting the data and error values to zero
  void maskWorkspaceIndex(const std::size_t index);

  // Methods to set and access masked bins
  void maskBin(const size_t &workspaceIndex, const size_t &binIndex,
               const double &weight = 1.0);
  void flagMasked(const size_t &spectrumIndex, const size_t &binIndex,
                  const double &weight = 1.0);
369
  bool hasMaskedBins(const size_t &workspaceIndex) const;
370
371
372
  /// Masked bins for each spectrum are stored as a set of pairs containing <bin
  /// index, weight>
  typedef std::map<size_t, double> MaskList;
373
  const MaskList &maskedBins(const size_t &workspaceIndex) const;
374
375

  // Methods handling the internal monitor workspace
376
377
  virtual void
  setMonitorWorkspace(const boost::shared_ptr<MatrixWorkspace> &monitorWS);
378
379
380
381
382
383
384
385
386
387
388
  boost::shared_ptr<MatrixWorkspace> monitorWorkspace() const;

  void saveInstrumentNexus(::NeXus::File *file) const;
  void loadInstrumentNexus(::NeXus::File *file);
  void saveSpectraMapNexus(
      ::NeXus::File *file, const std::vector<int> &spec,
      const ::NeXus::NXcompression compression = ::NeXus::LZW) const;

  //=====================================================================================
  // MD Geometry methods
  //=====================================================================================
389
390
391
392
393
  size_t getNumDims() const override;
  boost::shared_ptr<const Mantid::Geometry::IMDDimension>
  getDimension(size_t index) const override;
  boost::shared_ptr<const Mantid::Geometry::IMDDimension>
  getDimensionWithId(std::string id) const override;
394
395
396
397
398
399
400
401
402
  //=====================================================================================
  // End MD Geometry methods
  //=====================================================================================

  //=====================================================================================
  // IMDWorkspace methods
  //=====================================================================================

  /// Gets the number of points available on the workspace.
403
  uint64_t getNPoints() const override;
404
  /// Get the number of points available on the workspace.
405
  uint64_t getNEvents() const override { return this->getNPoints(); }
406
407
408
409
410
  /// Dimension id for x-dimension.
  static const std::string xDimensionId;
  /// Dimensin id for y-dimension.
  static const std::string yDimensionId;
  /// Generate a line plot through the matrix workspace.
411
412
413
  LinePlot getLinePlot(const Mantid::Kernel::VMD &start,
                       const Mantid::Kernel::VMD &end,
                       Mantid::API::MDNormalization normalize) const override;
414
  /// Get the signal at a coordinate in the workspace.
415
416
417
  signal_t getSignalAtCoord(
      const coord_t *coords,
      const Mantid::API::MDNormalization &normalization) const override;
418
  /// Get the signal at a coordinate in the workspace
419
  signal_t getSignalWithMaskAtCoord(
Matthew D Jones's avatar
Matthew D Jones committed
420
      const coord_t *coords,
421
      const Mantid::API::MDNormalization &normalization) const override;
422
423
  /// Create iterators. Partitions the iterators according to the number of
  /// cores.
424
  std::vector<IMDIterator *> createIterators(
425
      size_t suggestedNumCores = 1,
426
      Mantid::Geometry::MDImplicitFunction *function = nullptr) const override;
427
428

  /// Apply masking.
429
430
  void
  setMDMasking(Mantid::Geometry::MDImplicitFunction *maskingRegion) override;
431
  /// Clear exsting masking.
432
  void clearMDMasking() override;
433
434

  /// @return the special coordinate system used if any.
435
436
  Mantid::Kernel::SpecialCoordinateSystem
  getSpecialCoordinateSystem() const override;
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468

  //=====================================================================================
  // End IMDWorkspace methods
  //=====================================================================================

  //=====================================================================================
  // Image methods
  //=====================================================================================

  /// Get start and end x indices for images
  std::pair<size_t, size_t> getImageStartEndXIndices(size_t i, double startX,
                                                     double endX) const;
  /// Create an image of Ys.
  MantidImage_sptr getImageY(size_t start = 0, size_t stop = 0,
                             size_t width = 0, double startX = EMPTY_DBL(),
                             double endX = EMPTY_DBL()) const;
  /// Create an image of Es.
  MantidImage_sptr getImageE(size_t start = 0, size_t stop = 0,
                             size_t width = 0, double startX = EMPTY_DBL(),
                             double endX = EMPTY_DBL()) const;
  /// Copy the data (Y's) from an image to this workspace.
  virtual void setImageY(const MantidImage &image, size_t start = 0,
                         bool parallelExecution = true);
  /// Copy the data from an image to this workspace's errors.
  virtual void setImageE(const MantidImage &image, size_t start = 0,
                         bool parallelExecution = true);

  //=====================================================================================
  // End image methods
  //=====================================================================================

protected:
469
470
471
  /// Protected copy constructor. May be used by childs for cloning.
  MatrixWorkspace(const MatrixWorkspace &other);

472
  MatrixWorkspace(
473
      Mantid::Geometry::INearestNeighboursFactory *nnFactory = nullptr);
474
475
476
477
478
479
480
481
482
483
484
485
486
487

  /// Initialises the workspace. Sets the size and lengths of the arrays. Must
  /// be overloaded.
  virtual void init(const std::size_t &NVectors, const std::size_t &XLength,
                    const std::size_t &YLength) = 0;

  /// Invalidates the commons bins flag.  This is generally called when a method
  /// could allow the X values to be changed.
  void invalidateCommonBinsFlag() { m_isCommonBinsFlagSet = false; }

  /// A vector of pointers to the axes for this workspace
  std::vector<Axis *> m_axes;

private:
488
  MatrixWorkspace *doClone() const override = 0;
489

490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  /// Create an MantidImage instance.
  MantidImage_sptr
  getImage(const MantidVec &(MatrixWorkspace::*read)(std::size_t const) const,
           size_t start, size_t stop, size_t width, size_t indexStart,
           size_t indexEnd) const;
  /// Copy data from an image.
  void setImage(MantidVec &(MatrixWorkspace::*dataVec)(const std::size_t),
                const MantidImage &image, size_t start, bool parallelExecution);

  /// Has this workspace been initialised?
  bool m_isInitialized;

  /// The unit for the data values (e.g. Counts)
  std::string m_YUnit;
  /// A text label for use when plotting spectra
  std::string m_YUnitLabel;
  /// Flag indicating whether the Y-values are dimensioned. False by default
  bool m_isDistribution;

  /// Flag indicating whether the m_isCommonBinsFlag has been set. False by
  /// default
  mutable bool m_isCommonBinsFlagSet;
  /// Flag indicating whether the data has common bins. False by default
  mutable bool m_isCommonBinsFlag;

  /// The set of masked bins in a map keyed on spectrum index
  std::map<int64_t, MaskList> m_masks;

  /// A workspace holding monitor data relating to the main data in the
  /// containing workspace (null if none).
  boost::shared_ptr<MatrixWorkspace> m_monitorWorkspace;

protected:
  /// Assists conversions to and from 2D histogram indexing to 1D indexing.
  MatrixWSIndexCalculator m_indexCalculator;

  /// Scoped pointer to NearestNeighbours factory
  boost::scoped_ptr<Mantid::Geometry::INearestNeighboursFactory>
      m_nearestNeighboursFactory;

  /// Shared pointer to NearestNeighbours object
  mutable boost::shared_ptr<Mantid::Geometry::INearestNeighbours>
      m_nearestNeighbours;

  /// Getter for the dimension id based on the axis.
  std::string getDimensionIdFromAxis(const int &axisIndex) const;
};

/// shared pointer to the matrix workspace base class
typedef boost::shared_ptr<MatrixWorkspace> MatrixWorkspace_sptr;
/// shared pointer to the matrix workspace base class (const version)
typedef boost::shared_ptr<const MatrixWorkspace> MatrixWorkspace_const_sptr;

} // namespace API
} // namespace Mantid
545

546
#endif /*MANTID_API_MATRIXWORKSPACE_H_*/