YODA is hosted by Hepforge, IPPP Durham
YODA - Yet more Objects for Data Analysis  1.3.1
Todo List
Group Accessors
Sorted iterators of pair<std::string, double>
Group Adding and subtracting histograms

TODO

TODO

TODO

TODO

TODO

Group Combined x value and error setters
Support multiple errors
Group Combined x/y value and error setters
Support multiple errors
Group Combining scatters: global operators, assuming aligned points
This "1D histo-like behaviour" breaks the x/y/z symmetry... is there another way?
Group Combining scatters: global operators, assuming aligned points
This "1D histo-like behaviour" breaks the x/y/z symmetry... is there another way?
Group Combining scatters: global operators, assuming aligned points
This "1D histo-like behaviour" breaks the x/y/z symmetry... is there another way?
Group Combining scatters: global operators, assuming aligned points
This "1D histo-like behaviour" breaks the x/y/z symmetry... is there another way?
Group Combining scatters: global operators, assuming aligned points
This "1D histo-like behaviour" breaks the x/y/z symmetry... is there another way?
Group Coordinate accessors
addError, addErrors, setErrors
Group Modifiers
Need to set annotations (do that on AO), all-histo Dbns, and dbns for every bin. Delegate!
Group x error accessors
Uniform "coords" accessor across all Scatters: returning fixed-size tuple?
Namespace YODA
Add SFINAE math type stuff (see Rivet) and add inrange() and inrange_closed_closed() etc. aliases cf. MCUtils
Member YODA::add (const Scatter2D &first, const Scatter2D &second)

Lots of boilerplate shared between these three functions, but I can't think of a C++ way to do it better, since functors for value and error combination are so heavy.

Does this even make sense?

Deal with +/- errors separately?

Does this even make sense?

Deal with +/- errors separately?

Does this even make sense?

Deal with +/- errors separately?

Does this even make sense?

Deal with +/- errors separately?

Does this even make sense?

Deal with +/- errors separately?

Does this even make sense?

Deal with +/- errors separately?

Member YODA::add (const Scatter3D &first, const Scatter3D &second)
Implement
Member YODA::AnalysisObject::setAnnotation (const std::string &name, const T &value)
Specialise for float, double, etc. with this safer recipe from the Boost docs:
Member YODA::Axis1D< BIN1D, DBN >::Axis1D (size_t nbins, double lower, double upper)
Rewrite interface to use a pair for the low/high
Member YODA::Axis2D< BIN2D, DBN >::eraseBins (const std::pair< double, double > &xrange, const std::pair< double, double > &yrange)

How to test this?

Beware the specialisation problems with vector<bool>...

Beware the specialisation problems with vector<bool>...

Member YODA::Axis2D< BIN2D, DBN >::operator== (const Axis2D &other) const
Change as discussed below if we expose the Axis classes for direct use
Member YODA::Axis2D< BIN2D, DBN >::rebinX (unsigned int nx)
WRITE THIS!
Member YODA::Axis2D< BIN2D, DBN >::rebinY (unsigned int ny)
WRITE THIS!
Class YODA::Bin1D< DBN >
It would also be nice to have an untemplated generic Bin1D interface
Member YODA::Binned1D< T >::Binned1D (const std::vector< double > &binedges, const std::vector< T > &binvalues=std::vector< T >())
Member YODA::Binned1D< T >::Binned1D (const std::vector< std::pair< double, double > > &binedges, const std::vector< T > &binvalues=std::vector< T >())
Member YODA::Binned1D< T >::sameBinning (const Binned1D &other) const
Be careful about using fuzzyEquals... should these be exact comparisons?
Member YODA::chi2 (const Profile1D &h1, const Profile1D &h2)

Optional arg for additional (fractional/abs?) "syst" error?

Check that binnings are compatible

Check that binnings are compatible

Member YODA::chi2 (const Point2D &p1, const Point2D &p2)

This assumes that y is the value... probably true, but ugly. Comparison axis spec arg?

Optional arg for additional (fractional/abs?) "syst" error?

