39 ClassImp(RooBreitWigner);
43 RooBreitWigner::RooBreitWigner(
const char *name,
const char *title,
44 RooAbsReal& _x, RooAbsReal& _mean,
46 RooAbsPdf(name,title),
47 x(
"x",
"Dependent",this,_x),
48 mean(
"mean",
"Mean",this,_mean),
49 width(
"width",
"Width",this,_width)
55 RooBreitWigner::RooBreitWigner(
const RooBreitWigner& other,
const char* name) :
56 RooAbsPdf(other,name), x(
"x",this,other.x), mean(
"mean",this,other.mean),
57 width(
"width",this,other.width)
63 Double_t RooBreitWigner::evaluate()
const
65 Double_t arg= x - mean;
66 return 1. / (arg*arg + 0.25*width*width);
74 template<
class Tx,
class Tmean,
class Tw
idth>
75 void compute(
size_t batchSize,
76 double * __restrict output,
77 Tx X, Tmean M, Twidth W)
79 for (
size_t i=0; i<batchSize; i++) {
80 const double arg = X[i]-M[i];
81 output[i] = 1 / (arg*arg + 0.25*W[i]*W[i]);
86 RooSpan<double> RooBreitWigner::evaluateBatch(std::size_t begin, std::size_t batchSize)
const {
87 using namespace BatchHelpers;
88 auto xData = x.getValBatch(begin, batchSize);
89 auto meanData = mean.getValBatch(begin, batchSize);
90 auto widthData = width.getValBatch(begin, batchSize);
91 const bool batchX = !xData.empty();
92 const bool batchMean = !meanData.empty();
93 const bool batchWidth = !widthData.empty();
95 if (!batchX && !batchMean && !batchWidth) {
98 batchSize = findSize({ xData, meanData, widthData });
99 auto output = _batchData.makeWritableBatchUnInit(begin, batchSize);
101 if (batchX && !batchMean && !batchWidth ) {
102 compute(batchSize, output.data(), xData, BracketAdapter<double>(mean), BracketAdapter<double>(width));
104 else if (!batchX && batchMean && !batchWidth ) {
105 compute(batchSize, output.data(), BracketAdapter<double>(x), meanData, BracketAdapter<double>(width));
107 else if (batchX && batchMean && !batchWidth ) {
108 compute(batchSize, output.data(), xData, meanData, BracketAdapter<double>(width));
110 else if (!batchX && !batchMean && batchWidth ) {
111 compute(batchSize, output.data(), BracketAdapter<double>(x), BracketAdapter<double>(mean), widthData);
113 else if (batchX && !batchMean && batchWidth ) {
114 compute(batchSize, output.data(), xData, BracketAdapter<double>(mean), widthData);
116 else if (!batchX && batchMean && batchWidth ) {
117 compute(batchSize, output.data(), BracketAdapter<double>(x), meanData, widthData);
119 else if (batchX && batchMean && batchWidth ) {
120 compute(batchSize, output.data(), xData, meanData, widthData);
127 Int_t RooBreitWigner::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* )
const
129 if (matchArgs(allVars,analVars,x))
return 1 ;
135 Double_t RooBreitWigner::analyticalIntegral(Int_t code,
const char* rangeName)
const
140 Double_t c = 2./width;
141 return c*(atan(c*(x.max(rangeName)-mean)) - atan(c*(x.min(rangeName)-mean)));