BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtDalitzResPdf.cc
Go to the documentation of this file.
1#include "EvtPatches.hh"
2/*******************************************************************************
3 * Project: BaBar detector at the SLAC PEP-II B-factory
4 * Package: EvtGenBase
5 * File: $Id: EvtDalitzResPdf.cc,v 1.1.1.2 2007/10/26 05:03:14 pingrg Exp $
6 * Author: Alexei Dvoretskii, dvoretsk@slac.stanford.edu, 2001-2002
7 *
8 * Copyright (C) 2002 Caltech
9 *******************************************************************************/
10
11#include "EvtConst.hh"
12#include "EvtDalitzCoord.hh"
13#include "EvtDalitzResPdf.hh"
14#include "EvtPatches.hh"
15#include "EvtRandom.hh"
16#include <cstdlib>
17#include <math.h>
18#include <stdio.h>
19using namespace EvtCyclic3;
20
21EvtDalitzResPdf::EvtDalitzResPdf( const EvtDalitzPlot& dp, double _m0, double _g0,
22 EvtCyclic3::Pair pair )
23 : EvtPdf<EvtDalitzPoint>(), _dp( dp ), _m0( _m0 ), _g0( _g0 ), _pair( pair ) {}
24
27 , _dp( other._dp )
28 , _m0( other._m0 )
29 , _g0( other._g0 )
30 , _pair( other._pair ) {}
31
33
35 assert( N != 0 );
36
37 EvtCyclic3::Pair i = _pair;
39
40 // Trapezoidal integral
41
42 double dh = ( _dp.qAbsMax( j ) - _dp.qAbsMin( j ) ) / ( (double)N );
43 double sum = 0;
44
45 int ii;
46 for ( ii = 1; ii < N; ii++ )
47 {
48
49 double x = _dp.qAbsMin( j ) + ii * dh;
50 double min = ( _dp.qMin( i, j, x ) - _m0 * _m0 ) / _m0 / _g0;
51 double max = ( _dp.qMax( i, j, x ) - _m0 * _m0 ) / _m0 / _g0;
52 double itg = 1 / EvtConst::pi * ( atan( max ) - atan( min ) );
53 sum += itg;
54 }
55 EvtValError ret( sum * dh, 0. );
56
57 return ret;
58}
59
61 // Random point generation must be done in a box encompassing the
62 // Dalitz plot
63
64 EvtCyclic3::Pair i = _pair;
66 double min = 1 / EvtConst::pi * atan( ( _dp.qAbsMin( i ) - _m0 * _m0 ) / _m0 / _g0 );
67 double max = 1 / EvtConst::pi * atan( ( _dp.qAbsMax( i ) - _m0 * _m0 ) / _m0 / _g0 );
68
69 int n = 0;
70 while ( n++ < 1000 )
71 {
72
73 double qj = EvtRandom::Flat( _dp.qAbsMin( j ), _dp.qAbsMax( j ) );
74 double r = EvtRandom::Flat( min, max );
75 double qi = tan( EvtConst::pi * r ) * _g0 * _m0 + _m0 * _m0;
76 EvtDalitzCoord x( i, qi, j, qj );
77 EvtDalitzPoint ret( _dp, x );
78 if ( ret.isValid() ) return ret;
79 }
80
81 // All generated points turned out to be outside of the Dalitz plot
82 // (in the outer box)
83
84 printf( "No point generated for dalitz plot after 1000 tries\n" );
85 abort();
86}
87
88double EvtDalitzResPdf::pdf( const EvtDalitzPoint& x ) const {
89 EvtCyclic3::Pair i = _pair;
90 double dq = x.q( i ) - _m0 * _m0;
91 return 1 / EvtConst::pi * _g0 * _m0 / ( dq * dq + _g0 * _g0 * _m0 * _m0 );
92}
93
94double EvtDalitzResPdf::pdfMaxValue() const { return 1 / ( EvtConst::pi * _g0 * _m0 ); }
const Int_t n
Double_t x[10]
#define min(a, b)
#define max(a, b)
static const double pi
Definition EvtConst.hh:27
bool isValid() const
EvtDalitzResPdf(const EvtDalitzPlot &dp, double m0, double g0, EvtCyclic3::Pair pairRes)
double pdfMaxValue() const
virtual double pdf(const EvtDalitzPoint &) const
virtual ~EvtDalitzResPdf()
virtual EvtDalitzPoint randomPoint()
virtual EvtValError compute_integral() const
Definition EvtPdf.hh:91
static double Flat()
Definition EvtRandom.cc:69
Index next(Index i)
Index other(Index i, Index j)