Check that "binnings" are compatible

Check that "binnings" are compatible

Member YODA::chi2 (const Scatter2D &s1, const Scatter2D &s2)

Optional arg for additional (fractional/abs?) "syst" error?

Check that binnings are compatible

Check that binnings are compatible

Member YODA::chi2 (const ProfileBin1D &b1, const ProfileBin1D &b2)

Optional arg for additional (fractional/abs?) "syst" error?

Check that binnings are compatible

Check that binnings are compatible

Member YODA::chi2 (const HistoBin1D &b1, const HistoBin1D &b2)

Optional arg for additional (fractional/abs?) "syst" error?

Check that binnings are compatible

Check that binnings are compatible

Member YODA::chi2 (const Histo1D &h1, const Histo1D &h2)

Optional arg for additional (fractional/abs?) "syst" error?

Check that binnings are compatible

Check that binnings are compatible

Member YODA::Counter::Counter (const Counter &c, const std::string &path="")
Don't copy the path?
Member YODA::Counter::err () const
Implement on Dbn0D and feed through to this and Dbn1D, 2D, etc.
Member YODA::Counter::relErr () const

Implement on Dbn0D and feed through to this and Dbn1D, 2D, etc.

Throw excp if sumW2 is 0?

Throw excp if sumW2 is 0?

Member YODA::Dbn0D::fill (double weight=1.0)
Be careful about negative weights.
Member YODA::Dbn1D::xStdErr () const
Unbiased should check that Neff > 1 and divide by N-1?
Member YODA::Dbn1D::xVariance () const

Isn't this sensitive to the overall scale of the weights? Shouldn't it check if den is bigger then num by a set number of orders of magnitude and vice versa?

Is this the correct approach? There is no information online other than "weights are non-negative"...

Is this the correct approach? There is no information online other than "weights are non-negative"...

Member YODA::Dbn2D::transformX ()
Rename
Member YODA::Dbn2D::transformY ()
Rename
Member YODA::Dbn3D::transformX ()
Rename
Member YODA::Dbn3D::transformY ()
Rename
Member YODA::Dbn3D::transformZ ()
Rename
Member YODA::divide (const Counter &numer, const Counter &denom)
Or just return a Point1D?
Member YODA::divide (const Histo1D &numer, const Histo1D &denom)

Add multiply histograms -> Scatter2D

Is this really an appropriate definition? Should Scatter/Scatter even exist?!?

Is this really an appropriate definition? Should Scatter/Scatter even exist?!?

Is this really an appropriate definition? Should Scatter/Scatter even exist?!?

Is this really an appropriate definition? Should Scatter/Scatter even exist?!?

Is this really an appropriate definition? Should Scatter/Scatter even exist?!?

Is this really an appropriate definition? Should Scatter/Scatter even exist?!?

Member YODA::divide (const Histo2D &numer, const Histo2D &denom)

Add multiply histograms -> Scatter3D

Implement without conversion to scatters; scatter division is a flawed idea

Implement without conversion to scatters; scatter division is a flawed idea

Implement without conversion to scatters; scatter division is a flawed idea

Implement without conversion to scatters; scatter division is a flawed idea

Implement without conversion to scatters; scatter division is a flawed idea

Implement without conversion to scatters; scatter division is a flawed idea

Member YODA::divide (const Scatter2D &numer, const Scatter2D &denom)

Need to rework this: should be able to divide matching pairs of points along either axis

In general any pairing of points should be able to have any binary operation applied to it...

Provide optional alt behaviours to fill with NaN or remove the invalid point or throw

Don't throw here: set a flag and throw after all bins have been handled.

Is this the exact error treatment for all (uncorrelated) cases? Behaviour around 0? +1 and -1 fills?

check correctness with different signed numerator and denominator.

Provide optional alt behaviours to fill with NaN or remove the invalid point or throw

Don't throw here: set a flag and throw after all bins have been handled.

Is this the exact error treatment for all (uncorrelated) cases? Behaviour around 0? +1 and -1 fills?

check correctness with different signed numerator and denominator.

