BOSS 6.6.4.p01
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtIntervalDecayAmp.hh
Go to the documentation of this file.
1//-----------------------------------------------------------------------
2// File and Version Information:
3// $Id: EvtIntervalDecayAmp.hh,v 1.1.1.2 2007/10/26 05:03:14 pingrg Exp $
4//
5// Environment:
6// This software is part of the EvtGen package developed jointly
7// for the BaBar and CLEO collaborations. If you use all or part
8// of it, please give an appropriate acknowledgement.
9//
10// Copyright Information:
11// Copyright (C) 1998 Caltech, UCSB
12//
13// Module creator:
14// Alexei Dvoretskii, Caltech, 2001-2002.
15//-----------------------------------------------------------------------
16
17// Decay model that uses the "amplitude on an interval"
18// templatization
19
20#ifndef EVT_INTERVAL_DECAY_AMP
21#define EVT_INTERVAL_DECAY_AMP
22
23#define VERBOSE true
24#include <iostream>
25#include <vector>
26#include <string>
30#include "EvtGenBase/EvtPdf.hh"
35#include "EvtGenBase/EvtPDL.hh"
37
38template <class T>
40
41public:
42
44 : _probMax(0.), _nScan(0), _fact(0)
45 {}
46
48 : _probMax(other._probMax), _nScan(other._nScan),
50 {}
51
53 {
54 delete _fact;
55 }
56
57
58 // Initialize model
59
60 virtual void init()
61 {
62 // Collect model parameters and parse them
63
64 vector<std::string> args;
65 int i;
66 for(i=0;i<getNArg();i++) args.push_back(getArgStr(i));
68 parser.parse(args);
69
70 // Create factory and interval
71
72 if(VERBOSE) report(INFO,"EvtGen") << "Create factory and interval" << std::endl;
73 _fact = createFactory(parser);
74
75
76 // Maximum PDF value over the Dalitz plot can be specified, or a scan
77 // can be performed.
78
79 _probMax = parser.pdfMax();
80 _nScan = parser.nScan();
81 if(VERBOSE) report(INFO,"EvtGen") << "Pdf maximum " << _probMax << std::endl;
82 if(VERBOSE) report(INFO,"EvtGen") << "Scan number " << _nScan << std::endl;
83 }
84
85
86 virtual void initProbMax()
87 {
88 if(0 == _nScan) {
89
91 else assert(0);
92 }
93 else {
94
95 double factor = 1.2; // increase maximum probability by 20%
96 EvtAmpPdf<T> pdf(*_fact->getAmp());
97 EvtPdfSum<T>* pc = _fact->getPC();
98 EvtPdfDiv<T> pdfdiv(pdf,*pc);
99 printf("Sampling %d points to find maximum\n",_nScan);
100 EvtPdfMax<T> x = pdfdiv.findMax(*pc,_nScan);
101 _probMax = factor * x.value();
102 printf("Found maximum %f\n",x.value());
103 printf("Increase to %f\n",_probMax);
105 }
106 }
107
108 virtual void decay(EvtParticle *p)
109 {
110 // Set things up in most general way
111
112 static EvtId B0=EvtPDL::getId("B0");
113 static EvtId B0B=EvtPDL::getId("anti-B0");
114 double t;
115 EvtId other_b;
116 EvtComplex ampl(0.,0.);
117
118 // Sample using pole-compensator pdf
119
120 EvtPdfSum<T>* pc = getPC();
121 _x = pc->randomPoint();
122
123 if(_fact->isCPModel()) {
124
125 EvtCPUtil::OtherB(p,t,other_b);
126 EvtComplex A = _fact->getAmp()->evaluate(_x);
127 EvtComplex Abar = _fact->getAmpConj()->evaluate(_x);
128 double dm = _fact->dm();
129
130 if (other_b==B0B) ampl=A*cos(dm*t/(2*EvtConst::c))+Abar*sin(dm*t/(2*EvtConst::c));
131 if (other_b==B0) ampl=A*cos(dm*t/(2*EvtConst::c))-Abar*sin(dm*t/(2*EvtConst::c));
132 }
133 else {
134
135 ampl = amplNonCP(_x);
136 }
137
138 // Pole-compensate
139
140 double comp = sqrt(pc->evaluate(_x));
141 assert(comp > 0);
142 vertex(ampl/comp);
143
144 // Now generate random angles, rotate and setup
145 // the daughters
146
147 std::vector<EvtVector4R> v = initDaughters(_x);
148
149 int N = p->getNDaug();
150 if(v.size() != N) {
151
152 report(INFO,"EvtGen") << "Number of daughters " << N << std::endl;
153 report(INFO,"EvtGen") << "Momentum vector size " << v.size() << std::endl;
154 assert(0);
155 }
156
157 int i;
158 for(i=0;i<N;i++){
159
160 p->getDaug(i)->init(getDaugs()[i],v[i]);
161 }
162 }
163
165 virtual std::vector<EvtVector4R> initDaughters(const T& p) const = 0;
166
167 // provide access to the decay point and to the amplitude of any decay point.
168 // this is used by EvtBtoKD3P:
169 const T & x() const {return _x;}
170 EvtComplex amplNonCP(const T & x) {return _fact->getAmp()->evaluate(x);}
171 EvtPdfSum<T>* getPC() {return _fact->getPC();}
172
173protected:
174 double _probMax; // Maximum probability
175 int _nScan; // Number of points for max prob DP scan
176 T _x; // Decay point
177
179};
180
181
182#endif
183
184
185
186
double sin(const BesAngle a)
Definition: BesAngle.h:210
double cos(const BesAngle a)
Definition: BesAngle.h:213
#define VERBOSE
#define COPY_PTR(X)
Definition: EvtMacros.hh:15
ostream & report(Severity severity, const char *facility)
Definition: EvtReport.cc:36
@ INFO
Definition: EvtReport.hh:52
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
Definition: KarLud.h:35
static void OtherB(EvtParticle *p, double &t, EvtId &otherb)
Definition: EvtCPUtil.cc:229
static const double c
Definition: EvtConst.hh:32
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
void setProbMax(double prbmx)
EvtId * getDaugs()
Definition: EvtDecayBase.hh:65
std::string getArgStr(int j)
Definition: EvtDecayBase.hh:75
Definition: EvtId.hh:27
EvtIntervalDecayAmp(const EvtIntervalDecayAmp< T > &other)
virtual void initProbMax()
virtual void decay(EvtParticle *p)
EvtPdfSum< T > * getPC()
EvtAmpFactory< T > * _fact
EvtComplex amplNonCP(const T &x)
virtual EvtAmpFactory< T > * createFactory(const EvtMultiChannelParser &parser)=0
virtual std::vector< EvtVector4R > initDaughters(const T &p) const =0
void parse(const char *file, const char *model)
static EvtId getId(const std::string &name)
Definition: EvtPDL.cc:287
virtual void init(EvtId part_n, const EvtVector4R &p4)=0
int getNDaug() const
Definition: EvtParticle.cc:125
EvtParticle * getDaug(int i)
Definition: EvtParticle.cc:85
virtual T randomPoint()
Definition: EvtPdfSum.hh:118
double evaluate(const T &p) const
Definition: EvtPdf.hh:65
EvtPdfMax< T > findMax(const EvtPdf< T > &pc, int N)
Definition: EvtPdf.hh:230
int t()
Definition: t.c:1