30 ClassImp(RooChiSquarePdf);
34 RooChiSquarePdf::RooChiSquarePdf()
40 RooChiSquarePdf::RooChiSquarePdf(
const char* name,
const char* title,
41 RooAbsReal& x, RooAbsReal& ndof):
42 RooAbsPdf(name, title),
43 _x(
"x",
"Dependent", this, x),
44 _ndof(
"ndof",
"ndof", this, ndof)
50 RooChiSquarePdf::RooChiSquarePdf(
const RooChiSquarePdf& other,
const char* name) :
51 RooAbsPdf(other, name),
52 _x(
"x", this, other._x),
53 _ndof(
"ndof",this,other._ndof)
59 Double_t RooChiSquarePdf::evaluate()
const
63 return pow(_x,(_ndof/2.)-1.) * exp(-_x/2.) / TMath::Gamma(_ndof/2.) / pow(2.,_ndof/2.);
71 template<
class T_x,
class T_ndof>
72 void compute(
size_t batchSize,
73 double * __restrict output,
77 for (
size_t i=0; i<batchSize; i++) {
79 output[i] = 1/std::tgamma(N[i]/2.0);
85 const double gamma = 1/std::tgamma(N[2019]/2.0);
86 for (
size_t i=0; i<batchSize; i++) {
91 constexpr
double ln2 = 0.693147180559945309417232121458;
92 const double lnx0 = std::log(X[0]);
93 for (
size_t i=0; i<batchSize; i++) {
95 if ( X.isBatch() ) lnx = _rf_fast_log(X[i]);
98 double arg = (N[i]-2)*lnx -X[i] -N[i]*ln2;
99 output[i] *= _rf_fast_exp(0.5*arg);
104 RooSpan<double> RooChiSquarePdf::evaluateBatch(std::size_t begin, std::size_t batchSize)
const {
105 using namespace BatchHelpers;
106 auto _xData = _x.getValBatch(begin, batchSize);
107 auto _ndofData = _ndof.getValBatch(begin, batchSize);
108 const bool batch_x = !_xData.empty();
109 const bool batch_ndof = !_ndofData.empty();
111 if (!batch_x && !batch_ndof) {
114 batchSize = findSize({ _xData, _ndofData });
115 auto output = _batchData.makeWritableBatchUnInit(begin, batchSize);
117 if (batch_x && !batch_ndof ) {
118 compute(batchSize, output.data(), _xData, BracketAdapter<double>(_ndof));
120 else if (!batch_x && batch_ndof ) {
121 compute(batchSize, output.data(), BracketAdapter<double>(_x), _ndofData);
123 else if (batch_x && batch_ndof ) {
124 compute(batchSize, output.data(), _xData, _ndofData);
133 Int_t RooChiSquarePdf::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* rangeName)
const
135 if (rangeName && strlen(rangeName)) {
139 if (matchArgs(allVars, analVars, _x))
return 1;
145 Double_t RooChiSquarePdf::analyticalIntegral(Int_t code,
const char* rangeName)
const
147 assert(1 == code); (void)code;
148 Double_t xmin = _x.min(rangeName); Double_t xmax = _x.max(rangeName);
156 Double_t pmin = TMath::Gamma(_ndof/2,xmin/2);
157 Double_t pmax = TMath::Gamma(_ndof/2,xmax/2);