Provide optional alt behaviours to fill with NaN or remove the invalid point or throw

Don't throw here: set a flag and throw after all bins have been handled.

Is this the exact error treatment for all (uncorrelated) cases? Behaviour around 0? +1 and -1 fills?

check correctness with different signed numerator and denominator.

Provide optional alt behaviours to fill with NaN or remove the invalid point or throw

Don't throw here: set a flag and throw after all bins have been handled.

Is this the exact error treatment for all (uncorrelated) cases? Behaviour around 0? +1 and -1 fills?

check correctness with different signed numerator and denominator.

Provide optional alt behaviours to fill with NaN or remove the invalid point or throw

Don't throw here: set a flag and throw after all bins have been handled.

Is this the exact error treatment for all (uncorrelated) cases? Behaviour around 0? +1 and -1 fills?

check correctness with different signed numerator and denominator.

Provide optional alt behaviours to fill with NaN or remove the invalid point or throw

Don't throw here: set a flag and throw after all bins have been handled.

Is this the exact error treatment for all (uncorrelated) cases? Behaviour around 0? +1 and -1 fills?

check correctness with different signed numerator and denominator.

Member YODA::divide (const Scatter3D &numer, const Scatter3D &denom)

find a nicer solution than setting the bin to zero

Generally deal with +/- errors separately

Generally deal with +/- errors separately

Generally deal with +/- errors separately

Generally deal with +/- errors separately

Generally deal with +/- errors separately

Generally deal with +/- errors separately

Member YODA::efficiency (const Counter &accepted, const Counter &total)

Add mkScatter

Add divide functions/operators on pointers

Or just return a Point1D?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Add divide functions/operators on pointers

Or just return a Point1D?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Add divide functions/operators on pointers

Or just return a Point1D?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Add divide functions/operators on pointers

Or just return a Point1D?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Add divide functions/operators on pointers

Or just return a Point1D?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Add divide functions/operators on pointers

Or just return a Point1D?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Member YODA::efficiency (const Histo1D &accepted, const Histo1D &total)

Add functions/operators on pointers

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Member YODA::efficiency (const Histo2D &accepted, const Histo2D &total)

Provide optional alt behaviours to fill with NaN or remove the invalid point, or...

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Or throw a LowStatsError exception if h.effNumEntries() (or sumW()?) == 0?

Member YODA::flip (Scatter2D &s)

Add external scale, scaleX, scaleY functions

Be careful about transforms which could switch around min and max errors, or send both in the same direction!

Be careful about transforms which could switch around min and max errors, or send both in the same direction!

Be careful about transforms which could switch around min and max errors, or send both in the same direction!

Be careful about transforms which could switch around min and max errors, or send both in the same direction!

