From Wednesday: o IXYData / Vector of Points - Explicit error propagation strategy --> see IPoint.java o Discussion of remaining user wishes/user requirements Thu morning o "small changes" -- part 1 - AIDA/AIDA.h : Yes, done. *** WORK *** - Annotation -- visibility ? Should go (move to plotter). *** end WORK *** - Cloud -> histo conversion. . is the converted histo externally visible (managed) ? No. is internal of Cloud . autoconversion (at reaching threshold) . user triggered convert(nBins, min, max) . fill histo from cloud contents: projection(I*HistogramxD) . should Clouds be merged with Histograms: - created by the same Factory :: createCloudxD() - same base-class : *** WORK *** class IBaseHistogram ?? { entries(); reset(); label(); annotation(); dimension(); }; ICloud : IBaseHistogram {}; // e.g. convertNow(), project(IBaseHistogram) IHistogram : IBaseHistogram {}; IProfile : IBaseHistogram {}; ISomeOtherKindOfHistogram : IBaseHistogram {}; "efficiency-histogram": weights are limited between [0,1] ICloudxD : ICloud {}; IHistogramxD : IHistogram {}; IProfilexD : IProfile {}; ISomeOtherKindOfHistogramxD : ISomeOtherKindOfHistogram {}; *** end WORK *** ITuple { project(IBaseHistogram, IEvaluator [] x, IFilter cut=0, IEvaluator w=1.) project(IHistogram1D, IEvaluator x) project(IHistogram1D, IEvaluator x, IFilter cut) project(IHistogram1D, IEvaluator x, IEvaluator w) project(IHistogram1D, IEvaluator x, IFilter cut, IEvaluator w) project(IHistogram2D, IEvaluator x, IEvaluator y, IFilter cut=0,IEvaluator w=1.) project(IHistogram3D, IEvaluator x, IEvaluator y, IEvaluator z, IFilter cut=0,IEvaluator w=1.) project(ICloud1D, IEvaluator x, IFilter cut=0, IEvaluator w=1.) project(ICloud2D, IEvaluator x, IEvaluator y, IFilter cut=0,IEvaluator w=1.) project(ICloud3D, IEvaluator x, IEvaluator y, IEvaluator z, IFilter cut=0,IEvaluator w=1.) project(IProfileHistogram1D, IEvaluator x, IEvaluator y, IFilter cut=0,IEvaluator w=1.) project(IProfileHistogram2D, IEvaluator x, IEvaluator y, IEvaluator z, IFilter cut=0,IEvaluator w=1.) }; "Project" is a method on the ITuple to allow for efficient access to the Tuple internals. A independent IProjector class might be a good idea. Evaluators and Filters can be created by the ITupleFactory, not passing the ITuple as argument -- the "binding" is done on the developer level. For tomorrow (part 2): - histo operations - histo scaling - histo Comparator (Kolmogorov) and Cumulator (returnes cumulative distribution) - ITree :: Iterator (for ls()) - IHistogram::isFixedBinning() - IProfileHistogram1D . booked like 1D, fill(x,y,w), binSpread(i) . booked like 2D, ymin/ymax limits filling range (outside entries are ignored), fill(x,y,w), binSpread(i) - IProfileHistogram2D . booked like 2D, fill(x,y,z,w), binSpread(i,j) . booked like 3D, zmin/zmax limits filling range (outside entries are ignored), fill(x,y,z,w), binSpread(i,j) - IEfficiencyHistogram1D, -2D, -3D o Coordination with Geant-4 (11:00) - Release schedule coordination Releases in March/September are ok as they give enough lead time for the G-4 developers. The AIDA releases need to be accompanied by documents describing the changes. Major changes for september will be the introduction of namespace AIDA and on Fitting. Additional functionality in terms of new classes will come. Existing G-4 code should not see large changes. - G-4 "commands" for analysis (using AIDA) An (extented/analysis) example should be provided to show how to create a set of interactive commands dealing with analysis using AIDA. Examples for this are: /analysis/tree/ls /analysis/plot This commands shall be implemented using the Interfaces of AIDA. - Relationship (i.e., external dependency or part of G-4) Examples showing the use of AIDA in Geant-4 can be put in the extended and advanced examples without the "#ifdef G4USE_ANALYSIS" protection, i.e., creating an explicit dependency on AIDA. Use cases will be provided to the project in Geant-4 on (statistical) analysis and testing. Thu afternoon o Fitting/Functions - detailed design - agree : Should the Optimizer be exposed to the user : Yes, after the Fitter. Developer level interfaces may be earlier. User who only wants to do fitting doesn't have to know about the Optimizer IFitter (created by some Factory) IFitResults IFunction need to be created by users (may be used for plotting only, or fitting) IFunction - has parameters which can be changed by user - is evaluated at a space point IModelFunction (== Model to be compared to the data; used in Fitter) - may provide gradient wrt. parameters at a point in parameter space - is evaluated at a point in parameter space (and fixed set of space points (from data)) - may provide normalisation (in ranges) to 1 - may be scaled by a constant factor IOptimizableFunction (may be == ModelFunction + data + FitModel) - may provide gradient wrt. space at a space point == derivativeOfFunction(spacePoint) // kept for naming of methods setParameter ( string name, double value ); // what's a Parameter ? setParameters( double [] par ); double [] parameters(); string [] parameterNames(); double value ( double[] spacePoint ); bool providesNormalization(); // if false: a call to normalize is meaningless void setNormalizationRange(iAxis, range[]); void normalize(); // fixes the "scaling factor" to 1 bool isNormalized(); // to know if there is one parameter less void scale(factor); void providesGradient(); double [] gradient( double [] spacePoint ); // returns grad(f) IModelFunction : IFunction IOptimizableFunction : IFunction - can be fed to IOptimizer for Fitting: IOptimizableFunction is "composed" of data, IModelFunction and FittingModel (Chi2, MaxLikelihood, ...). The FittingModel is "hidden" from the user inside the Fitter. The user has to ensure that the ranges used for data and (normalising) the function are the same. The Fitter should be able to fit: - DataPipe ("Variable") with ranges in coordinate space; used inside the Fitter when constructing the IOptimizedFunction from IModelFunction and "data". The produced IOptimizableFunction contains (and hides) the Variables. The DataPipe needs to be connected to a given Variable in the ModelFunction (the data from the DataPipe corresponds then to the Parameter of the OptimizableFunction) _and_ to the data source itself. f(x; a) = (x-a)**2 --> minimize --> x==a; --> fitter with data -> of(a; data) and for user convenience: - Histograms - Clouds - Tuple - Vector of Points -------------------------------------------------------------------------------- - don't agree : IFitParameter IParameter -------------------------------------------------------------------------------- - not yet discussed: constraints -------------------------------------------------------------------------------- - use cases: 0) fit a gaussian to a histogram 1) maxLikelihood fit to three filtered column (evaluator) of a tuple 2) fit sum of 2 gaussians with mean1==2*mean2 to 1 histogram 3) make chi-square fit on a histogram followed by a maxLikelihood fit with the same function on the cloud where the histogram came from (i.e., the first fit sets the "starting values" for the second fit) 3a) plot the cloud plus the intermediate fit plus the final fit on the same plot 4) write a user defined function and use it in 3) 5) fit multiple ranges of a histogram (e.g., tails) 6) fit 2 functions on 2 data sets (two parts of a histogram) with the constraint of meeting at the "bending" point - constraints for implementors If the function is to be used for unbinned ML fit (i.e., it needs to be normalized), the last of the parameters has to be the "scaling factor". 16:30 : Persistency workshop wrap-up session (cancelled)