38 ClassImp(RooExponential);
42 RooExponential::RooExponential(
const char *name,
const char *title,
43 RooAbsReal& _x, RooAbsReal& _c) :
44 RooAbsPdf(name, title),
45 x(
"x",
"Dependent",this,_x),
46 c(
"c",
"Exponent",this,_c)
52 RooExponential::RooExponential(
const RooExponential& other,
const char* name) :
53 RooAbsPdf(other, name), x(
"x",this,other.x), c(
"c",this,other.c)
60 Double_t RooExponential::evaluate()
const{
66 Int_t RooExponential::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* )
const
68 if (matchArgs(allVars,analVars,x))
return 1;
69 if (matchArgs(allVars,analVars,c))
return 2;
75 Double_t RooExponential::analyticalIntegral(Int_t code,
const char* rangeName)
const
77 assert(code == 1 || code ==2);
79 auto& constant = code == 1 ? c : x;
80 auto& integrand = code == 1 ? x : c;
82 if (constant == 0.0) {
83 return integrand.max(rangeName) - integrand.min(rangeName);
86 return (exp(constant*integrand.max(rangeName)) - exp(constant*integrand.min(rangeName)))
93 template<
class Tx,
class Tc>
94 void compute(
size_t n,
double* __restrict output, Tx x, Tc c) {
96 for (
size_t i = 0; i < n; ++i) {
97 output[i] = _rf_fast_exp(x[i]*c[i]);
109 RooSpan<double> RooExponential::evaluateBatch(std::size_t begin, std::size_t batchSize)
const {
110 using namespace BatchHelpers;
111 auto xData = x.getValBatch(begin, batchSize);
112 auto cData = c.getValBatch(begin, batchSize);
113 const bool batchX = !xData.empty();
114 const bool batchC = !cData.empty();
116 if (!batchX && !batchC) {
119 batchSize = findSize({ xData, cData });
120 auto output = _batchData.makeWritableBatchUnInit(begin, batchSize);
122 if (batchX && !batchC ) {
123 compute(batchSize, output.data(), xData, BracketAdapter<double>(c));
125 else if (!batchX && batchC ) {
126 compute(batchSize, output.data(), BracketAdapter<double>(x), cData);
128 else if (batchX && batchC ) {
129 compute(batchSize, output.data(), xData, cData);