RooFitDalitz design
RooFit
RooFit comes with many bells and whistles, such as plotting, automatic PDF normalization, support for
analytic integrals. But at its core its a MINUIT based unbinned maximum likelihood fitter
based on ROOT's TFitter.
In RooFit the fitting function is specified by building a dependency tree at the top of which
is a PDF object derived from RooAbsPdf. RooFit can compute the normalization by numeric
or where appropriate analytic integration and builds a negative log likelihood object RooNLLVar.
The interface into ROOT is through the RooMinuitGlue which is set in class RooMinuit.
All tree nodes derive from RooAbsArg class, which
encapsulates the Observer-Observable pattern (Client-Server in RooFit terminology).
Each node has an associated value. When the value of an observable changes,
the change propagates to the top of the tree and the values of all affected nodes are
recalculated.
Essentially the fitter tries different values for the leaf nodes that represent the parameters
that are being fit. The change propagates forcing the recalculation of the affected nodes
higher up the tree. For unaffected nodes, precalculated (cached) values can be used. The
negative log likelihood thus calculated is passed back to the fitter.
RooFit only allows real-valued parameters. There are also 'categories' e.g. signal/background.
Categories can be also used as integer variables, but they are somewhat inconvenient because
each possible value has to be explicitely defined.
RooFitDalitz
In Dalitz plot fitting one has to work with complex valued amplitudes, but there is no support
for complex valued objects in RooFit (the reason of course is that TFitter only handles real-valued
parameters).
RooFitDalitz (RFD) extends RooFit to handle objects that are not
real-valued. A templated class RfdAbsVar<T> is introduced. It derives from RooAbsArg
and so can be used in the dependency tree, but the value that it holds is an arbitrary type T.
Complex-valued nodes derive from RfdAbsVar<RooComplex>, or a node holding a Dalitz point
object would derive from RfdAbsVar<EvtDalitzPoint>. This gives more flexibility in
constructing dependency trees.
RFD also introduces RfdAbsPtr<T> objects that can be inserted in the tree. They essentially
hold pointers to outside objects of type T. This can help bridge code from other packages into
the tree. RfdAbsPtr<EvtAmplitude<T>> derived objects allow using
Dalitz plot amplitude descriptions from the EvtGen package. The most simple leaf objects
are RfdDummyPtr<T> which hold a pointer to an immutable object of type T.
A PDF model can be build using RFD extensions and regular RooFit classes. It is then handed of
to RooFit. It performs PDF normalization using vegas algorithm for adaptive MC integration,
constructs the NLL variable and builds the glue fit function which is in turned passed
to ROOT's TFitter for a MINUIT fit. This is what goes on "under the hood."
|