Member YODA::Histo1D::effNumEntries () const
Add an includeoverflows argument
Member YODA::Histo1D::fill (double x, double weight=1.0)
Replace try block with a check that there is a bin at x
Member YODA::Histo1D::Histo1D (const Histo1D &h, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Histo1D::Histo1D (const Scatter2D &s, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Histo1D::Histo1D (const Profile1D &p, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Histo1D::integral (size_t binindex1, size_t binindex2) const
Allow int bin index args for type compatibility with binIndexAt()?
Member YODA::Histo1D::normalize (double normto=1.0, bool includeoverflows=true)
Check that this is the desired behaviour
Member YODA::Histo1D::numEntries () const
Add an includeoverflows argument
Member YODA::Histo1D::operator+= (const Histo1D &toAdd)
What about if one histo sets ScaledBy, and the other doesn't?!? Aaaargh
Member YODA::Histo1D::sumW (bool includeoverflows=true) const
Improve/centralise this statistical aggregation by exposing the Dbn1D/2D objects in the bins and using their native += operators to do the aggregation.
Member YODA::Histo2D::eraseBin (size_t index)

TODO

TODO

TODO

TODO

TODO

TODO

TODO

Member YODA::Histo2D::fill (double x, double y, double weight=1.0)

Replace try block with a check that there is a bin at x, y

Reinstate! With outflow axis bin lookup

Reinstate! With outflow axis bin lookup

Member YODA::Histo2D::Histo2D (const Scatter3D &s, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Histo2D::Histo2D (const Profile2D &h, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Histo2D::Histo2D (const Histo2D &h, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Histo2D::normalize (double normto=1.0, bool includeoverflows=true)
Check that this is the desired behaviour
Member YODA::Histo2D::xVariance (bool includeoverflows=true) const
Improve this, by adding the Dbn2Ds and returning the resulting xVariance
Member YODA::Histo2D::yVariance (bool includeoverflows=true) const
Improve this, by adding the Dbn2Ds and returning the resulting yVariance
Member YODA::HistoBin1D::relErr () const
Throw excp if sumW2 is 0?
Member YODA::inRange (NUM value, NUM low, NUM high, RangeBoundary lowbound=CLOSED, RangeBoundary highbound=OPEN)
Optimise to one-line at compile time?
Member YODA::inRange (int value, int low, int high, RangeBoundary lowbound=CLOSED, RangeBoundary highbound=CLOSED)
Optimise to one-line at compile time?
Member YODA::operator!= (const YODA::Point1D &a, const YODA::Point1D &b)
AAARGH! Need to also test y. Maybe need named cmp operators for separate x/y and with/without metadata
Member YODA::operator/ (double a, const Weights &w)
Is this really needed?
Member YODA::operator/ (const Counter &numer, const Counter &denom)
Or just return a Point1D?
Member YODA::operator== (const YODA::Point1D &a, const YODA::Point1D &b)
AAARGH! Need to also test y. Maybe need named cmp operators for separate x/y and with/without metadata
Member YODA::Point1D::xMax () const
Remove (or extend) when multiple errors are supported
Member YODA::Point1D::xMin () const
Remove (or extend) when multiple errors are supported
Member YODA::Point2D::xMax () const
Remove (or extend) when multiple errors are supported
Member YODA::Point2D::xMin () const
Remove (or extend) when multiple errors are supported
Member YODA::Point2D::xy () const
Uniform "coords" accessor across all Scatters: returning fixed-size tuple?
Member YODA::Point2D::yMax () const
Remove (or extend) when multiple errors are supported
Member YODA::Point2D::yMin () const
Remove (or extend) when multiple errors are supported
Member YODA::Point3D::setXYZ (double x, double y, double z)
Uniform "coords" accessor across all Scatters: returning fixed-size tuple?
Member YODA::Profile1D::fill (double x, double y, double weight=1.0)
Replace try block with a check that there is a bin at x
Member YODA::Profile1D::numEntries () const
Add integrals? Or are they too ambiguous to make a core function?
Member YODA::Profile1D::Profile1D (const Profile1D &p, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Profile1D::Profile1D (const Scatter2D &s, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Profile1D::Profile1D (const Histo1D &h, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Profile2D::addBin (Axis::EdgePair1D xrange, Axis::EdgePair1D yrange)

TODO

TODO

TODO

Member YODA::Profile2D::eraseBin (size_t index)
TODO
Member YODA::Profile2D::fill (double x, double y, double z, double weight=1.0)

Replace try block with a check that there is a bin at x, y

Reinstate! With outflow axis bin lookup

Reinstate! With outflow axis bin lookup

Member YODA::Profile2D::Profile2D (const Histo2D &h, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Profile2D::Profile2D (const Profile2D &p, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Profile2D::Profile2D (const Scatter3D &s, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Profile2D::scaleW (double scalefactor)
Is this ScaledBy annotation needed?
Member YODA::Profile2D::scaleZ (double scalefactor)
Need to rescale overflows too, when they exist.
Member YODA::Profile2D::xVariance (bool includeoverflows=true) const
Improve this, by adding the Dbn2Ds and returning the resulting xVariance
Member YODA::Profile2D::yVariance (bool includeoverflows=true) const
Improve this, by adding the Dbn2Ds and returning the resulting yVariance
Member YODA::ProfileBin2D::sumWZ () const
: Check if it is correct
Member YODA::read (const std::string &filename, std::vector< AnalysisObject * > &aos)
Use SFINAE magic to allow ~arbitrary collection<AnalysisObject*> (with push_back()?) to be passed
Member YODA::Reader::read (const std::string &filename, std::vector< AnalysisObject * > &aos)
Use SFINAE magic to allow ~arbitrary collection<AnalysisObject*> (with push_back()?) to be passed
Member YODA::Reader::read (std::istream &stream, std::vector< AnalysisObject * > &aos)=0
Use SFINAE magic to allow ~arbitrary collection<AnalysisObject*> (with push_back()?) to be passed
Member YODA::Scatter1D::combineWith (const std::vector< Scatter1D > &others)

Better name? Make this the add operation?

Convert/extend to accept a Range or generic

Member YODA::Scatter1D::combineWith (const Scatter1D &other)
Better name? Make this the add operation?
Member YODA::Scatter1D::Scatter1D (const Scatter1D &s1, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Scatter2D::combineWith (const std::vector< Scatter2D > &others)

Better name? Make this the add operation?

Convert/extend to accept a Range or generic

Member YODA::Scatter2D::combineWith (const Scatter2D &other)
Better name? Make this the add operation?
Member YODA::Scatter2D::Scatter2D (const Scatter2D &s2, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Scatter3D::combineWith (const Scatter3D &other)
Better name?
Member YODA::Scatter3D::combineWith (const std::vector< Scatter3D > &others)

Better name?

Convert to accept a Range or generic

Member YODA::Scatter3D::Scatter3D (const Scatter3D &s3, const std::string &path="")
Also allow title setting from the constructor?
Member YODA::Scatter< N >::addPoints (Points pts)
More addPoint combinations with arrays for errors
Member YODA::Scatter< N >::combineWith (const Scatter< N > &other)
Better name?
Member YODA::Scatter< N >::combineWith (const std::vector< Scatter< N > > &others)
Better name?
Member YODA::subtract (const Scatter2D &first, const Scatter2D &second)

Does this even make sense?

Deal with +/- errors separately?

Deal with +/- errors separately?

Deal with +/- errors separately?

Deal with +/- errors separately?

Deal with +/- errors separately?

Deal with +/- errors separately?

Member YODA::subtract (const Scatter3D &first, const Scatter3D &second)
Implement
Member YODA::toIntegralEfficiencyHisto (const Histo1D &h, bool includeunderflow=true, bool includeoverflow=true)

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Or throw a LowStatsError exception if h.effNumEntries() == 0?

Provide optional alt behaviours

Need to check that bins are all positive? Integral could be zero due to large +ve/-ve in different bins :O

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Or throw a LowStatsError exception if h.effNumEntries() == 0?

Provide optional alt behaviours

Need to check that bins are all positive? Integral could be zero due to large +ve/-ve in different bins :O

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Or throw a LowStatsError exception if h.effNumEntries() == 0?

Provide optional alt behaviours

Need to check that bins are all positive? Integral could be zero due to large +ve/-ve in different bins :O

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Or throw a LowStatsError exception if h.effNumEntries() == 0?

Provide optional alt behaviours

Need to check that bins are all positive? Integral could be zero due to large +ve/-ve in different bins :O

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Or throw a LowStatsError exception if h.effNumEntries() == 0?

Provide optional alt behaviours

Need to check that bins are all positive? Integral could be zero due to large +ve/-ve in different bins :O

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Or throw a LowStatsError exception if h.effNumEntries() == 0?

Provide optional alt behaviours

Need to check that bins are all positive? Integral could be zero due to large +ve/-ve in different bins :O

Should the total integral error be sqrt(sumW2)? Or more complex, cf. Simon etc.?

Member YODA::toIntegralHisto (const Histo1D &h, bool includeunderflow=true)
Check that the histogram binning has no gaps, otherwise throw a BinningError
Member YODA::toScatter2D (const TH1 &th1)

Check that direct Scatter filling gives the same result at mkScatter(h) for ROOT -> YODA

toProfile1D: TProfile -> Profile1D

toScatter2D: TGraph(AsymmErrs) -> Scatter2D

Add a bool flag for whether or not to divide y vals/errs by bin width.

toProfile1D: TProfile -> Profile1D

toScatter2D: TGraph(AsymmErrs) -> Scatter2D

Add a bool flag for whether or not to divide y vals/errs by bin width.

toProfile1D: TProfile -> Profile1D

toScatter2D: TGraph(AsymmErrs) -> Scatter2D

Add a bool flag for whether or not to divide y vals/errs by bin width.

toProfile1D: TProfile -> Profile1D

toScatter2D: TGraph(AsymmErrs) -> Scatter2D

Add a bool flag for whether or not to divide y vals/errs by bin width.

Member YODA::toTGraph (const Scatter2D &s)

Convert a YODA Profile2D to a ROOT TProfile2D

Check/improve/extend.

Check/improve/extend.

Check/improve/extend.

Check/improve/extend.

Member YODA::toTH1D (const Histo1D &h)
Check/improve/extend – needs SetBinError or not?
Member YODA::toTH2D (const Histo2D &h)

Check/improve/extend – needs SetBinError or not?

Connect up when supported in YODA... if 2D overflows are possible in ROOT?!

Connect up when supported in YODA... if 2D overflows are possible in ROOT?!

Connect up when supported in YODA... if 2D overflows are possible in ROOT?!

Connect up when supported in YODA... if 2D overflows are possible in ROOT?!

Member YODA::toTProfile (const Profile1D &p)

Check/improve/extend. How to set all the y-weights in ROOT profiles?

Need to set the following, according to Roman Lysak:

Need to set the following, according to Roman Lysak:

Need to set the following, according to Roman Lysak:

Need to set the following, according to Roman Lysak:

Member YODA::transformX (Scatter2D &s, FNX fx)
Be careful about transforms which could switch around min and max errors, or send both in the same direction!
Member YODA::transformX (Scatter1D &s, FNX fx)
Be careful about transforms which could switch around min and max errors, or send both in the same direction!
Member YODA::transformX (Scatter3D &s, FNX fx)
Be careful about transforms which could switch around min and max errors, or send both in the same direction!
Member YODA::transformY (Scatter2D &s, FNY fy)
Be careful about transforms which could switch around min and max errors, or send both in the same direction!
Member YODA::transformY (Scatter3D &s, FNY fy)
Be careful about transforms which could switch around min and max errors, or send both in the same direction!
Member YODA::transformZ (Scatter3D &s, FNZ fz)
Be careful about transforms which could switch around min and max errors, or send both in the same direction!
Class YODA::Weights

Accept general Boost.Ranges as constructor args... but start with literal arrays for convenience

Autogenerate numerical names if not given

Member YODA::Weights::operator- () const
Can/should this modify itself and return a reference?
Member YODA::WriterFLAT::writeScatter2D (std::ostream &stream, const Scatter2D &s)

Write as HISTO1D in future

Write as HISTO1D in future

Member YODA::WriterFLAT::writeScatter3D (std::ostream &stream, const Scatter3D &s)

Alternative format to allow writing as unbinned scatters? Need same for Scatter2D if so... I think better to use YODA format for that

Write as HISTO2D in future

Write as HISTO2D in future

Member YODA::WriterYODA::writeHisto2D (std::ostream &stream, const Histo2D &h)
Disabled for now, reinstate with a full set of outflow info to allow marginalisation
Member YODA::WriterYODA::writeProfile2D (std::ostream &stream, const Profile2D &p)
Disabled for now, reinstate with a full set of outflow info to allow marginalisation
Member YODA::WriterYODA::writeScatter2D (std::ostream &stream, const Scatter2D &s)

Change ordering to {vals} {errs} {errs} ...

Change ordering to {vals} {errs} {errs} ...

Member YODA::WriterYODA::writeScatter3D (std::ostream &stream, const Scatter3D &s)

Change ordering to {vals} {errs} {errs} ...

Change ordering to {vals} {errs} {errs} ...