45 RooArgusBG::RooArgusBG(
const char *name,
const char *title,
46 RooAbsReal& _m, RooAbsReal& _m0, RooAbsReal& _c) :
47 RooAbsPdf(name, title),
48 m(
"m",
"Mass",this,_m),
49 m0(
"m0",
"Resonance mass",this,_m0),
50 c(
"c",
"Slope parameter",this,_c),
51 p(
"p",
"Power",this,(RooRealVar&)RooRealConstant::value(0.5))
58 RooArgusBG::RooArgusBG(
const char *name,
const char *title,
59 RooAbsReal& _m, RooAbsReal& _m0, RooAbsReal& _c, RooAbsReal& _p) :
60 RooAbsPdf(name, title),
61 m(
"m",
"Mass",this,_m),
62 m0(
"m0",
"Resonance mass",this,_m0),
63 c(
"c",
"Slope parameter",this,_c),
64 p(
"p",
"Power",this,_p)
71 RooArgusBG::RooArgusBG(
const RooArgusBG& other,
const char* name) :
72 RooAbsPdf(other,name),
74 m0(
"m0",this,other.m0),
82 Double_t RooArgusBG::evaluate()
const {
88 return m*TMath::Power(u,p)*exp(c*u) ;
96 template<
class Tm,
class Tm0,
class Tc,
class Tp>
97 void compute(
size_t batchSize,
98 double * __restrict output,
99 Tm M, Tm0 M0, Tc C, Tp P)
101 for (
size_t i=0; i<batchSize; i++) {
102 const double t = M[i]/M0[i];
103 const double u = 1 - t*t;
104 output[i] = C[i]*u + P[i]*_rf_fast_log(u);
106 for (
size_t i=0; i<batchSize; i++) {
107 if (M[i] >= M0[i]) output[i] = 0.0;
108 else output[i] = M[i]*_rf_fast_exp(output[i]);
113 RooSpan<double> RooArgusBG::evaluateBatch(std::size_t begin, std::size_t batchSize)
const {
114 using namespace BatchHelpers;
116 EvaluateInfo info = getInfo( {&m, &m0, &c, &p}, begin, batchSize );
117 if (info.nBatches == 0) {
120 auto output = _batchData.makeWritableBatchUnInit(begin, batchSize);
121 auto mData = m.getValBatch(begin, info.size);
123 if (info.nBatches==1 && !mData.empty()) {
124 compute(info.size, output.data(), mData.data(),
125 BracketAdapter<double> (m0),
126 BracketAdapter<double> (c),
127 BracketAdapter<double> (p));
130 compute(info.size, output.data(),
131 BracketAdapterWithMask (m,m.getValBatch(begin,info.size)),
132 BracketAdapterWithMask (m0,m0.getValBatch(begin,info.size)),
133 BracketAdapterWithMask (c,c.getValBatch(begin,info.size)),
134 BracketAdapterWithMask (p,p.getValBatch(begin,info.size)));
141 Int_t RooArgusBG::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* )
const
143 if (p.arg().isConstant()) {
145 if (matchArgs(allVars,analVars,m) && p == 0.5)
return 1;
153 Double_t RooArgusBG::analyticalIntegral(Int_t code,
const char* rangeName)
const
157 static const Double_t pi = atan2(0.0,-1.0);
158 Double_t min = (m.min(rangeName) < m0) ? m.min(rangeName) : m0;
159 Double_t max = (m.max(rangeName) < m0) ? m.max(rangeName) : m0;
160 Double_t f1 = (1.-TMath::Power(min/m0,2));
161 Double_t f2 = (1.-TMath::Power(max/m0,2));
162 Double_t aLow, aHigh ;
164 aLow = -0.5*m0*m0*(exp(c*f1)*sqrt(f1)/c + 0.5/TMath::Power(-c,1.5)*sqrt(pi)*RooMath::erf(sqrt(-c*f1)));
165 aHigh = -0.5*m0*m0*(exp(c*f2)*sqrt(f2)/c + 0.5/TMath::Power(-c,1.5)*sqrt(pi)*RooMath::erf(sqrt(-c*f2)));
166 }
else if ( c == 0. ) {
167 aLow = -m0*m0/3.*f1*sqrt(f1);
168 aHigh = -m0*m0/3.*f1*sqrt(f2);
170 aLow = 0.5*m0*m0*exp(c*f1)/(c*sqrt(c)) * (0.5*sqrt(pi)*(RooMath::faddeeva(sqrt(c*f1))).imag() - sqrt(c*f1));
171 aHigh = 0.5*m0*m0*exp(c*f2)/(c*sqrt(c)) * (0.5*sqrt(pi)*(RooMath::faddeeva(sqrt(c*f2))).imag() - sqrt(c*f2));
173 Double_t area = aHigh - aLow;