BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
pyfmt2 Namespace Reference

Functions

std::string representShape2D (const std::string &indent, const IShape2D *ishape, bool mask_value, std::function< std::string(double)> printValueFunc)
 
std::string valueTimesUnit (const RealParameter *par)
 
std::string argumentList (const IParameterized *ip)
 
std::string printDistribution (const IDistribution1D &par_distr, const std::string &units)
 
std::string printParameterDistribution (const ParameterDistribution &par_distr, const std::string &distVarName, const std::string &units)
 

Detailed Description

Utility functions for writing Python code snippets.

Function Documentation

◆ representShape2D()

std::string pyfmt2::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".

Definition at line 38 of file PyFmt2.cpp.

40 {
41  std::ostringstream result;
42  result << std::setprecision(12);
43 
44  if (const Polygon* shape = dynamic_cast<const Polygon*>(ishape)) {
45  std::vector<double> xpos, ypos;
46  shape->getPoints(xpos, ypos);
47  result << indent << "points = [";
48  for (size_t i = 0; i < xpos.size(); ++i) {
49  result << "[" << printValueFunc(xpos[i]) << ", " << printValueFunc(ypos[i]) << "]";
50  if (i != xpos.size() - 1)
51  result << ", ";
52  }
53  result << "]\n";
54  result << indent << "simulation.addMask("
55  << "ba.Polygon(points), " << pyfmt::printBool(mask_value) << ")\n";
56 
57  } else if (dynamic_cast<const InfinitePlane*>(ishape)) {
58  result << indent << "simulation.maskAll()\n";
59 
60  } else if (const Ellipse* shape = dynamic_cast<const Ellipse*>(ishape)) {
61  result << indent << "simulation.addMask(";
62  result << "ba.Ellipse(" << printValueFunc(shape->getCenterX()) << ", "
63  << printValueFunc(shape->getCenterY()) << ", " << printValueFunc(shape->getRadiusX())
64  << ", " << printValueFunc(shape->getRadiusY());
65  if (shape->getTheta() != 0.0)
66  result << ", " << pyfmt::printDegrees(shape->getTheta());
67  result << "), " << pyfmt::printBool(mask_value) << ")\n";
68  }
69 
70  else if (const Rectangle* shape = dynamic_cast<const Rectangle*>(ishape)) {
71  result << indent << "simulation.addMask(";
72  result << "ba.Rectangle(" << printValueFunc(shape->getXlow()) << ", "
73  << printValueFunc(shape->getYlow()) << ", " << printValueFunc(shape->getXup())
74  << ", " << printValueFunc(shape->getYup()) << "), " << pyfmt::printBool(mask_value)
75  << ")\n";
76  }
77 
78  else if (const VerticalLine* shape = dynamic_cast<const VerticalLine*>(ishape)) {
79  result << indent << "simulation.addMask(";
80  result << "ba.VerticalLine(" << printValueFunc(shape->getXpos()) << "), "
81  << pyfmt::printBool(mask_value) << ")\n";
82  }
83 
84  else if (const HorizontalLine* shape = dynamic_cast<const HorizontalLine*>(ishape)) {
85  result << indent << "simulation.addMask(";
86  result << "ba.HorizontalLine(" << printValueFunc(shape->getYpos()) << "), "
87  << pyfmt::printBool(mask_value) << ")\n";
88 
89  } else
90  throw std::runtime_error("representShape2D(const IShape2D*) -> Error. Unknown shape");
91 
92  return result.str();
93 }
Ellipse shape.
Definition: Ellipse.h:24
An infinite horizontal line.
Definition: Line.h:58
The infinite plane is used for masking everything once and forever.
Definition: InfinitePlane.h:24
A polygon in 2D space.
Definition: Polygon.h:31
The rectangle shape having its axis aligned to the (non-rotated) coordinate system.
Definition: Rectangle.h:24
An infinite vertical line.
Definition: Line.h:40
std::string printDegrees(double input)
Definition: PyFmt.cpp:94
std::string printBool(double value)
Definition: PyFmt.cpp:38
std::string indent(size_t width)
Returns a string of blanks with given width.
Definition: PyFmt.cpp:141

References pyfmt::indent(), pyfmt::printBool(), and pyfmt::printDegrees().

Referenced by SimulationToPython::defineMasks().

Here is the call graph for this function:

◆ valueTimesUnit()

