EvtGen 2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Loading...
Searching...
No Matches
EvtVubBLNPHybrid.cpp
Go to the documentation of this file.
1
2/***********************************************************************
3* Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4* *
5* This file is part of EvtGen. *
6* *
7* EvtGen is free software: you can redistribute it and/or modify *
8* it under the terms of the GNU General Public License as published by *
9* the Free Software Foundation, either version 3 of the License, or *
10* (at your option) any later version. *
11* *
12* EvtGen is distributed in the hope that it will be useful, *
13* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15* GNU General Public License for more details. *
16* *
17* You should have received a copy of the GNU General Public License *
18* along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19***********************************************************************/
20
22
24#include "EvtGenBase/EvtPDL.hh"
29
33
34#include <stdlib.h>
35#include <string>
36
37// For incomplete gamma function
38#include "math.h"
39#include "signal.h"
40#define ITMAX 100
41#define EPS 3.0e-7
42#define FPMIN 1.0e-30
43
44using std::cout;
45using std::endl;
46
47std::string EvtVubBLNPHybrid::getName() const
48{
49 return "VUB_BLNPHYBRID";
50}
51
56
58{
59 // check number of arguments
61 EvtGenReport( EVTGEN_ERROR, "EvtVubBLNPHybrid" )
62 << "EvtVubBLNPHybrid generator expected "
63 << "at least " << EvtVubBLNPHybrid::nParameters
64 << " arguments but found: " << getNArg()
65 << "\nWill terminate execution!" << endl;
66 ::abort();
67 } else if ( getNArg() == EvtVubBLNPHybrid::nParameters ) {
68 EvtGenReport( EVTGEN_WARNING, "EvtVubBLNPHybrid" )
69 << "EvtVubBLNPHybrid: generate B -> Xu l nu events "
70 << "without using the hybrid reweighting." << endl;
71 m_noHybrid = true;
72 } else if ( getNArg() <
74 EvtGenReport( EVTGEN_ERROR, "EvtVubBLNPHybrid" )
75 << "EvtVubBLNPHybrid could not read number of bins for "
76 << "all variables used in the reweighting\n"
77 << "Will terminate execution!" << endl;
78 ::abort();
79 }
80
81 // get parameters (declared in the header file)
82
83 // Input parameters
84 m_mBB = 5.2792;
85 m_lambda2 = 0.12;
86
87 // Shape function parameters
88 m_b = getArg( 0 );
89 m_Lambda = getArg( 1 );
90 m_Ecut = 1.8;
91 m_wzero = m_mBB - 2 * m_Ecut;
92
93 // SF and SSF modes
94 m_itype = (int)getArg( 5 );
95 m_dtype = getArg( 5 );
96 m_isubl = (int)getArg( 6 );
97
98 // flags
99 m_flag1 = (int)getArg( 7 );
100 m_flag2 = (int)getArg( 8 );
101 m_flag3 = (int)getArg( 9 );
102
103 // Quark mass
104 m_mb = 4.61;
105
106 // hidden parameter what and SF stuff
107 const double xlow = 0;
108 const double xhigh = m_mBB;
109 const int aSize = 10000;
110 EvtPFermi pFermi( m_Lambda, m_b );
111 // pf is the cumulative distribution normalized to 1.
112 m_pf.resize( aSize );
113 for ( int i = 0; i < aSize; i++ ) {
114 double what = xlow + (double)( i + 0.5 ) / ( (double)aSize ) *
115 ( xhigh - xlow );
116 if ( i == 0 )
117 m_pf[i] = pFermi.getSFBLNP( what );
118 else
119 m_pf[i] = m_pf[i - 1] + pFermi.getSFBLNP( what );
120 }
121 for ( size_t i = 0; i < m_pf.size(); i++ ) {
122 m_pf[i] /= m_pf[m_pf.size() - 1];
123 }
124
125 // Matching scales
126 m_muh = m_mBB * getArg( 2 ); // 0.5
127 m_mui = getArg( 3 ); // 1.5
128 m_mubar = getArg( 4 ); // 1.5
129
130 // Perturbative quantities
131 m_CF = 4.0 / 3.0;
132 m_CA = 3.0;
133 double nf = 4.0;
134
135 m_beta0 = 11.0 / 3.0 * m_CA - 2.0 / 3.0 * nf;
136 m_beta1 = 34.0 / 3.0 * m_CA * m_CA - 10.0 / 3.0 * m_CA * nf - 2.0 * m_CF * nf;
137 m_beta2 = 2857.0 / 54.0 * m_CA * m_CA * m_CA +
138 ( m_CF * m_CF - 205.0 / 18.0 * m_CF * m_CA -
139 1415.0 / 54.0 * m_CA * m_CA ) *
140 nf +
141 ( 11.0 / 9.0 * m_CF + 79.0 / 54.0 * m_CA ) * nf * nf;
142
143 m_zeta3 = 1.0 + 1 / 8.0 + 1 / 27.0 + 1 / 64.0;
144
145 m_Gamma0 = 4 * m_CF;
146 m_Gamma1 = m_CF * ( ( 268.0 / 9.0 - 4.0 * M_PI * M_PI / 3.0 ) * m_CA -
147 40.0 / 9.0 * nf );
148 m_Gamma2 = 16 * m_CF *
149 ( ( 245.0 / 24.0 - 67.0 / 54.0 * M_PI * M_PI +
150 +11.0 / 180.0 * pow( M_PI, 4 ) + 11.0 / 6.0 * m_zeta3 ) *
151 m_CA * m_CA *
152 +( -209.0 / 108.0 + 5.0 / 27.0 * M_PI * M_PI -
153 7.0 / 3.0 * m_zeta3 ) *
154 m_CA * nf +
155 ( -55.0 / 24.0 + 2 * m_zeta3 ) * m_CF * nf - nf * nf / 27.0 );
156
157 m_gp0 = -5.0 * m_CF;
158 m_gp1 = -8.0 * m_CF *
159 ( ( 3.0 / 16.0 - M_PI * M_PI / 4.0 + 3 * m_zeta3 ) * m_CF +
160 ( 1549.0 / 432.0 + 7.0 / 48.0 * M_PI * M_PI - 11.0 / 4.0 * m_zeta3 ) *
161 m_CA -
162 ( 125.0 / 216.0 + M_PI * M_PI / 24.0 ) * nf );
163
164 // Lbar and m_mupisq
165
166 m_Lbar = m_Lambda; // all models
167 m_mupisq = 3 * m_Lambda * m_Lambda / m_b;
168 if ( m_itype == 1 )
169 m_mupisq = 3 * m_Lambda * m_Lambda / m_b;
170 if ( m_itype == 2 )
171 m_mupisq = 3 * m_Lambda * m_Lambda *
172 ( Gamma( 1 + 0.5 * m_b ) * Gamma( 0.5 * m_b ) /
173 pow( Gamma( 0.5 + 0.5 * m_b ), 2 ) -
174 1 );
175
176 // m_moment2 for SSFs
177 m_moment2 = pow( 0.3, 3 );
178
179 // inputs for total rate (T for Total); use BLNP notebook defaults
180 m_flagpower = 1;
181 m_flag2loop = 1;
182
183 // stuff for the integrator
184 m_maxLoop = 20;
185 //m_precision = 1.0e-3;
186 m_precision = 2.0e-2;
187
188 // vector of global variables, to pass to static functions (which can't access globals);
189 m_gvars.push_back( 0.0 ); // 0
190 m_gvars.push_back( 0.0 ); // 1
191 m_gvars.push_back( m_mui ); // 2
192 m_gvars.push_back( m_b ); // 3
193 m_gvars.push_back( m_Lambda ); // 4
194 m_gvars.push_back( m_mBB ); // 5
195 m_gvars.push_back( m_mb ); // 6
196 m_gvars.push_back( m_wzero ); // 7
197 m_gvars.push_back( m_beta0 ); // 8
198 m_gvars.push_back( m_beta1 ); // 9
199 m_gvars.push_back( m_beta2 ); // 10
200 m_gvars.push_back( m_dtype ); // 11
201
202 // check that there are 3 daughters and 10 arguments
203 checkNDaug( 3 );
204 // A. Volk: check for number of arguments is not necessary
205 //checkNArg(10);
206
207 if ( m_noHybrid )
208 return; // Without hybrid weighting, nothing else to do
209
210 m_bins_mX = std::vector<double>( abs( (int)getArg( 10 ) ) );
211 m_bins_q2 = std::vector<double>( abs( (int)getArg( 11 ) ) );
212 m_bins_El = std::vector<double>( abs( (int)getArg( 12 ) ) );
213
215
216 m_nbins = m_bins_mX.size() * m_bins_q2.size() *
217 m_bins_El.size(); // Binning of weight table
218
219 int expectArgs = nextArg + m_bins_mX.size() + m_bins_q2.size() +
220 m_bins_El.size() + m_nbins;
221
222 if ( getNArg() < expectArgs ) {
223 EvtGenReport( EVTGEN_ERROR, "EvtVubBLNPHybrid" )
224 << " finds " << getNArg() << " arguments, expected " << expectArgs
225 << ". Something is wrong with the tables of weights or thresholds."
226 << "\nWill terminate execution!" << endl;
227 ::abort();
228 }
229
230 // read bin boundaries from decay.dec
231 for ( auto& b : m_bins_mX )
232 b = getArg( nextArg++ );
233 m_masscut = m_bins_mX[0];
234 for ( auto& b : m_bins_q2 )
235 b = getArg( nextArg++ );
236 for ( auto& b : m_bins_El )
237 b = getArg( nextArg++ );
238
239 // read in weights (and rescale to range 0..1)
240 readWeights( nextArg );
241}
242
247
249{
250 int j;
251
252 EvtParticle *xuhad( nullptr ), *lepton( nullptr ), *neutrino( nullptr );
253 EvtVector4R p4;
254 double EX( 0. ), sh( 0. ), El( 0. ), ml( 0. );
255 double Pp, Pm, Pl, pdf, qsq, mpi, ratemax;
256
257 double xhigh, xlow, what;
258 double mX;
259
260 bool rew( true );
261 while ( rew ) {
262 Bmeson->initializePhaseSpace( getNDaug(), getDaugs() );
263
264 xuhad = Bmeson->getDaug( 0 );
265 lepton = Bmeson->getDaug( 1 );
266 neutrino = Bmeson->getDaug( 2 );
267
268 m_mBB = Bmeson->mass();
269 ml = lepton->mass();
270
271 // get SF value
272 xlow = 0;
273 xhigh = m_mBB;
274 // the case for alphas = 0 is not considered
275 what = 2 * xhigh;
276 while ( what > xhigh || what < xlow ) {
277 what = findBLNPWhat();
278 what = xlow + what * ( xhigh - xlow );
279 }
280
281 bool tryit = true;
282
283 while ( tryit ) {
284 // generate pp between 0 and
285 // Flat(min, max) gives R(max - min) + min, where R = random btwn 0 and 1
286
287 Pp = EvtRandom::Flat( 0, m_mBB ); // P+ = EX - |PX|
288 Pl = EvtRandom::Flat( 0, m_mBB ); // mBB - 2El
289 Pm = EvtRandom::Flat( 0, m_mBB ); // P- = EX + |PX|
290
291 sh = Pm * Pp;
292 EX = 0.5 * ( Pm + Pp );
293 qsq = ( m_mBB - Pp ) * ( m_mBB - Pm );
294 El = 0.5 * ( m_mBB - Pl );
295
296 // Need maximum rate. Waiting for Mr. Paz to give it to me.
297 // Meanwhile, use this.
298 ratemax = 3.0; // From trial and error - most events below 3.0
299
300 // kinematic bounds (Eq. 2)
301 mpi = 0.14;
302 if ( ( Pp > 0 ) && ( Pp <= Pl ) && ( Pl <= Pm ) && ( Pm < m_mBB ) &&
303 ( El > ml ) && ( sh > 4 * mpi * mpi ) ) {
304 // Probability of pass proportional to PDF
305 pdf = rate3( Pp, Pl, Pm );
306 double testRan = EvtRandom::Flat( 0., ratemax );
307 if ( pdf >= testRan )
308 tryit = false;
309 }
310 }
311
312 // compute all kinematic variables needed for reweighting
313 mX = sqrt( sh );
314
315 // Reweighting in bins of mX, q2, El
316 if ( m_nbins > 0 ) {
317 double xran1 = EvtRandom::Flat();
318 double w = 1.0;
319 if ( !m_noHybrid )
320 w = getWeight( mX, qsq, El );
321 if ( w >= xran1 )
322 rew = false;
323 } else {
324 rew = false;
325 }
326 }
327 // o.k. we have the three kineamtic variables
328 // now calculate a flat cos Theta_H [-1,1] distribution of the
329 // hadron flight direction w.r.t the B flight direction
330 // because the B is a scalar and should decay isotropic.
331 // Then chose a flat Phi_H [0,2Pi] w.r.t the B flight direction
332 // and and a flat Phi_L [0,2Pi] in the W restframe w.r.t the
333 // W flight direction.
334
335 double ctH = EvtRandom::Flat( -1, 1 );
336 double phH = EvtRandom::Flat( 0, 2 * M_PI );
337 double phL = EvtRandom::Flat( 0, 2 * M_PI );
338
339 // now compute the four vectors in the B Meson restframe
340
341 double ptmp, sttmp;
342 // calculate the hadron 4 vector in the B Meson restframe
343
344 sttmp = sqrt( 1 - ctH * ctH );
345 ptmp = sqrt( EX * EX - sh );
346 double pHB[4] = { EX, ptmp * sttmp * cos( phH ), ptmp * sttmp * sin( phH ),
347 ptmp * ctH };
348 p4.set( pHB[0], pHB[1], pHB[2], pHB[3] );
349 xuhad->init( getDaug( 0 ), p4 );
350
351 if ( m_storeWhat ) {
352 // cludge to store the hidden parameter what with the decay;
353 // the lifetime of the Xu is abused for this purpose.
354 // tau = 1 ps corresponds to ctau = 0.3 mm -> in order to
355 // stay well below BaBars sensitivity we take what/(10000 GeV).
356 // To extract what back from the StdHepTrk its necessary to get
357 // delta_ctau = Xu->decayVtx()->point().distanceTo(XuDaughter->decayVtx()->point());
358 //
359 // what = delta_ctau * 100000 * Mass_Xu/Momentum_Xu
360 //
361 xuhad->setLifetime( what / 10000. );
362 }
363
364 // calculate the W 4 vector in the B Meson restrframe
365
366 double apWB = ptmp;
367 double pWB[4] = { m_mBB - EX, -pHB[1], -pHB[2], -pHB[3] };
368
369 // first go in the W restframe and calculate the lepton and
370 // the neutrino in the W frame
371
372 double mW2 = m_mBB * m_mBB + sh - 2 * m_mBB * EX;
373 double beta = ptmp / pWB[0];
374 double gamma = pWB[0] / sqrt( mW2 );
375
376 double pLW[4];
377
378 ptmp = ( mW2 - ml * ml ) / 2 / sqrt( mW2 );
379 pLW[0] = sqrt( ml * ml + ptmp * ptmp );
380
381 double ctL = ( El - gamma * pLW[0] ) / beta / gamma / ptmp;
382 if ( ctL < -1 )
383 ctL = -1;
384 if ( ctL > 1 )
385 ctL = 1;
386 sttmp = sqrt( 1 - ctL * ctL );
387
388 // eX' = eZ x eW
389 double xW[3] = { -pWB[2], pWB[1], 0 };
390 // eZ' = eW
391 double zW[3] = { pWB[1] / apWB, pWB[2] / apWB, pWB[3] / apWB };
392
393 double lx = sqrt( xW[0] * xW[0] + xW[1] * xW[1] );
394 for ( j = 0; j < 2; j++ )
395 xW[j] /= lx;
396
397 // eY' = eZ' x eX'
398 double yW[3] = { -pWB[1] * pWB[3], -pWB[2] * pWB[3],
399 pWB[1] * pWB[1] + pWB[2] * pWB[2] };
400 double ly = sqrt( yW[0] * yW[0] + yW[1] * yW[1] + yW[2] * yW[2] );
401 for ( j = 0; j < 3; j++ )
402 yW[j] /= ly;
403
404 // p_lep = |p_lep| * ( sin(Theta) * cos(Phi) * eX'
405 // + sin(Theta) * sin(Phi) * eY'
406 // + cos(Theta) * eZ')
407 for ( j = 0; j < 3; j++ )
408 pLW[j + 1] = sttmp * cos( phL ) * ptmp * xW[j] +
409 sttmp * sin( phL ) * ptmp * yW[j] + ctL * ptmp * zW[j];
410
411 double apLW = ptmp;
412
413 // boost them back in the B Meson restframe
414
415 double appLB = beta * gamma * pLW[0] + gamma * ctL * apLW;
416
417 ptmp = sqrt( El * El - ml * ml );
418 double ctLL = appLB / ptmp;
419
420 if ( ctLL > 1 )
421 ctLL = 1;
422 if ( ctLL < -1 )
423 ctLL = -1;
424
425 double pLB[4] = { El, 0, 0, 0 };
426 double pNB[4] = { pWB[0] - El, 0, 0, 0 };
427
428 for ( j = 1; j < 4; j++ ) {
429 pLB[j] = pLW[j] + ( ctLL * ptmp - ctL * apLW ) / apWB * pWB[j];
430 pNB[j] = pWB[j] - pLB[j];
431 }
432
433 p4.set( pLB[0], pLB[1], pLB[2], pLB[3] );
434 lepton->init( getDaug( 1 ), p4 );
435
436 p4.set( pNB[0], pNB[1], pNB[2], pNB[3] );
437 neutrino->init( getDaug( 2 ), p4 );
438}
439
440double EvtVubBLNPHybrid::rate3( double Pp, double Pl, double Pm )
441{
442 // rate3 in units of GF^2*Vub^2/pi^3
443
444 double factor = 1.0 / 16 * ( m_mBB - Pp ) * U1lo( m_muh, m_mui ) *
445 pow( ( Pm - Pp ) / ( m_mBB - Pp ), alo( m_muh, m_mui ) );
446
447 double doneJS = DoneJS( Pp, Pm, m_mui );
448 double done1 = Done1( Pp, Pm, m_mui );
449 double done2 = Done2( Pp, Pm, m_mui );
450 double done3 = Done3( Pp, Pm, m_mui );
451
452 // The EvtSimpsonIntegrator returns zero for bad integrals.
453 // So if any of the integrals are zero (ie bad), return zero.
454 // This will cause pdf = 0, so the event will not pass.
455 // I hope this will not introduce a bias.
456 if ( doneJS * done1 * done2 * done3 == 0.0 ) {
457 //cout << "Integral failed: (Pp, Pm, Pl) = (" << Pp << ", " << Pm << ", " << Pl << ")" << endl;
458 return 0.0;
459 }
460 // if (doneJS*done1*done2*done3 != 0.0) {
461 // cout << "Integral OK: (Pp, Pm, Pl) = (" << Pp << ", " << Pm << ", " << Pl << ")" << endl;
462 //}
463
464 double f1 = F1( Pp, Pm, m_muh, m_mui, m_mubar, doneJS, done1 );
465 double f2 = F2( Pp, Pm, m_muh, m_mui, m_mubar, done3 );
466 double f3 = F3( Pp, Pm, m_muh, m_mui, m_mubar, done2 );
467 double answer = factor * ( ( m_mBB + Pl - Pp - Pm ) * ( Pm - Pl ) * f1 +
468 2 * ( Pl - Pp ) * ( Pm - Pl ) * f2 +
469 ( m_mBB - Pm ) * ( Pm - Pp ) * f3 );
470 return answer;
471}
472
473double EvtVubBLNPHybrid::F1( double Pp, double Pm, double muh, double mui,
474 double mubar, double doneJS, double done1 )
475{
476 std::vector<double> vars( 12 );
477 vars[0] = Pp;
478 vars[1] = Pm;
479 for ( int j = 2; j < 12; j++ ) {
480 vars[j] = m_gvars[j];
481 }
482
483 double y = ( Pm - Pp ) / ( m_mBB - Pp );
484 double ah = m_CF * alphas( muh, vars ) / 4 / M_PI;
485 double ai = m_CF * alphas( mui, vars ) / 4 / M_PI;
486 double abar = m_CF * alphas( mubar, vars ) / 4 / M_PI;
487 double lambda1 = -m_mupisq;
488
489 double t1 = -4 * ai / ( Pp - m_Lbar ) *
490 ( 2 * log( ( Pp - m_Lbar ) / mui ) + 1 );
491 double t2 = 1 + dU1nlo( muh, mui ) + anlo( muh, mui ) * log( y );
492 double t3 = -4.0 * pow( log( y * m_mb / muh ), 2 ) +
493 10.0 * log( y * m_mb / muh ) - 4.0 * log( y ) -
494 2.0 * log( y ) / ( 1 - y ) - 4.0 * PolyLog( 2, 1 - y ) -
495 M_PI * M_PI / 6.0 - 12.0;
496 double t4 = 2 * pow( log( y * m_mb * Pp / ( mui * mui ) ), 2 ) -
497 3 * log( y * m_mb * Pp / ( mui * mui ) ) + 7 - M_PI * M_PI;
498
499 double t5 = -wS( Pp ) + 2 * t( Pp ) +
500 ( 1.0 / y - 1.0 ) * ( u( Pp ) - v( Pp ) );
501 double t6 = -( lambda1 + 3.0 * m_lambda2 ) / 3.0 +
502 1.0 / pow( y, 2 ) * ( 4.0 / 3.0 * lambda1 - 2.0 * m_lambda2 );
503
504 double shapePp = Shat( Pp, vars );
505
506 double answer = ( t2 + ah * t3 + ai * t4 ) * shapePp + ai * doneJS +
507 1 / ( m_mBB - Pp ) *
508 ( m_flag2 * abar * done1 + m_flag1 * t5 ) +
509 1 / pow( m_mBB - Pp, 2 ) * m_flag3 * shapePp * t6;
510 if ( Pp > m_Lbar + mui / exp( 0.5 ) )
511 answer = answer + t1;
512 return answer;
513}
514
515double EvtVubBLNPHybrid::F2( double Pp, double Pm, double muh, double /* mui */,
516 double mubar, double done3 )
517{
518 std::vector<double> vars( 12 );
519 vars[0] = Pp;
520 vars[1] = Pm;
521 for ( int j = 2; j < 12; j++ ) {
522 vars[j] = m_gvars[j];
523 }
524
525 double y = ( Pm - Pp ) / ( m_mBB - Pp );
526 double lambda1 = -m_mupisq;
527 double ah = m_CF * alphas( muh, vars ) / 4 / M_PI;
528 double abar = m_CF * alphas( mubar, vars ) / 4 / M_PI;
529
530 double t6 = -wS( Pp ) - 2 * t( Pp ) + 1.0 / y * ( t( Pp ) + v( Pp ) );
531 double t7 = 1 / pow( y, 2 ) * ( 2.0 / 3.0 * lambda1 + 4.0 * m_lambda2 ) -
532 1 / y * ( 2.0 / 3.0 * lambda1 + 3.0 / 2.0 * m_lambda2 );
533
534 double shapePp = Shat( Pp, vars );
535
536 double answer = ah * log( y ) / ( 1 - y ) * shapePp +
537 1 / ( m_mBB - Pp ) *
538 ( m_flag2 * abar * 0.5 * done3 + m_flag1 / y * t6 ) +
539 1.0 / pow( m_mBB - Pp, 2 ) * m_flag3 * shapePp * t7;
540 return answer;
541}
542
543double EvtVubBLNPHybrid::F3( double Pp, double Pm, double /*muh*/,
544 double /* mui */, double mubar, double done2 )
545{
546 std::vector<double> vars( 12 );
547 vars[0] = Pp;
548 vars[1] = Pm;
549 for ( int j = 2; j < 12; j++ ) {
550 vars[j] = m_gvars[j];
551 }
552
553 double y = ( Pm - Pp ) / ( m_mBB - Pp );
554 double lambda1 = -m_mupisq;
555 double abar = m_CF * alphas( mubar, vars ) / 4 / M_PI;
556
557 double t7 = 1.0 / pow( y, 2 ) * ( -2.0 / 3.0 * lambda1 + m_lambda2 );
558
559 double shapePp = Shat( Pp, vars );
560
561 double answer = 1.0 / ( Pm - Pp ) * m_flag2 * 0.5 * y * abar * done2 +
562 1.0 / pow( m_mBB - Pp, 2 ) * m_flag3 * shapePp * t7;
563 return answer;
564}
565
566double EvtVubBLNPHybrid::DoneJS( double Pp, double Pm, double /* mui */ )
567{
568 std::vector<double> vars( 12 );
569 vars[0] = Pp;
570 vars[1] = Pm;
571 for ( int j = 2; j < 12; j++ ) {
572 vars[j] = m_gvars[j];
573 }
574
575 double lowerlim = 0.001 * Pp;
576 double upperlim = ( 1.0 - 0.001 ) * Pp;
577
578 auto func = EvtItgPtrFunction{ &IntJS, lowerlim, upperlim, vars };
579 auto integ = EvtItgSimpsonIntegrator{ func, m_precision, m_maxLoop };
580 return integ.evaluate( lowerlim, upperlim );
581}
582
583double EvtVubBLNPHybrid::Done1( double Pp, double Pm, double /* mui */ )
584{
585 std::vector<double> vars( 12 );
586 vars[0] = Pp;
587 vars[1] = Pm;
588 for ( int j = 2; j < 12; j++ ) {
589 vars[j] = m_gvars[j];
590 }
591
592 double lowerlim = 0.001 * Pp;
593 double upperlim = ( 1.0 - 0.001 ) * Pp;
594
595 auto func = EvtItgPtrFunction{ &Int1, lowerlim, upperlim, vars };
596 auto integ = EvtItgSimpsonIntegrator{ func, m_precision, m_maxLoop };
597 return integ.evaluate( lowerlim, upperlim );
598}
599
600double EvtVubBLNPHybrid::Done2( double Pp, double Pm, double /* mui */ )
601{
602 std::vector<double> vars( 12 );
603 vars[0] = Pp;
604 vars[1] = Pm;
605 for ( int j = 2; j < 12; j++ ) {
606 vars[j] = m_gvars[j];
607 }
608
609 double lowerlim = 0.001 * Pp;
610 double upperlim = ( 1.0 - 0.001 ) * Pp;
611
612 auto func = EvtItgPtrFunction{ &Int2, lowerlim, upperlim, vars };
613 auto integ = EvtItgSimpsonIntegrator{ func, m_precision, m_maxLoop };
614 return integ.evaluate( lowerlim, upperlim );
615}
616
617double EvtVubBLNPHybrid::Done3( double Pp, double Pm, double /* mui */ )
618{
619 std::vector<double> vars( 12 );
620 vars[0] = Pp;
621 vars[1] = Pm;
622 for ( int j = 2; j < 12; j++ ) {
623 vars[j] = m_gvars[j];
624 }
625
626 double lowerlim = 0.001 * Pp;
627 double upperlim = ( 1.0 - 0.001 ) * Pp;
628
629 auto func = EvtItgPtrFunction{ &Int3, lowerlim, upperlim, vars };
630 auto integ = EvtItgSimpsonIntegrator{ func, m_precision, m_maxLoop };
631 return integ.evaluate( lowerlim, upperlim );
632}
633
634double EvtVubBLNPHybrid::Int1( double what, const std::vector<double>& vars )
635{
636 return Shat( what, vars ) * g1( what, vars );
637}
638
639double EvtVubBLNPHybrid::Int2( double what, const std::vector<double>& vars )
640{
641 return Shat( what, vars ) * g2( what, vars );
642}
643
644double EvtVubBLNPHybrid::Int3( double what, const std::vector<double>& vars )
645{
646 return Shat( what, vars ) * g3( what, vars );
647}
648
649double EvtVubBLNPHybrid::IntJS( double what, const std::vector<double>& vars )
650{
651 double Pp = vars[0];
652 double Pm = vars[1];
653 double mui = vars[2];
654 double mBB = vars[5];
655 double mb = vars[6];
656 double y = ( Pm - Pp ) / ( mBB - Pp );
657
658 return 1 / ( Pp - what ) * ( Shat( what, vars ) - Shat( Pp, vars ) ) *
659 ( 4 * log( y * mb * ( Pp - what ) / ( mui * mui ) ) - 3 );
660}
661
662double EvtVubBLNPHybrid::g1( double w, const std::vector<double>& vars )
663{
664 double Pp = vars[0];
665 double Pm = vars[1];
666 double mBB = vars[5];
667 double y = ( Pm - Pp ) / ( mBB - Pp );
668 double x = ( Pp - w ) / ( mBB - Pp );
669
670 double q1 = ( 1 + x ) * ( 1 + x ) * y * ( x + y );
671 double q2 = y * ( -9 + 10 * y ) + x * x * ( -12.0 + 13.0 * y ) +
672 2 * x * ( -8.0 + 6 * y + 3 * y * y );
673 double q3 = 4 / x * log( y + y / x );
674 double q4 = 3.0 * pow( x, 4 ) * ( -2.0 + y ) - 2 * pow( y, 3 ) -
675 4 * pow( x, 3 ) * ( 2.0 + y ) - 2 * x * y * y * ( 4 + y ) -
676 x * x * y * ( 12 + 4 * y + y * y );
677 double q5 = log( 1 + y / x );
678
679 double answer = q2 / q1 - q3 - 2 * q4 * q5 / ( q1 * y * x );
680 return answer;
681}
682
683double EvtVubBLNPHybrid::g2( double w, const std::vector<double>& vars )
684{
685 double Pp = vars[0];
686 double Pm = vars[1];
687 double mBB = vars[5];
688 double y = ( Pm - Pp ) / ( mBB - Pp );
689 double x = ( Pp - w ) / ( mBB - Pp );
690
691 double q1 = ( 1 + x ) * ( 1 + x ) * pow( y, 3 ) * ( x + y );
692 double q2 = 10.0 * pow( x, 4 ) + y * y +
693 3.0 * pow( x, 2 ) * y * ( 10.0 + y ) +
694 pow( x, 3 ) * ( 12.0 + 19.0 * y ) +
695 x * y * ( 8.0 + 4.0 * y + y * y );
696 double q3 = 5 * pow( x, 4 ) + 2.0 * y * y +
697 6.0 * pow( x, 3 ) * ( 1.0 + 2.0 * y ) +
698 4.0 * x * y * ( 1 + 2.0 * y ) + x * x * y * ( 18.0 + 5.0 * y );
699 double q4 = log( 1 + y / x );
700
701 double answer = 2.0 / q1 * ( y * q2 - 2 * x * q3 * q4 );
702 return answer;
703}
704
705double EvtVubBLNPHybrid::g3( double w, const std::vector<double>& vars )
706{
707 double Pp = vars[0];
708 double Pm = vars[1];
709 double mBB = vars[5];
710 double y = ( Pm - Pp ) / ( mBB - Pp );
711 double x = ( Pp - w ) / ( mBB - Pp );
712
713 double q1 = ( 1 + x ) * ( 1 + x ) * pow( y, 3 ) * ( x + y );
714 double q2 = 2.0 * pow( y, 3 ) * ( -11.0 + 2.0 * y ) -
715 10.0 * pow( x, 4 ) * ( 6 - 6 * y + y * y ) +
716 x * y * y * ( -94.0 + 29.0 * y + 2.0 * y * y ) +
717 2.0 * x * x * y * ( -72.0 + 18.0 * y + 13.0 * y * y ) -
718 x * x * x * ( 72.0 + 42.0 * y - 70.0 * y * y + 3.0 * y * y * y );
719 double q3 = -6.0 * x * ( -5.0 + y ) * pow( y, 3 ) + 4 * pow( y, 4 ) +
720 5 * pow( x, 5 ) * ( 6 - 6 * y + y * y ) -
721 4 * x * x * y * y * ( -20.0 + 6 * y + y * y ) +
722 pow( x, 3 ) * y * ( 90.0 - 10.0 * y - 28.0 * y * y + y * y * y ) +
723 pow( x, 4 ) * ( 36.0 + 36.0 * y - 50.0 * y * y + 4 * y * y * y );
724 double q4 = log( 1 + y / x );
725
726 double answer = q2 / q1 + 2 / q1 / y * q3 * q4;
727 return answer;
728}
729
730double EvtVubBLNPHybrid::Shat( double w, const std::vector<double>& vars )
731{
732 double mui = vars[2];
733 double b = vars[3];
734 double Lambda = vars[4];
735 double wzero = vars[7];
736 int itype = (int)vars[11];
737
738 double norm = 0.0;
739 double shape = 0.0;
740
741 if ( itype == 1 ) {
742 double Lambar = ( Lambda / b ) *
743 ( Gamma( 1 + b ) - Gamma( 1 + b, b * wzero / Lambda ) ) /
744 ( Gamma( b ) - Gamma( b, b * wzero / Lambda ) );
745 double muf = wzero - Lambar;
746 double mupisq = 3 * pow( Lambda, 2 ) / pow( b, 2 ) *
747 ( Gamma( 2 + b ) -
748 Gamma( 2 + b, b * wzero / Lambda ) ) /
749 ( Gamma( b ) - Gamma( b, b * wzero / Lambda ) ) -
750 3 * Lambar * Lambar;
751 norm = Mzero( muf, mui, mupisq, vars ) * Gamma( b ) /
752 ( Gamma( b ) - Gamma( b, b * wzero / Lambda ) );
753 shape = pow( b, b ) / Lambda / Gamma( b ) * pow( w / Lambda, b - 1 ) *
754 exp( -b * w / Lambda );
755 }
756
757 if ( itype == 2 ) {
758 double dcoef = pow( Gamma( 0.5 * ( 1 + b ) ) / Gamma( 0.5 * b ), 2 );
759 double t1 = wzero * wzero * dcoef / ( Lambda * Lambda );
760 double Lambar =
761 Lambda * ( Gamma( 0.5 * ( 1 + b ) ) - Gamma( 0.5 * ( 1 + b ), t1 ) ) /
762 pow( dcoef, 0.5 ) / ( Gamma( 0.5 * b ) - Gamma( 0.5 * b, t1 ) );
763 double muf = wzero - Lambar;
764 double mupisq = 3 * Lambda * Lambda *
765 ( Gamma( 1 + 0.5 * b ) - Gamma( 1 + 0.5 * b, t1 ) ) /
766 dcoef / ( Gamma( 0.5 * b ) - Gamma( 0.5 * b, t1 ) ) -
767 3 * Lambar * Lambar;
768 norm = Mzero( muf, mui, mupisq, vars ) * Gamma( 0.5 * b ) /
769 ( Gamma( 0.5 * b ) -
770 Gamma( 0.5 * b, wzero * wzero * dcoef / ( Lambda * Lambda ) ) );
771 shape = 2 * pow( dcoef, 0.5 * b ) / Lambda / Gamma( 0.5 * b ) *
772 pow( w / Lambda, b - 1 ) *
773 exp( -dcoef * w * w / ( Lambda * Lambda ) );
774 }
775
776 double answer = norm * shape;
777 return answer;
778}
779
780double EvtVubBLNPHybrid::Mzero( double muf, double mu, double mupisq,
781 const std::vector<double>& vars )
782{
783 double CF = 4.0 / 3.0;
784 double amu = CF * alphas( mu, vars ) / M_PI;
785 double answer = 1 -
786 amu * ( pow( log( muf / mu ), 2 ) + log( muf / mu ) +
787 M_PI * M_PI / 24.0 ) +
788 amu * ( log( muf / mu ) - 0.5 ) * mupisq / ( 3 * muf * muf );
789 return answer;
790}
791
792double EvtVubBLNPHybrid::wS( double w )
793{
794 double answer = ( m_Lbar - w ) * Shat( w, m_gvars );
795 return answer;
796}
797
798double EvtVubBLNPHybrid::t( double w )
799{
800 double t1 = -3 * m_lambda2 / m_mupisq * ( m_Lbar - w ) * Shat( w, m_gvars );
801 double myf = myfunction( w, m_Lbar, m_moment2 );
802 double myBIK = myfunctionBIK( w, m_Lbar, m_moment2 );
803 double answer = t1;
804
805 if ( m_isubl == 1 )
806 answer = t1;
807 if ( m_isubl == 3 )
808 answer = t1 - myf;
809 if ( m_isubl == 4 )
810 answer = t1 + myf;
811 if ( m_isubl == 5 )
812 answer = t1 - myBIK;
813 if ( m_isubl == 6 )
814 answer = t1 + myBIK;
815
816 return answer;
817}
818
819double EvtVubBLNPHybrid::u( double w )
820{
821 double u1 = -2 * ( m_Lbar - w ) * Shat( w, m_gvars );
822 double myf = myfunction( w, m_Lbar, m_moment2 );
823 double myBIK = myfunctionBIK( w, m_Lbar, m_moment2 );
824 double answer = u1;
825
826 if ( m_isubl == 1 )
827 answer = u1;
828 if ( m_isubl == 3 )
829 answer = u1 + myf;
830 if ( m_isubl == 4 )
831 answer = u1 - myf;
832 if ( m_isubl == 5 )
833 answer = u1 + myBIK;
834 if ( m_isubl == 6 )
835 answer = u1 - myBIK;
836
837 return answer;
838}
839
840double EvtVubBLNPHybrid::v( double w )
841{
842 double v1 = 3 * m_lambda2 / m_mupisq * ( m_Lbar - w ) * Shat( w, m_gvars );
843 double myf = myfunction( w, m_Lbar, m_moment2 );
844 double myBIK = myfunctionBIK( w, m_Lbar, m_moment2 );
845 double answer = v1;
846
847 if ( m_isubl == 1 )
848 answer = v1;
849 if ( m_isubl == 3 )
850 answer = v1 - myf;
851 if ( m_isubl == 4 )
852 answer = v1 + myf;
853 if ( m_isubl == 5 )
854 answer = v1 - myBIK;
855 if ( m_isubl == 6 )
856 answer = v1 + myBIK;
857
858 return answer;
859}
860
861double EvtVubBLNPHybrid::myfunction( double w, double Lbar, double mom2 )
862{
863 double bval = 5.0;
864 double x = w / Lbar;
865 double factor = 0.5 * mom2 * pow( bval / Lbar, 3 );
866 double answer = factor * exp( -bval * x ) *
867 ( 1 - 2 * bval * x + 0.5 * bval * bval * x * x );
868 return answer;
869}
870
871double EvtVubBLNPHybrid::myfunctionBIK( double w, double Lbar, double /* mom2 */ )
872{
873 double aval = 10.0;
874 double normBIK = ( 4 - M_PI ) * M_PI * M_PI / 8 / ( 2 - M_PI ) / aval + 1;
875 double z = 3 * M_PI * w / 8 / Lbar;
876 double q = M_PI * M_PI * 2 * pow( M_PI * aval, 0.5 ) * exp( -aval * z * z ) /
877 ( 4 * M_PI - 8 ) * ( 1 - 2 * pow( aval / M_PI, 0.5 ) * z ) +
878 8 / pow( 1 + z * z, 4 ) *
879 ( z * log( z ) + 0.5 * z * ( 1 + z * z ) -
880 M_PI / 4 * ( 1 - z * z ) );
881 double answer = q / normBIK;
882 return answer;
883}
884
885double EvtVubBLNPHybrid::dU1nlo( double muh, double mui )
886{
887 double ai = alphas( mui, m_gvars );
888 double ah = alphas( muh, m_gvars );
889
890 double q1 = ( ah - ai ) / ( 4 * M_PI * m_beta0 );
891 double q2 = log( m_mb / muh ) * m_Gamma1 + m_gp1;
892 double q3 = 4 * m_beta1 * ( log( m_mb / muh ) * m_Gamma0 + m_gp0 ) +
893 m_Gamma2 * ( 1 - ai / ah );
894 double q4 = m_beta1 * m_beta1 * m_Gamma0 * ( -1.0 + ai / ah ) /
895 ( 4 * pow( m_beta0, 3 ) );
896 double q5 = -m_beta2 * m_Gamma0 * ( 1.0 + ai / ah ) +
897 m_beta1 * m_Gamma1 * ( 3 - ai / ah );
898 double q6 = m_beta1 * m_beta1 * m_Gamma0 * ( ah - ai ) / m_beta0 -
899 m_beta2 * m_Gamma0 * ah + m_beta1 * m_Gamma1 * ai;
900
901 double answer =
902 q1 * ( q2 - q3 / 4 / m_beta0 + q4 + q5 / ( 4 * m_beta0 * m_beta0 ) ) +
903 1 / ( 8 * M_PI * m_beta0 * m_beta0 * m_beta0 ) * log( ai / ah ) * q6;
904 return answer;
905}
906
907double EvtVubBLNPHybrid::U1lo( double muh, double mui )
908{
909 double epsilon = 0.0;
910 double answer = pow( m_mb / muh, -2 * aGamma( muh, mui, epsilon ) ) *
911 exp( 2 * Sfun( muh, mui, epsilon ) -
912 2 * agp( muh, mui, epsilon ) );
913 return answer;
914}
915
916double EvtVubBLNPHybrid::Sfun( double mu1, double mu2, double epsilon )
917{
918 double a1 = alphas( mu1, m_gvars ) / 4 / M_PI;
919 double a2 = alphas( mu2, m_gvars ) / alphas( mu1, m_gvars );
920
921 double answer = S0( a1, a2 ) + S1( a1, a2 ) + epsilon * S2( a1, a2 );
922 return answer;
923}
924
925double EvtVubBLNPHybrid::S0( double a1, double r )
926{
927 double answer = -m_Gamma0 / ( 4.0 * m_beta0 * m_beta0 * a1 ) *
928 ( -1.0 + 1.0 / r + log( r ) );
929 return answer;
930}
931
932double EvtVubBLNPHybrid::S1( double /* a1 */, double r )
933{
934 double answer = m_Gamma0 / ( 4 * m_beta0 * m_beta0 ) *
935 ( 0.5 * log( r ) * log( r ) * m_beta1 / m_beta0 +
936 ( m_Gamma1 / m_Gamma0 - m_beta1 / m_beta0 ) *
937 ( 1 - r + log( r ) ) );
938 return answer;
939}
940
941double EvtVubBLNPHybrid::S2( double a1, double r )
942{
943 double w1 = pow( m_beta1, 2 ) / pow( m_beta0, 2 ) - m_beta2 / m_beta0 -
945 double w2 = pow( m_beta1, 2 ) / pow( m_beta0, 2 ) - m_beta2 / m_beta0;
946 double w3 = m_beta1 * m_Gamma1 / ( m_beta0 * m_Gamma0 ) - m_beta2 / m_beta0;
947 double w4 = a1 * m_Gamma0 / ( 4 * m_beta0 * m_beta0 );
948
949 double answer = w4 *
950 ( -0.5 * pow( 1 - r, 2 ) * w1 + w2 * ( 1 - r ) * log( r ) +
951 w3 * ( 1 - r + r * log( r ) ) );
952 return answer;
953}
954
955double EvtVubBLNPHybrid::aGamma( double mu1, double mu2, double epsilon )
956{
957 double a1 = alphas( mu1, m_gvars );
958 double a2 = alphas( mu2, m_gvars );
959 double answer = m_Gamma0 / ( 2 * m_beta0 ) * log( a2 / a1 ) +
960 epsilon * ( a2 - a1 ) / ( 8.0 * M_PI ) *
961 ( m_Gamma1 / m_beta0 -
962 m_beta1 * m_Gamma0 / ( m_beta0 * m_beta0 ) );
963 return answer;
964}
965
966double EvtVubBLNPHybrid::agp( double mu1, double mu2, double epsilon )
967{
968 double a1 = alphas( mu1, m_gvars );
969 double a2 = alphas( mu2, m_gvars );
970 double answer = m_gp0 / ( 2 * m_beta0 ) * log( a2 / a1 ) +
971 epsilon * ( a2 - a1 ) / ( 8.0 * M_PI ) *
972 ( m_gp1 / m_beta0 -
973 m_beta1 * m_gp0 / ( m_beta0 * m_beta0 ) );
974 return answer;
975}
976
977double EvtVubBLNPHybrid::alo( double muh, double mui )
978{
979 return -2.0 * aGamma( muh, mui, 0 );
980}
981
982double EvtVubBLNPHybrid::anlo( double muh, double mui )
983{ // d/depsilon of aGamma
984
985 double ah = alphas( muh, m_gvars );
986 double ai = alphas( mui, m_gvars );
987 double answer = ( ah - ai ) / ( 8.0 * M_PI ) *
988 ( m_Gamma1 / m_beta0 -
989 m_beta1 * m_Gamma0 / ( m_beta0 * m_beta0 ) );
990 return answer;
991}
992
993double EvtVubBLNPHybrid::alphas( double mu, const std::vector<double>& vars )
994{
995 // Note: Lambda4 and Lambda5 depend on mbMS = 4.25
996 // So if you change mbMS, then you will have to recalculate them.
997
998 double beta0 = vars[8];
999 double beta1 = vars[9];
1000 double beta2 = vars[10];
1001
1002 double Lambda4 = 0.298791;
1003 double lg = 2 * log( mu / Lambda4 );
1004 double answer = 4 * M_PI / ( beta0 * lg ) *
1005 ( 1 - beta1 * log( lg ) / ( beta0 * beta0 * lg ) +
1006 beta1 * beta1 / ( beta0 * beta0 * beta0 * beta0 * lg * lg ) *
1007 ( ( log( lg ) - 0.5 ) * ( log( lg ) - 0.5 ) -
1008 5.0 / 4.0 + beta2 * beta0 / ( beta1 * beta1 ) ) );
1009 return answer;
1010}
1011
1012double EvtVubBLNPHybrid::PolyLog( double v, double z )
1013{
1014 if ( z >= 1 )
1015 cout << "Error in EvtVubBLNPHybrid: 2nd argument to PolyLog is >= 1."
1016 << endl;
1017
1018 double sum = 0.0;
1019 for ( int k = 1; k < 101; k++ ) {
1020 sum = sum + pow( z, k ) / pow( k, v );
1021 }
1022 return sum;
1023}
1024
1025double EvtVubBLNPHybrid::Gamma( double z )
1026{
1027 if ( z <= 0 )
1028 return 0;
1029
1030 double v = lgamma( z );
1031 return exp( v );
1032}
1033
1034double EvtVubBLNPHybrid::Gamma( double a, double x )
1035{
1036 double LogGamma;
1037 /* if (x<0.0 || a<= 0.0) raise(SIGFPE);*/
1038 if ( x < 0.0 )
1039 x = 0.0;
1040 if ( a <= 0.0 )
1041 a = 1.e-50;
1042 LogGamma = lgamma( a );
1043 if ( x < ( a + 1.0 ) )
1044 return gamser( a, x, LogGamma );
1045 else
1046 return 1.0 - gammcf( a, x, LogGamma );
1047}
1048
1049/* ------------------Incomplete gamma function-----------------*/
1050/* ------------------via its series representation-------------*/
1051
1052double EvtVubBLNPHybrid::gamser( double a, double x, double LogGamma )
1053{
1054 double n;
1055 double ap, del, sum;
1056
1057 ap = a;
1058 del = sum = 1.0 / a;
1059 for ( n = 1; n < ITMAX; n++ ) {
1060 ++ap;
1061 del *= x / ap;
1062 sum += del;
1063 if ( fabs( del ) < fabs( sum ) * EPS )
1064 return sum * exp( -x + a * log( x ) - LogGamma );
1065 }
1066 raise( SIGFPE );
1067
1068 return 0.0;
1069}
1070
1071/* ------------------Incomplete gamma function complement------*/
1072/* ------------------via its continued fraction representation-*/
1073
1074double EvtVubBLNPHybrid::gammcf( double a, double x, double LogGamma )
1075{
1076 double an, b, c, d, del, h;
1077 int i;
1078
1079 b = x + 1.0 - a;
1080 c = 1.0 / FPMIN;
1081 d = 1.0 / b;
1082 h = d;
1083 for ( i = 1; i < ITMAX; i++ ) {
1084 an = -i * ( i - a );
1085 b += 2.0;
1086 d = an * d + b;
1087 if ( fabs( d ) < FPMIN )
1088 d = FPMIN;
1089 c = b + an / c;
1090 if ( fabs( c ) < FPMIN )
1091 c = FPMIN;
1092 d = 1.0 / d;
1093 del = d * c;
1094 h *= del;
1095 if ( fabs( del - 1.0 ) < EPS )
1096 return exp( -x + a * log( x ) - LogGamma ) * h;
1097 }
1098 raise( SIGFPE );
1099
1100 return 0.0;
1101}
1102
1104{
1105 double ranNum = EvtRandom::Flat();
1106 double oOverBins = 1.0 / ( float( m_pf.size() ) );
1107 int nBinsBelow = 0; // largest k such that I[k] is known to be <= rand
1108 int nBinsAbove = m_pf.size(); // largest k such that I[k] is known to be > rand
1109 int middle;
1110
1111 while ( nBinsAbove > nBinsBelow + 1 ) {
1112 middle = ( nBinsAbove + nBinsBelow + 1 ) >> 1;
1113 if ( ranNum >= m_pf[middle] ) {
1114 nBinsBelow = middle;
1115 } else {
1116 nBinsAbove = middle;
1117 }
1118 }
1119
1120 double bSize = m_pf[nBinsAbove] - m_pf[nBinsBelow];
1121 // binMeasure is always aProbFunc[nBinsBelow],
1122
1123 if ( bSize == 0 ) {
1124 // rand lies right in a bin of measure 0. Simply return the center
1125 // of the range of that bin. (Any value between k/N and (k+1)/N is
1126 // equally good, in this rare case.)
1127 return ( nBinsBelow + .5 ) * oOverBins;
1128 }
1129
1130 double bFract = ( ranNum - m_pf[nBinsBelow] ) / bSize;
1131
1132 return ( nBinsBelow + bFract ) * oOverBins;
1133}
1134
1135double EvtVubBLNPHybrid::getWeight( double mX, double q2, double El )
1136{
1137 int ibin_mX = -1;
1138 int ibin_q2 = -1;
1139 int ibin_El = -1;
1140
1141 for ( unsigned i = 0; i < m_bins_mX.size(); i++ ) {
1142 if ( mX >= m_bins_mX[i] )
1143 ibin_mX = i;
1144 }
1145 for ( unsigned i = 0; i < m_bins_q2.size(); i++ ) {
1146 if ( q2 >= m_bins_q2[i] )
1147 ibin_q2 = i;
1148 }
1149 for ( unsigned i = 0; i < m_bins_El.size(); i++ ) {
1150 if ( El >= m_bins_El[i] )
1151 ibin_El = i;
1152 }
1153 int ibin = ibin_mX + ibin_q2 * m_bins_mX.size() +
1154 ibin_El * m_bins_mX.size() * m_bins_q2.size();
1155
1156 if ( ( ibin_mX < 0 ) || ( ibin_q2 < 0 ) || ( ibin_El < 0 ) ) {
1157 EvtGenReport( EVTGEN_ERROR, "EvtVubHybrid" )
1158 << "Cannot determine hybrid weight "
1159 << "for this event "
1160 << "-> assign weight = 0" << endl;
1161 return 0.0;
1162 }
1163
1164 return m_weights[ibin];
1165}
1166
1168{
1169 m_weights.resize( m_nbins );
1170
1171 double maxw = 0.0;
1172 for ( auto& w : m_weights ) {
1173 w = getArg( startArg++ );
1174 if ( w > maxw )
1175 maxw = w;
1176 }
1177
1178 if ( maxw == 0 ) {
1179 EvtGenReport( EVTGEN_ERROR, "EvtVubBLNPHybrid" )
1180 << "EvtVub generator expected at least one "
1181 << " weight > 0, but found none! "
1182 << "Will terminate execution!" << endl;
1183 ::abort();
1184 }
1185
1186 // rescale weights (to be in range 0..1)
1187 for ( auto& w : m_weights )
1188 w /= maxw;
1189}
EvtComplex exp(const EvtComplex &c)
double abs(const EvtComplex &c)
const double a2
const double a1
std::ostream & EvtGenReport(EvtGenSeverity severity, const char *facility=nullptr)
Definition EvtReport.cpp:32
@ EVTGEN_WARNING
Definition EvtReport.hh:50
@ EVTGEN_ERROR
Definition EvtReport.hh:49
#define ITMAX
#define FPMIN
#define EPS
EvtDecayBase()=default
int getNDaug() const
int getNArg() const
double getArg(unsigned int j)
EvtId getDaug(int i) const
void checkNDaug(int d1, int d2=-1)
const EvtId * getDaugs() const
double evaluate(double lower, double upper) const
double getSFBLNP(const double &what)
Definition EvtPFermi.cpp:67
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
double initializePhaseSpace(size_t numdaughter, const EvtId *daughters, bool forceResetMasses=false, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
EvtParticle * getDaug(const int i)
double mass() const
static double Flat()
Definition EvtRandom.cpp:95
void set(int i, double d)
std::vector< double > m_bins_q2
double S2(double a1, double r)
static double Gamma(double z)
double myfunction(double w, double Lbar, double mom2)
static double g2(double w, const std::vector< double > &vars)
static double Shat(double w, const std::vector< double > &vars)
double F2(double Pp, double Pm, double muh, double mui, double mubar, double done3)
static double Int2(double what, const std::vector< double > &vars)
static double g1(double w, const std::vector< double > &vars)
void decay(EvtParticle *Bmeson) override
std::string getName() const override
static double gammcf(double a, double x, double LogGamma)
double rate3(double Pp, double Pl, double Pm)
double u(double w)
double aGamma(double mu1, double mu2, double epsilon)
double DoneJS(double Pp, double Pm, double mui)
double S0(double a1, double r)
double S1(double a1, double r)
static double Mzero(double muf, double mu, double mupisq, const std::vector< double > &vars)
static double alphas(double mu, const std::vector< double > &vars)
double Done2(double Pp, double Pm, double mui)
double myfunctionBIK(double w, double Lbar, double mom2)
void readWeights(int startArg=0)
std::vector< double > m_bins_El
static double Int1(double what, const std::vector< double > &vars)
double anlo(double muh, double mui)
std::vector< double > m_pf
double U1lo(double muh, double mui)
std::vector< double > m_bins_mX
double Done3(double Pp, double Pm, double mui)
EvtDecayBase * clone() const override
double alo(double muh, double mui)
std::vector< double > m_weights
double dU1nlo(double muh, double mui)
void init() override
double t(double w)
double Done1(double Pp, double Pm, double mui)
double PolyLog(double v, double z)
static double gamser(double a, double x, double LogGamma)
static double Int3(double what, const std::vector< double > &vars)
double Sfun(double mu1, double mu2, double epsilon)
static double g3(double w, const std::vector< double > &vars)
double agp(double mu1, double mu2, double epsilon)
std::vector< double > m_gvars
double F1(double Pp, double Pm, double muh, double mui, double mubar, double doneJS, double done1)
double wS(double w)
void initProbMax() override
double F3(double Pp, double Pm, double muh, double mui, double mubar, double done2)
double getWeight(double mX, double q2, double El)
static double IntJS(double what, const std::vector< double > &vars)
double v(double w)