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

Utility functions for writing Python code snippets. More...

Functions

std::string argumentList (const IParametricComponent *ip)
 Returns comma-separated list of parameter values, including unit multiplicator (like "* nm"). More...
 
std::string printAxis (const IAxis *axis, const std::string &unit)
 Prints an axis. More...
 
std::string printDistribution (const IDistribution1D &par_distr, const std::string &units)
 Prints distribution with constructor parameters in given units. More...
 
std::string printParameterDistribution (const ParameterDistribution &par_distr, const std::string &distVarName, const std::string &units)
 
std::string printRangedDistribution (const IRangedDistribution &distr)
 
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". More...
 
std::string valueTimesUnit (const RealParameter *par)
 Returns parameter value, followed by its unit multiplicator (like "* nm"). More...
 

Detailed Description

Utility functions for writing Python code snippets.

Function Documentation

◆ argumentList()

std::string pyfmt2::argumentList ( const IParametricComponent 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:51
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:99

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

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

Here is the call graph for this function:

◆ printAxis()

std::string pyfmt2::printAxis ( const IAxis axis,
const std::string &  unit 
)

Prints an axis.

Definition at line 115 of file PyFmt2.cpp.

116 {
117  std::ostringstream result;
118  if (const auto* a = dynamic_cast<const FixedBinAxis*>(axis); a)
119  result << "ba.FixedBinAxis(" << pyfmt::printString(a->getName()) << ", " << a->size()
120  << ", " << pyfmt::printValue(a->lowerBound(), unit) << ", "
121  << pyfmt::printValue(a->upperBound(), unit) << ")";
122  else if (const auto* a = dynamic_cast<const PointwiseAxis*>(axis); a) {
123  result << "numpy.asarray([";
124  const std::vector<double>& points = a->binCenters();
125  for (auto iter = points.begin(); iter != points.end() - 1; ++iter) {
126  result << pyfmt::printValue(*iter, unit) << ",";
127  }
128  result << pyfmt::printValue(points.back(), unit) << "])\n";
129  } else
130  throw std::runtime_error("printAxis not implemented for current axis type");
131  return result.str();
132 }
Axis with fixed bin size.
Definition: FixedBinAxis.h:23
Axis containing arbitrary (non-equidistant) coordinate values.
Definition: PointwiseAxis.h:37
std::string printString(const std::string &value)
Definition: PyFmt.cpp:130
std::string printValue(double value, const std::string &units)
Definition: PyFmt.cpp:118

References pyfmt::printString(), and pyfmt::printValue().

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 137 of file PyFmt2.cpp.

138 {
139  std::unique_ptr<IDistribution1D> distr(par_distr.clone());
140  distr->setUnits(units);
141 
142  std::ostringstream result;
143  result << "ba." << distr->getName() << "(" << argumentList(distr.get()) << ")";
144  return result.str();
145 }
virtual IDistribution1D * clone() const =0
std::string argumentList(const IParametricComponent *ip)
Returns comma-separated list of parameter values, including unit multiplicator (like "* nm").
Definition: PyFmt2.cpp:106

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

Referenced by 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 147 of file PyFmt2.cpp.

149 {
150  std::ostringstream result;
151 
152  result << "ba.ParameterDistribution("
153  << "\"" << par_distr.getMainParameterName() << "\""
154  << ", " << distVarName << ", " << par_distr.getNbrSamples() << ", "
155  << pyfmt::printDouble(par_distr.getSigmaFactor())
156  << pyfmt::printRealLimitsArg(par_distr.getLimits(), units) << ")";
157 
158  return result.str();
159 }
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 printDouble(double input)
Definition: PyFmt.cpp:41
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:60

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:

◆ printRangedDistribution()

std::string pyfmt2::printRangedDistribution ( const IRangedDistribution distr)

Definition at line 161 of file PyFmt2.cpp.

162 {
163  std::ostringstream result;
164  result << pyfmt::indent() << "distribution = ba.";
165  result << distr.name();
166  result << "(" << distr.nSamples() << ", " << pyfmt::printDouble(distr.sigmaFactor());
167  if (!distr.limits().isLimitless())
168  result << pyfmt::printRealLimitsArg(distr.limits());
169  result << ")";
170  return result.str();
171 }
double sigmaFactor() const
Returns sigma factor to use during sampling.
virtual std::string name() const =0
Returns distribution name for python-formatted text.
RealLimits limits() const
Returns current limits of the distribution.
size_t nSamples() const
Returns number of samples to generate.
bool isLimitless() const
Definition: RealLimits.cpp:173
std::string indent(size_t width)
Returns a string of blanks with given width.
Definition: PyFmt.cpp:155

References pyfmt::indent(), RealLimits::isLimitless(), IRangedDistribution::limits(), IRangedDistribution::name(), IRangedDistribution::nSamples(), pyfmt::printDouble(), pyfmt::printRealLimitsArg(), and IRangedDistribution::sigmaFactor().

Here is the call graph for this function:

◆ 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 40 of file PyFmt2.cpp.

42 {
43  std::ostringstream result;
44  result << std::setprecision(12);
45 
46  if (const Polygon* shape = dynamic_cast<const Polygon*>(ishape)) {
47  std::vector<double> xpos, ypos;
48  shape->getPoints(xpos, ypos);
49  result << indent << "points = [";
50  for (size_t i = 0; i < xpos.size(); ++i) {
51  result << "[" << printValueFunc(xpos[i]) << ", " << printValueFunc(ypos[i]) << "]";
52  if (i != xpos.size() - 1)
53  result << ", ";
54  }
55  result << "]\n";
56  result << indent << "simulation.addMask("
57  << "ba.Polygon(points), " << pyfmt::printBool(mask_value) << ")\n";
58 
59  } else if (dynamic_cast<const InfinitePlane*>(ishape)) {
60  result << indent << "simulation.maskAll()\n";
61 
62  } else if (const Ellipse* shape = dynamic_cast<const Ellipse*>(ishape)) {
63  result << indent << "simulation.addMask(";
64  result << "ba.Ellipse(" << printValueFunc(shape->getCenterX()) << ", "
65  << printValueFunc(shape->getCenterY()) << ", " << printValueFunc(shape->getRadiusX())
66  << ", " << printValueFunc(shape->getRadiusY());
67  if (shape->getTheta() != 0.0)
68  result << ", " << pyfmt::printDegrees(shape->getTheta());
69  result << "), " << pyfmt::printBool(mask_value) << ")\n";
70  }
71 
72  else if (const Rectangle* shape = dynamic_cast<const Rectangle*>(ishape)) {
73  result << indent << "simulation.addMask(";
74  result << "ba.Rectangle(" << printValueFunc(shape->getXlow()) << ", "
75  << printValueFunc(shape->getYlow()) << ", " << printValueFunc(shape->getXup())
76  << ", " << printValueFunc(shape->getYup()) << "), " << pyfmt::printBool(mask_value)
77  << ")\n";
78  }
79 
80  else if (const VerticalLine* shape = dynamic_cast<const VerticalLine*>(ishape)) {
81  result << indent << "simulation.addMask(";
82  result << "ba.VerticalLine(" << printValueFunc(shape->getXpos()) << "), "
83  << pyfmt::printBool(mask_value) << ")\n";
84  }
85 
86  else if (const HorizontalLine* shape = dynamic_cast<const HorizontalLine*>(ishape)) {
87  result << indent << "simulation.addMask(";
88  result << "ba.HorizontalLine(" << printValueFunc(shape->getYpos()) << "), "
89  << pyfmt::printBool(mask_value) << ")\n";
90 
91  } else
92  throw std::runtime_error("representShape2D(const IShape2D*) -> Error. Unknown shape");
93 
94  return result.str();
95 }
An ellipse, for use in detector masks.
Definition: Ellipse.h:23
An infinite horizontal line.
Definition: Line.h:55
The infinite plane is used for masking the entire detector.
Definition: InfinitePlane.h:28
A polygon, for use in detector masks.
Definition: Polygon.h:30
A rectangle, for use in detector masks.
Definition: Rectangle.h:25
An infinite vertical line.
Definition: Line.h:38
std::string printDegrees(double input)
Definition: PyFmt.cpp:111
std::string printBool(double value)
Definition: PyFmt.cpp:36

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

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 99 of file PyFmt2.cpp.

100 {
101  return pyfmt::printValue(par->value(), par->unit());
102 }
double value() const
Returns value of wrapped parameter.
std::string unit() const

References pyfmt::printValue(), RealParameter::unit(), and RealParameter::value().

Referenced by argumentList().

Here is the call graph for this function: