44 " simulation = get_simulation()\n"
45 " simulation.setSample(sample)\n"
46 " simulation.runSimulation()\n"
47 " return simulation.result()\n"
58 "SimulationToPython::defineMasks() -> Error. Unknown detector units.");
75 if (simulation.
sample() ==
nullptr)
76 throw std::runtime_error(
"SimulationToPython::generateSimulationCode() -> Error. "
77 "Simulation is not initialized.");
87 std::ostringstream result;
88 result <<
"def get_simulation():\n";
97 throw std::runtime_error(
"SimulationToPython::defineGetSimulation() -> Error. "
98 "Wrong simulation type");
106 std::ostringstream result;
107 result <<
pyfmt::indent() <<
"simulation = ba.GISASSimulation()\n";
121 std::ostringstream result;
122 result <<
pyfmt::indent() <<
"simulation = ba.OffSpecSimulation()\n";
136 std::ostringstream result;
137 result <<
pyfmt::indent() <<
"simulation = ba.SpecularSimulation()\n";
151 "detector must be two-dimensional for GISAS");
152 std::ostringstream result;
153 result << std::setprecision(12);
156 result <<
pyfmt::indent() <<
"simulation.setDetectorParameters(";
157 for (
size_t index = 0; index < det->dimension(); ++index) {
160 result << det->getAxis(index).size() <<
", "
167 result <<
pyfmt::indent() <<
"detector = ba.RectangularDetector(" << det->getNbinsX()
178 result <<
pyfmt::indent() <<
"detector.setPerpendicularToSampleX("
182 }
else if (det->getDetectorArrangment()
184 result <<
pyfmt::indent() <<
"detector.setPerpendicularToDirectBeam("
188 }
else if (det->getDetectorArrangment()
190 result <<
pyfmt::indent() <<
"detector.setPerpendicularToReflectedBeam("
194 }
else if (det->getDetectorArrangment()
196 result <<
pyfmt::indent() <<
"detector.setPerpendicularToReflectedBeam("
198 result <<
pyfmt::indent() <<
"detector.setDirectBeamPosition("
203 "SimulationToPython::defineDetector() -> Error. Unknown alignment.");
205 result <<
pyfmt::indent() <<
"simulation.setDetector(detector)\n";
210 result <<
pyfmt::indent() <<
"simulation.setRegionOfInterest("
222 std::ostringstream result;
228 p_convfunc->getResolutionFunction2D())) {
229 result <<
pyfmt::indent() <<
"simulation.setDetectorResolutionFunction(";
230 result <<
"ba.ResolutionFunction2DGaussian(";
231 result <<
printFunc(detector)(resfunc->getSigmaX()) <<
", ";
232 result <<
printFunc(detector)(resfunc->getSigmaY()) <<
"))\n";
235 "SimulationToPython::defineDetectorResolutionFunction() -> Error. "
236 "Unknown detector resolution function");
239 "SimulationToPython::defineDetectorResolutionFunction() -> Error. "
240 "Not a ConvolutionDetectorResolution function");
248 std::ostringstream result;
252 double analyzer_total_transmission =
255 if (analyzer_direction.
mag() > 0.0) {
256 std::string direction_name =
"analyzer_direction";
257 result <<
pyfmt::indent() << direction_name <<
" = kvector_t("
261 result <<
pyfmt::indent() <<
"simulation.setAnalyzerProperties(" << direction_name <<
", "
270 std::ostringstream result;
285 std::ostringstream result;
288 const std::string axis_def =
pyfmt::indent() +
"alpha_i_axis = ";
289 result << axis_def << simulation.
beamAxis()->
pyString(
"rad", axis_def.size()) <<
"\n";
302 std::ostringstream result;
305 throw std::runtime_error(
"Error SimulationToPython::defineSpecularScan: passed simulation "
306 "does not contain any scan");
307 result << *scan <<
"\n";
317 std::ostringstream result;
319 if (bloch_vector.mag() > 0.0) {
320 std::string beam_polarization =
"beam_polarization";
321 result <<
pyfmt::indent() << beam_polarization <<
" = kvector_t("
325 result <<
pyfmt::indent() <<
"simulation.setBeamPolarization(" << beam_polarization
333 std::ostringstream result;
335 if (beam_intensity > 0.0)
343 std::ostringstream result;
344 const std::vector<ParameterDistribution>& distributions =
346 if (distributions.empty())
348 for (
size_t i = 0; i < distributions.size(); ++i) {
349 std::string main_par_name = distributions[i].getMainParameterName();
353 size_t nbr_samples = distributions[i].getNbrSamples();
354 double sigma_factor = distributions[i].getSigmaFactor();
356 std::string s_distr =
"distr_" + std::to_string(i + 1);
361 result <<
pyfmt::indent() <<
"simulation.addParameterDistribution(\"" << main_par_name
362 <<
"\", " << s_distr <<
", " << nbr_samples <<
", "
371 std::ostringstream result;
372 result << std::setprecision(12);
378 for (
size_t i_mask = 0; i_mask < detectorMask->
numberOfMasks(); ++i_mask) {
379 bool mask_value(
false);
391 std::ostringstream result;
392 result << std::setprecision(12);
396 result <<
pyfmt::indent() <<
"simulation.getOptions().setNumberOfThreads("
399 result <<
pyfmt::indent() <<
"simulation.getOptions().setMonteCarloIntegration(True, "
402 result <<
pyfmt::indent() <<
"simulation.getOptions().setUseAvgMaterials(True)\n";
404 result <<
pyfmt::indent() <<
"simulation.getOptions().setIncludeSpecular(True)\n";
410 std::ostringstream result;
414 if (p_constant_bg->backgroundValue() > 0.0) {
415 result <<
pyfmt::indent() <<
"background = ba.ConstantBackground("
417 result <<
pyfmt::indent() <<
"simulation.setBackground(background)\n";
420 result <<
pyfmt::indent() <<
"background = ba.PoissonNoiseBackground()\n";
421 result <<
pyfmt::indent() <<
"simulation.setBackground(background)\n";
430 result =
"if __name__ == '__main__': \n"
431 " result = run_simulation()\n"
432 " ba.plot_simulation_result(result)\n";
434 result =
"if __name__ == '__main__': \n"
435 " result = run_simulation()\n"
437 " if len(sys.argv)<2:\n"
438 " exit(\"File name is required\")\n"
439 " ba.IntensityDataIOFactory.writeSimulationResult(result, sys.argv[1])\n";
441 throw std::runtime_error(
"SimulationToPython::defineMain() -> Error. Unknown main type.");
Defines and implements namespace algo with some algorithms.
Defines class ConstantBackground.
Defines class ConvolutionDetectorResolution.
Defines class GISASSimulation.
Defines namespace INodeUtils.
Declares and implements pure virtual class ISpecularScan.
Defines class OffSpecSimulation.
Defines namespace ParameterUtils.
Defines class PoissonNoiseBackground.
Defines namespace pyfmt2.
Defines functions in namespace pyfmt.
Defines functions in namespace pyfmt.
Defines class RectangularDetector.
Defines class RegionOfInterest.
Defines class ResolutionFunction2DGaussian.
Defines class SampleToPython.
Defines class SimulationToPython.
Defines class SpecularSimulation.
Defines class SphericalDetector.
double mag() const
Returns magnitude of the vector.
T z() const
Returns z-component in cartesian coordinate system.
T y() const
Returns y-component in cartesian coordinate system.
T x() const
Returns x-component in cartesian coordinate system.
Beam defined by wavelength, direction and intensity.
double getWavelength() const
double getIntensity() const
Returns the beam intensity in neutrons/sec.
kvector_t getBlochVector() const
Class representing a constant background signal.
Convolutes the intensity in 1 or 2 dimensions with a resolution function.
double analyzerEfficiency() const
will always return positive value
double analyzerTotalTransmission() const
kvector_t analyzerDirection() const
Retrieve the analyzer characteristics.
Collection of detector masks.
const IShape2D * getMaskShape(size_t mask_index, bool &mask_value) const
size_t numberOfMasks() const
const Distributions_t & getDistributions() const
Main class to run a Grazing-Incidence Small-Angle Scattering simulation.
virtual std::string pyString(const std::string &units, size_t offset) const =0
Interface for detector resolution algorithms.
Abstract detector interface.
virtual const DetectorMask * detectorMask() const =0
Returns detector masks container.
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
const IDetectorResolution * detectorResolution() const
Returns a pointer to detector resolution object.
virtual const RegionOfInterest * regionOfInterest() const =0
Returns region of interest if exists.
virtual Axes::Units defaultAxesUnits() const
Return default axes units.
const DetectionProperties & detectionProperties() const
Returns detection properties.
Basic class for all shapes in 2D.
Pure virtual base class for all types of specular scans.
const IDetector * getDetector() const
Main class to run an off-specular simulation.
const IAxis * beamAxis() const
Returns axis of the beam.
Class representing Poisson noise on top of the scattered intensity.
A flat rectangular detector with axes and resolution function.
@ PERPENDICULAR_TO_DIRECT_BEAM
@ PERPENDICULAR_TO_SAMPLE
@ PERPENDICULAR_TO_REFLECTED_BEAM_DPOS
@ PERPENDICULAR_TO_REFLECTED_BEAM
Simple gaussian two-dimensional resolution function.
Generates Python code snippet from domain (C++) objects representing sample construction.
std::string generateSampleCode(const MultiLayer &multilayer)
Collect the different options for simulation.
size_t getMcPoints() const
bool includeSpecular() const
unsigned getHardwareConcurrency() const
unsigned getNumberOfThreads() const
bool useAvgMaterials() const
std::string defineOffSpecSimulation(const OffSpecSimulation *simulation) const
std::string defineDetectorPolarizationAnalysis(const Simulation *simulation) const
std::string defineSpecularSimulation(const SpecularSimulation *simulation) const
@ SAVE_DATA
main function saves intensity data
@ RUN_SIMULATION
main function runs simulation
std::string defineOffSpecBeam(const OffSpecSimulation &simulation) const
std::string generateSimulationCode(const Simulation &simulation, EMainType mainType)
Returns a Python script that sets up a simulation and runs it if invoked as main program.
std::string defineSimulationOptions(const Simulation *simulation) const
std::string defineGISASBeam(const GISASSimulation &simulation) const
std::string defineDetectorResolutionFunction(const Simulation *simulation) const
std::string defineSpecularScan(const SpecularSimulation &simulation) const
std::string defineParameterDistributions(const Simulation *simulation) const
std::string defineBeamIntensity(const Beam &beam) const
std::string defineGetSimulation(const Simulation *simulation) const
std::string defineBeamPolarization(const Beam &beam) const
std::string defineBackground(const Simulation *simulation) const
std::string defineGISASSimulation(const GISASSimulation *simulation) const
std::string defineMain(EMainType mainType=RUN_SIMULATION)
std::string defineMasks(const Simulation *simulation) const
std::string defineDetector(const Simulation *simulation) const
Pure virtual base class of OffSpecularSimulation, GISASSimulation and SpecularSimulation.
const SimulationOptions & getOptions() const
const Instrument & instrument() const
const IBackground * background() const
const DistributionHandler & getDistributionHandler() const
const MultiLayer * sample() const
Main class to run a specular simulation.
const ISpecularScan * dataHandler() const
Returns internal data handler.
A spherical detector with axes and resolution function.
std::string poolParameterUnits(const IParameterized &node, const std::string &parName)
Returns units of main parameter.
bool almostEqual(double a, double b)
Returns true if two doubles agree within machine epsilon.
std::function< std::string(double)> printFunc(const IDetector *detector)
Returns a function that converts a coordinate to a Python code snippet with appropiate unit.
bool isDefaultDirection(const kvector_t direction)
returns true if it is (0, -1, 0) vector
const std::string defineSimulate
std::string printDistribution(const IDistribution1D &par_distr, const std::string &units)
Prints distribution with constructor parameters in given units.
std::string representShape2D(const std::string &indent, const IShape2D *ishape, bool mask_value, std::function< std::string(double)> printValueFunc)
Returns fixed Python code snippet that defines the function "runSimulation".
std::string printNm(double input)
std::string getSampleFunctionName()
std::string printDegrees(double input)
std::string printDouble(double input)
std::string printKvector(const kvector_t value)
std::string printScientificDouble(double input)
std::string indent(size_t width)
Returns a string of blanks with given width.
std::string printRealLimitsArg(const RealLimits &limits, const std::string &units)
Prints RealLimits in the form of argument (in the context of ParameterDistribution and similar).
std::string scriptPreamble()