55 x(
"x",
"x dimension",this, xx),
56 y(
"y",
"y dimension",this, yy)
70 x(
"x", this, other.
x),
73 if(
_verbosedebug) { cout <<
"Roo2DKeysPdf::Roo2DKeysPdf copy ctor" << endl; }
108 _x[iEvt] = other.
_x[iEvt];
109 _y[iEvt] = other.
_y[iEvt];
110 _hx[iEvt] = other.
_hx[iEvt];
111 _hy[iEvt] = other.
_hy[iEvt];
120 if(
_verbosedebug) { cout <<
"Roo2DKeysPdf::Roo2KeysPdf dtor" << endl; }
136 if(
_verbosedebug) { cout <<
"Roo2DKeysPdf::loadDataSet" << endl; }
140 if(
_verbosedebug) { cout <<
"Roo2DKeysPdf::loadDataSet(RooDataSet& data, TString options)" << endl; }
147 cout <<
"ERROR: Roo2DKeysPdf::loadDataSet The input data set is empty. Unable to begin generating the PDF" << endl;
175 cout <<
"Roo2DKeysPdf::Roo2DKeysPdf invalid RooAbsReal name: "<<xx.
GetName()<<
" not in the data set" <<endl;
180 cout <<
"Roo2DKeysPdf::Roo2DKeysPdf invalid RooAbsReal name: "<<yy.
GetName()<<
" not in the data set" << endl;
185 cout <<
"Roo2DKeysPdf::Roo2DKeysPdf Unable to initialize object; incompatible RooDataSet doesn't contain"<<endl;
186 cout <<
" all of the RooAbsReal arguments"<<endl;
203 y0+=1; y1+=
_y[j]; y_2+=
_y[j]*
_y[j];
211 cout <<
"Roo2DKeysPdf::Roo2DKeysPdf Empty data set was used; can't generate a PDF"<<endl;
231 if(
_verbosedebug) { cout <<
"Roo2DKeysPdf::setOptions" << endl; }
249 cout <<
"Roo2DKeysPdf::setOptions(TString options) options = "<< options << endl;
252 cout <<
"\t_debug = " <<
_debug << endl;
263 cout <<
"Roo2DKeysPdf::getOptions(void)" << endl;
266 cout <<
"\t_debug = " <<
_debug << endl;
278 if(
_verbosedebug) { cout <<
"Roo2DKeysPdf::calculateBandWidth(Int_t kernel)" << endl; }
289 if(sigProd != 0.0)
h =
_n16*sqrt( sigSum/sigProd );
292 cout <<
"Roo2DKeysPdf::calculateBandWidth The sqr(variance sum) == 0.0. " <<
" Your dataset represents a delta function."<<endl;
298 Double_t xhmin = hXSigma * sqrt(2.)/10;
299 Double_t yhmin = hYSigma * sqrt(2.)/10;
306 cout <<
"Roo2DKeysPdf::calculateBandWidth Using a normal bandwidth (same for a given dimension) based on"<<endl;
307 cout <<
" h_j = n^{-1/6}*sigma_j for the j^th dimension and n events * "<<
_widthScaleFactor<<endl;
314 if(
_hx[j]<xhmin)
_hx[j] = xhmin;
315 if(
_hy[j]<yhmin)
_hy[j] = yhmin;
320 cout <<
"Roo2DKeysPdf::calculateBandWidth Using an adaptive bandwidth (in general different for all events) [default]"<<endl;
327 _hx[j] = xnorm * f_ti;
328 _hy[j] = ynorm * f_ti;
329 if(
_hx[j]<xhmin)
_hx[j] = xhmin;
330 if(
_hy[j]<yhmin)
_hy[j] = yhmin;
347 if(
_vverbosedebug) { cout <<
"Roo2DKeysPdf::evaluate()" << endl; }
363 if(
_vverbosedebug ) { cout <<
"Roo2DKeysPdf::evaluateFull()" << endl; }
372 rx2 = 0.0; ry2 = 0.0; zx = 0.0; zy = 0.0;
373 if(
_hx[j] != 0.0) rx2 = (thisX -
_x[j])/
_hx[j];
374 if(
_hy[j] != 0.0) ry2 = (thisY -
_y[j])/
_hy[j];
376 if(
_hx[j] != 0.0) zx = exp(-0.5*rx2*rx2)/
_hx[j];
377 if(
_hy[j] != 0.0) zy = exp(-0.5*ry2*ry2)/
_hy[j];
391 rx2 = 0.0; ry2 = 0.0; zx = 0.0; zy = 0.0;
392 if(
_hx[j] != 0.0) rx2 = (thisX -
_x[j])/
_hx[j];
393 if(
_hy[j] != 0.0) ry2 = (thisY -
_y[j])/
_hy[j];
395 if(
_hx[j] != 0.0) zx = exp(-0.5*rx2*rx2)/
_hx[j];
396 if(
_hy[j] != 0.0) zy = exp(-0.5*ry2*ry2)/
_hy[j];
416 if(
_vverbosedebug) { cout <<
"Roo2DKeysPdf::highBoundaryCorrection" << endl; }
418 if(thisH == 0.0)
return 0.0;
419 Double_t correction = (thisVar + tVar - 2.0* high )/thisH;
420 return exp(-0.5*correction*correction)/thisH;
428 if(
_vverbosedebug) { cout <<
"Roo2DKeysPdf::lowBoundaryCorrection" << endl; }
430 if(thisH == 0.0)
return 0.0;
431 Double_t correction = (thisVar + tVar - 2.0* low )/thisH;
432 return exp(-0.5*correction*correction)/thisH;
448 if((
_nEvents == 0.0) || (sigma1 == 0.0) || (sigma2 == 0))
return 0.0;
459 z += exp(
c1 * r1*r1 ) * exp(
c2 * r2*r2 );
470 if(
_BandWidthType == 1) cout <<
"The Bandwidth Type selected is Trivial" << endl;
471 else cout <<
"The Bandwidth Type selected is Adaptive" << endl;
481 if(!strcmp(axis,
x.
GetName()) || !strcmp(axis,
"x") || !strcmp(axis,
"X"))
return _xMean;
482 else if(!strcmp(axis,
y.
GetName()) || !strcmp(axis,
"y") || !strcmp(axis,
"Y"))
return _yMean;
485 cout <<
"Roo2DKeysPdf::getMean unknown axis "<<axis<<endl;
495 if(!strcmp(axis,
x.
GetName()) || !strcmp(axis,
"x") || !strcmp(axis,
"X"))
return _xSigma;
496 else if(!strcmp(axis,
y.
GetName()) || !strcmp(axis,
"y") || !strcmp(axis,
"Y"))
return _ySigma;
499 cout <<
"Roo2DKeysPdf::getSigma unknown axis "<<axis<<endl;
528 cout <<
"Roo2DKeysPdf::writeHistToFile This member function is temporarily disabled" <<endl;
533 cout <<
"Roo2DKeysPdf::writeHistToFile unable to open file "<< outputFile <<endl;
568 cout <<
"Roo2DKeysPdf::writeNTupleToFile unable to open file "<< outputFile <<endl;
576 label +=
" the source data for 2D Keys PDF";
578 if(!_theTree) { cout <<
"Unable to get a TTree for output" << endl;
return; }
582 const char * xname = xArg.
GetName();
583 const char * yname = yArg.
GetName();
584 if (!strcmp(xname,
"")) xname =
"x";
585 if (!strcmp(yname,
"")) yname =
"y";
587 _theTree->
Branch(xname, &theX,
" x/D");
588 _theTree->
Branch(yname, &theY,
" y/D");
589 _theTree->
Branch(
"hx", &hx,
" hx/D");
590 _theTree->
Branch(
"hy", &hx,
" hy/D");
611 out <<
"Roo2DKeysPDF instance domain information:"<<endl;
612 out <<
"\tX_min = " <<
_lox <<endl;
613 out <<
"\tX_max = " <<
_hix <<endl;
614 out <<
"\tY_min = " <<
_loy <<endl;
615 out <<
"\tY_max = " <<
_hiy <<endl;
617 out <<
"Data information:" << endl;
618 out <<
"\t<x> = " <<
_xMean <<endl;
619 out <<
"\tsigma(x) = " <<
_xSigma <<endl;
620 out <<
"\t<y> = " <<
_yMean <<endl;
621 out <<
"\tsigma(y) = " <<
_ySigma <<endl;
623 out <<
"END of info for Roo2DKeys pdf instance"<< endl;
static const double x1[5]
Two-dimensional kernel estimation PDF.
void writeNTupleToFile(char *outputFile, const char *name) const
Saves the data and calculated bandwidths to a file, as a record of what produced the PDF and to give ...
Double_t getMean(const char *axis) const
Double_t g(Double_t var1, Double_t *_var1, Double_t sigma1, Double_t var2, Double_t *_var2, Double_t sigma2) const
Calculates f(t_i) for the bandwidths.
void writeToFile(char *outputFile, const char *name) const
Roo2DKeysPdf(const char *name, const char *title, RooAbsReal &xx, RooAbsReal &yy, RooDataSet &data, TString options="a", Double_t widthScaleFactor=1.0)
Constructor.
Double_t getSigma(const char *axis) const
Double_t _widthScaleFactor
Int_t getBandWidthType() const
void PrintInfo(std::ostream &) const
Prints out _p[_nPoints][_nPoints] indicating the domain limits.
Int_t loadDataSet(RooDataSet &data, TString options)
Loads a new data set into the class instance.
Double_t evaluate() const
Evaluates the kernel estimation for x,y, interpolating between the points if necessary.
virtual ~Roo2DKeysPdf()
Destructor.
Double_t highBoundaryCorrection(Double_t thisVar, Double_t thisH, Double_t high, Double_t tVar) const
Apply the mirror at boundary correction to a dimension given the space position to evaluate at (thisV...
Double_t lowBoundaryCorrection(Double_t thisVar, Double_t thisH, Double_t low, Double_t tVar) const
void writeHistToFile(char *outputFile, const char *histName) const
Plots the PDF as a histogram and saves it to a file, so that it can be loaded in as a Roo2DHist PDF i...
Int_t calculateBandWidth(Int_t kernel=-999)
Calculates the kernel bandwidth for x & y and the probability look up table _p[i][j].
void setOptions(TString options)
Double_t evaluateFull(Double_t thisX, Double_t thisY) const
Evaluates the sum of the product of the 2D kernels for use in calculating the fixed kernel estimate,...
void getOptions(void) const
void setWidthScaleFactor(Double_t widthScaleFactor)
RooAbsArg * find(const char *name) const
Find object with given name in list.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
TH1 * createHistogram(const char *name, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none()) const
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
TH1 * fillHistogram(TH1 *hist, const RooArgList &plotVars, Double_t scaleFactor=1, const RooArgSet *projectedVars=0, Bool_t scaling=kTRUE, const RooArgSet *condObs=0, Bool_t setError=kTRUE) const
Fill the ROOT histogram 'hist' with values sampled from this function at the bin centers.
Double_t getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
RooDataSet is a container class to hold unbinned data.
virtual const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
RooRealVar represents a variable that can be changed from the outside.
double min(const char *rname=0) const
Query lower limit of range. This requires the payload to be RooAbsRealLValue or derived.
double max(const char *rname=0) const
Query upper limit of range. This requires the payload to be RooAbsRealLValue or derived.
const T & arg() const
Return reference to object held in proxy.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
virtual void SetName(const char *name)
Change the name of this histogram.
2-D histogram with a float per channel (see TH1 documentation)}
virtual const char * GetName() const
Returns name of object.
void ToLower()
Change string to lower-case.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
A TTree represents a columnar dataset.
virtual Int_t Fill()
Fill all branches.
virtual void SetAutoSave(Long64_t autos=-300000000)
This function may be called at the start of a program to change the default value for fAutoSave (and ...
TBranch * Branch(const char *name, T *obj, Int_t bufsize=32000, Int_t splitlevel=99)
Add a new branch, and infer the data type from the type of obj being passed.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)