-
Notifications
You must be signed in to change notification settings - Fork 122
/
VesuvioCalculateMS.h
129 lines (111 loc) · 5.73 KB
/
VesuvioCalculateMS.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2014 ISIS Rutherford Appleton Laboratory UKRI,
// NScD Oak Ridge National Laboratory, European Spallation Source,
// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
// SPDX - License - Identifier: GPL - 3.0 +
#pragma once
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include "MantidAPI/Algorithm.h"
#include "MantidCurveFitting/DllConfig.h"
#include "MantidCurveFitting/MSVesuvioHelpers.h"
#include "MantidGeometry/Instrument/ReferenceFrame.h"
#include "MantidKernel/V3D.h"
namespace Mantid {
namespace API {
class ISpectrum;
}
namespace Geometry {
class IObject;
}
namespace CurveFitting {
namespace Functions {
struct ResolutionParams;
}
namespace Algorithms {
struct DetectorParams;
/**
Calculates the multiple scattering & total scattering contributions
for a flat-plate or cylindrical sample.
*/
class MANTID_CURVEFITTING_DLL VesuvioCalculateMS : public API::Algorithm {
private:
// Holds date on the compton scattering properties of an atom
struct ComptonNeutronAtom {
ComptonNeutronAtom() : mass(-1.0), sclength(-1.0), profile(-1.0) {}
double mass; // in amu
double sclength; // 4pi/xsec
double profile; // s.d of J(y)
};
// Holds data about sample as a whole.
struct SampleComptonProperties {
SampleComptonProperties(const int nprops) : atoms(nprops), density(-1.0), totalxsec(-1.0), mu(-1.0) {}
std::vector<ComptonNeutronAtom> atoms;
double density; // g/cm^3
double totalxsec; // total free-scattering cross section
double mu; // attenuation factor (1/m)
};
public:
VesuvioCalculateMS();
/// @copydoc Algorithm::name
const std::string name() const override { return "VesuvioCalculateMS"; }
/// @copydoc Algorithm::version
int version() const override { return 1; }
/// @copydoc Algorithm::category
const std::string category() const override { return "CorrectionFunctions\\SpecialCorrections"; }
/// @copydoc Algorithm::summary
const std::string summary() const override {
return "Calculates the contributions of multiple scattering "
"on a flat plate sample for VESUVIO";
}
const std::vector<std::string> seeAlso() const override {
return {"MayersSampleCorrection", "MonteCarloAbsorption", "CarpenterSampleCorrection"};
}
private:
void init() override;
void exec() override;
void cacheInputs();
void calculateMS(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const size_t wsIndex,
API::ISpectrum &totalsc, API::ISpectrum &multsc) const;
void simulate(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const DetectorParams &detpar,
const Functions::ResolutionParams &respar, MSVesuvioHelper::Simulation &simulCounts) const;
void assignToOutput(const MSVesuvioHelper::SimulationWithErrors &avgCounts, API::ISpectrum &totalsc,
API::ISpectrum &multsc) const;
double calculateCounts(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const DetectorParams &detpar,
const Functions::ResolutionParams &respar, MSVesuvioHelper::Simulation &simulation) const;
// single-event helpers
Kernel::V3D generateSrcPos(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const double l1) const;
double generateE0(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const double l1, const double t2,
double &weight) const;
double generateTOF(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const double en0, const double dtof,
const double dl1) const;
bool generateScatter(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const Kernel::V3D &startPos,
const Kernel::V3D &direc, double &weight, Kernel::V3D &scatterPt) const;
std::pair<double, double> calculateE1Range(const double theta, const double en0) const;
double partialDiffXSec(const double en0, const double en1, const double theta) const;
Kernel::V3D generateDetectorPos(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng,
const Kernel::V3D &nominalPos, const double energy, const Kernel::V3D &scatterPt,
const Kernel::V3D &direcBeforeSc, double &scang, double &distToExit) const;
double generateE1(CurveFitting::MSVesuvioHelper::RandomVariateGenerator &rng, const double angle, const double e1nom,
const double e1res) const;
// Member Variables
size_t m_acrossIdx, m_upIdx, m_beamIdx; // indices of each direction
Kernel::V3D m_beamDir; // Directional vector for beam
double m_srcR2; // beam penumbra radius (m)
double m_halfSampleHeight, m_halfSampleWidth, m_halfSampleThick; // (m)
Geometry::IObject const *m_sampleShape; // sample shape
std::unique_ptr<SampleComptonProperties> m_sampleProps; // description of sample properties
double m_detHeight, m_detWidth, m_detThick; // (m)
double m_tmin, m_tmax, m_delt; // min, max & dt TOF value
double m_foilRes; // resolution in energy of foil
size_t m_nscatters; // highest order of scattering to generate
size_t m_nruns; // number of runs per spectrum
size_t m_nevents; // number of single events per run
std::unique_ptr<API::Progress> m_progress;
API::MatrixWorkspace_sptr m_inputWS;
};
} // namespace Algorithms
} // namespace CurveFitting
} // namespace Mantid