Below we describe proposed changes to the AIDA interfaces together with some discussion. Changes are based on our experience with current version of AIDA and attempts to extend it.
would be useful to have an "enable/disable" and "invert"
switches for IFilters:
public interface IFilter
// New methods
public void setEnabled(boolean state);
public boolean isEnabled();
public void setInverted(boolean state);
public Boolean isInverted();
should also be a convenient way to apply analysis cuts not only to ITuple, but
to a IHistogram and ICloud as well - imagine fitting function to a histogram
and excluding tails from the fit. Also more flexible cut manipulation is
desired: dynamically add more cuts and remove some of previous cuts. One way to
do it is to create cuts that don't depend on an ITuple and include
"add/remove" methods in the ITuple interface:
public interface ITuple
// New ITuple methods here:
// can add as many filters as you like, they will be applied
// sequentially in the order they were added
public void addFilter(IFilter filter);
public void removeFilter(String name);
public void removeAllFilters();
// Returns array of filters that are currently added to the ITuple
public IFilter filters();
public interface IFilterFactory
public IFilter create(String name, String script);
way has one disadvantage though - one has to assume what filters are attached
to ITuple - filters are not passed to the "client" explicitly. So it
may happen that some filters added (or created) earlier are forgotten and
can have an unexpected effect.
How should IEvaluator handle external parameters?
double normalization = tuple.columnMax(2);
IEvaluator ev = evaluatorFactory.create(tuple, "signal/normalization");
User should be able to manipulate IFunctions: add, multiply them, maybe even convolute two functions. Registering user-defined function with AIDA IFunctionFactory on the fly also seems like a nice feature. Also ability to generate a set of numbers according to a given distribution can be useful in fit cross-checks and toy Monte Carlo studies.
public interface IFunctionFactory
// Allows user to register new function factory
// IUserFunctionFactory should have method "String types()" that
// return all IFunction types that this user factory can make
public void register(IUserFunctionFactory userFunctionFactory);
// Do arithmetics with functions, Example: "add" f_new=c1*p+c2*(1-p)
// Note that "div" does not make much sence for PDFs
public IFunction add(IFunction f1, IFunction f2, double p);
public IFunction add(IFunction f, double p);
public IFunction mul(IFunction f1, IFunction f2, double c);
public IFunction mul(IFunction f, double c);
public IFunction div(IFunction
f1, IFunction f2);
Another useful feature would be ability to generate set of random numbers distributed according to a given function:
// Create ITuple with one column and nEv rows, filled with random numbers
// distributed according to the given IFunction
public ITuple generate(String name, String label, IFunction f, int nEv);
This method can be put in the ITupleFactory as a convenience method, or it can be implemented in some additional package (say hep.aida.util), as this functionality can be achieved by using already defined AIDA interfaces.
There will be more about IFunctions in the Fitting Proposal section.
plot attributes, like histogram statistics, function parameters, fit results is
a complicated task. One way to simplify it would be to associate some
"hash-type" object (like IAnnotation, maybe) with any plottable class
(IFunction, IHistogram1D, ...) and mark items there as "displayable"
or "non-displayable". Displayable items then will be picked up and
displayed by IPlotter.