std::string pyfmt2::valueTimesUnit ( const RealParameter par)

Returns parameter value, followed by its unit multiplicator (like "* nm").

Definition at line 97 of file PyFmt2.cpp.

98 {
99  if (par->unit() == "rad")
100  return pyfmt::printDegrees(par->value());
101  return pyfmt::printDouble(par->value()) + (par->unit() == "" ? "" : ("*" + par->unit()));
102 }
double value() const
Returns value of wrapped parameter.
std::string unit() const
std::string printDouble(double input)
Definition: PyFmt.cpp:43

References pyfmt::printDegrees(), pyfmt::printDouble(), RealParameter::unit(), and RealParameter::value().

Referenced by argumentList().

Here is the call graph for this function:

◆ argumentList()

std::string pyfmt2::argumentList ( const IParameterized ip)

Returns comma-separated list of parameter values, including unit multiplicator (like "* nm").

Definition at line 106 of file PyFmt2.cpp.

107 {
108  std::vector<std::string> args;
109  for (const auto* par : ip->parameterPool()->parameters())
110  args.push_back(valueTimesUnit(par));
111  return StringUtils::join(args, ", ");
112 }
ParameterPool * parameterPool() const
Returns pointer to the parameter pool.
const std::vector< RealParameter * > parameters() const
Returns full vector of parameters.
Definition: ParameterPool.h:52
std::string join(const std::vector< std::string > &joinable, const std::string &joint)
Returns string obtain by joining vector elements.
Definition: StringUtils.cpp:71
std::string valueTimesUnit(const RealParameter *par)
Returns parameter value, followed by its unit multiplicator (like "* nm").
Definition: PyFmt2.cpp:97

References StringUtils::join(), IParameterized::parameterPool(), ParameterPool::parameters(), and valueTimesUnit().

Referenced by SampleToPython::defineFormFactors(), SampleToPython::defineInterferenceFunctions(), SampleToPython::defineRoughnesses(), and printDistribution().

Here is the call graph for this function:

◆ printDistribution()

std::string pyfmt2::printDistribution ( const IDistribution1D par_distr,
const std::string &  units 
)

Prints distribution with constructor parameters in given units.

ba.DistributionGaussian(2.0*deg, 0.02*deg)

Definition at line 117 of file PyFmt2.cpp.

118 {
119  std::unique_ptr<IDistribution1D> distr(par_distr.clone());
120  distr->setUnits(units);
121 
122  std::ostringstream result;
123  result << "ba." << distr->getName() << "(" << argumentList(distr.get()) << ")";
124  return result.str();
125 }
virtual IDistribution1D * clone() const =0
std::string argumentList(const IParameterized *ip)
Returns comma-separated list of parameter values, including unit multiplicator (like "* nm").
Definition: PyFmt2.cpp:106

References argumentList(), and IDistribution1D::clone().

Referenced by SimulationToPython::defineParameterDistributions(), and SampleToPython::defineParticleDistributions().

Here is the call graph for this function:

◆ printParameterDistribution()

std::string pyfmt2::printParameterDistribution ( const ParameterDistribution par_distr,
const std::string &  distVarName,
const std::string &  units 
)

Definition at line 127 of file PyFmt2.cpp.

129 {
130  std::ostringstream result;
131 
132  result << "ba.ParameterDistribution("
133  << "\"" << par_distr.getMainParameterName() << "\""
134  << ", " << distVarName << ", " << par_distr.getNbrSamples() << ", "
135  << pyfmt::printDouble(par_distr.getSigmaFactor())
136  << pyfmt::printRealLimitsArg(par_distr.getLimits(), units) << ")";
137 
138  return result.str();
139 }
size_t getNbrSamples() const
get number of samples for this distribution
double getSigmaFactor() const
get the sigma factor
RealLimits getLimits() const
std::string getMainParameterName() const
get the main parameter's name
std::string printRealLimitsArg(const RealLimits &limits, const std::string &units)
Prints RealLimits in the form of argument (in the context of ParameterDistribution and similar).
Definition: PyFmtLimits.cpp:61

References ParameterDistribution::getLimits(), ParameterDistribution::getMainParameterName(), ParameterDistribution::getNbrSamples(), ParameterDistribution::getSigmaFactor(), pyfmt::printDouble(), and pyfmt::printRealLimitsArg().

Referenced by SampleToPython::defineParticleDistributions().

Here is the call graph for this function: