21 for (
int i = 0; i < ndaug; ++i ) { _lbltbl.push_back(
EvtPDL::name( idtbl[i] ) ); }
25 for (
int i = 0; i < _root.size(); ++i )
delete _root[i];
28bool EvtMTree::parsecheck(
char arg,
const string& chars ) {
31 for (
int i = 0; i < chars.size(); ++i ) { ret = ret || ( chars[i] ==
arg ); }
36vector<EvtMNode*> EvtMTree::makeparticles(
const string& strid ) {
37 vector<EvtMNode*> particles;
40 for (
int i = 0; i < _lbltbl.size(); ++i )
42 if ( _lbltbl[i] == strid ) labels.push_back( i );
45 if ( labels.size() == 0 )
47 report(
ERROR,
"EvtGen" ) <<
"Error unknown particle label " << strid << endl;
51 for (
int i = 0; i < labels.size(); ++i )
52 particles.push_back(
new EvtMParticle( labels[i],
EvtPDL::getId( strid ) ) );
57EvtMRes* EvtMTree::makeresonance(
const EvtId&
id,
const string& ls,
58 const vector<string>& lsarg,
const string&
type,
59 const vector<EvtComplex>& amps,
60 const vector<EvtMNode*>& children ) {
61 EvtMRes* resonance = NULL;
62 EvtMLineShape* lineshape = NULL;
64 if ( ls ==
"BREITWIGNER" ) { lineshape =
new EvtMBreitWigner(
id, lsarg ); }
65 else if ( ls ==
"TRIVIAL" ) { lineshape =
new EvtMTrivialLS(
id, lsarg ); }
68 report(
ERROR,
"EvtGen" ) <<
"Lineshape " << lineshape <<
" not recognized." << endl;
72 if ( type ==
"HELAMP" ) { resonance =
new EvtMHelAmp(
id, lineshape, children, amps ); }
75 report(
ERROR,
"EvtGen" ) <<
"Model " << type <<
" not recognized." << endl;
79 lineshape->
setres( resonance );
89 while ( c_begin != c_end )
91 if ( c_begin == c_iter )
97 else error += *c_begin;
106string EvtMTree::parseId(
ptype& c_iter,
ptype& c_begin,
ptype& c_end ) {
109 while ( c_iter != c_end )
111 parseerror( parsecheck( *c_iter,
")[]," ), c_iter, c_begin, c_end );
112 if ( *c_iter ==
'(' )
125string EvtMTree::parseKey(
ptype& c_iter,
ptype& c_begin,
ptype& c_end ) {
128 while ( *c_iter !=
',' )
130 parseerror( c_iter == c_end || parsecheck( *c_iter,
"()[]" ), c_iter, c_begin, c_end );
137 parseerror( c_iter == c_end, c_iter, c_begin, c_end );
142vector<string> EvtMTree::parseArg(
ptype& c_iter,
ptype& c_begin,
ptype& c_end ) {
145 if ( *c_iter !=
'[' )
return arg;
151 parseerror( c_iter == c_end || parsecheck( *c_iter,
"[()" ), c_iter, c_begin, c_end );
153 if ( *c_iter ==
']' )
156 if ( temp.size() > 0 )
arg.push_back( temp );
160 if ( *c_iter ==
',' )
162 arg.push_back( temp );
171 parseerror( c_iter == c_end || *c_iter !=
',', c_iter, c_begin, c_end );
177vector<EvtComplex> EvtMTree::parseAmps(
ptype& c_iter,
ptype& c_begin,
ptype& c_end ) {
178 vector<string> parg = parseArg( c_iter, c_begin, c_end );
179 parseerror( parg.size() == 0, c_iter, c_begin, c_end );
182 vector<string>::iterator amp_iter = parg.begin();
183 vector<string>::iterator amp_end = parg.end();
184 vector<EvtComplex> amps;
186 while ( amp_iter != amp_end )
190 double amp = 0.0, phase = 0.0;
192 nptr = ( *amp_iter ).c_str();
193 amp = strtod( nptr, &endptr );
194 parseerror( nptr == endptr, c_iter, c_begin, c_end );
197 parseerror( amp_iter == amp_end, c_iter, c_begin, c_end );
199 nptr = ( *amp_iter ).c_str();
200 phase = strtod( nptr, &endptr );
201 parseerror( nptr == endptr, c_iter, c_begin, c_end );
203 amps.push_back( amp *
exp( EvtComplex( 0.0, phase ) ) );
211vector<EvtMNode*> EvtMTree::duplicate(
const vector<EvtMNode*>& list )
const {
212 vector<EvtMNode*> newlist;
214 for (
int i = 0; i < list.size(); ++i ) newlist.push_back( list[i]->duplicate() );
220vector<vector<EvtMNode*>> EvtMTree::unionChildren(
const string& nodestr,
221 vector<vector<EvtMNode*>>& cl1 ) {
222 vector<EvtMNode*> cl2 = parsenode( nodestr,
false );
223 vector<vector<EvtMNode*>> cl;
225 if ( cl1.size() == 0 )
227 for (
int i = 0; i < cl2.size(); ++i )
229 vector<EvtMNode*> temp( 1, cl2[i] );
230 cl.push_back( temp );
236 for (
int i = 0; i < cl1.size(); ++i )
238 for (
int j = 0; j < cl2.size(); ++j )
240 vector<EvtMNode*> temp;
241 temp = duplicate( cl1[i] );
242 temp.push_back( cl2[j]->duplicate() );
244 cl.push_back( temp );
248 for (
int i = 0; i < cl1.size(); ++i )
249 for (
int j = 0; j < cl1[i].size(); ++j )
delete cl1[i][j];
250 for (
int i = 0; i < cl2.size(); ++i )
delete ( cl2[i] );
255vector<vector<EvtMNode*>> EvtMTree::parseChildren(
ptype& c_iter,
ptype& c_begin,
260 vector<vector<EvtMNode*>> children;
262 parseerror( c_iter == c_end || *c_iter !=
'[', c_iter, c_begin, c_end );
267 parseerror( c_iter == c_end || pcount < 0, c_iter, c_begin, c_end );
282 children = unionChildren( nodestr, children );
285 else { nodestr += *c_iter; }
290 children = unionChildren( nodestr, children );
293 else { nodestr += *c_iter; }
295 default: nodestr += *c_iter;
break;
304vector<EvtMNode*> EvtMTree::parsenode(
const string& args,
bool rootnode ) {
305 ptype c_iter, c_begin, c_end;
307 c_iter = c_begin = args.begin();
310 string strid = parseId( c_iter, c_begin, c_end );
313 if ( c_iter == c_end )
return makeparticles( strid );
317 parseerror( EvtId( -1, -1 ) ==
id, c_iter, c_begin, c_end );
320 vector<string> lsarg;
322 if ( rootnode ) { ls =
"TRIVIAL"; }
326 ls = parseKey( c_iter, c_begin, c_end );
327 lsarg = parseArg( c_iter, c_begin, c_end );
331 string type = parseKey( c_iter, c_begin, c_end );
332 vector<EvtComplex> amps = parseAmps( c_iter, c_begin, c_end );
335 vector<vector<EvtMNode*>> children = parseChildren( c_iter, c_begin, c_end );
337 report(
ERROR,
"EvtGen" ) << children.size() << endl;
338 vector<EvtMNode*> resonances;
339 for (
int i = 0; i < children.size(); ++i )
340 { resonances.push_back( makeresonance(
id, ls, lsarg, type, amps, children[i] ) ); }
342 parseerror( c_iter == c_end || *c_iter !=
')', c_iter, c_begin, c_end );
348 vector<int> res =
root->getresonance();
349 vector<bool> check( res.size(),
false );
351 for (
int i = 0; i < res.size(); ++i ) { check[res[i]] =
true; }
355 for (
int i = 0; i < check.size(); ++i ) { ret = ret && check[i]; }
361 vector<EvtMNode*> roots = parsenode( str,
true );
364 for (
int i = 0; i < roots.size(); ++i )
366 if ( validTree( roots[i] ) )
368 _root.push_back( roots[i] );
371 else delete roots[i];
374 _norm = 1.0 / sqrt( _norm );
378 if ( _root.size() == 0 )
380 report(
ERROR,
"EvtGen" ) <<
"No decay tree present." << endl;
384 EvtSpinAmp amp = _root[0]->amplitude( product );
385 for (
int i = 1; i < _root.size(); ++i )
390 amp += _root[i]->amplitude( product );
EvtComplex exp(const EvtComplex &c)
double arg(const EvtComplex &c)
string::const_iterator ptype
ostream & report(Severity severity, const char *facility)
*************DOUBLE PRECISION m_pi *DOUBLE PRECISION m_HvecTau2 DOUBLE PRECISION m_HvClone2 DOUBLE PRECISION m_gamma1 DOUBLE PRECISION m_gamma2 DOUBLE PRECISION m_thet1 DOUBLE PRECISION m_thet2 INTEGER m_IFPHOT *COMMON c_Taupair $ !Spin Polarimeter vector first Tau $ !Spin Polarimeter vector second Tau $ !Clone Spin Polarimeter vector first Tau $ !Clone Spin Polarimeter vector second Tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning st tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !Random Euler angle for cloning nd tau $ !phi of HvecTau1 $ !theta of HvecTau1 $ !phi of HvecTau2 $ !theta of HvecTau2 $ !super key
EvtMTree(const EvtId *idtbl, int ndaug)
void addtree(const string &args)
EvtSpinAmp amplitude(const vector< EvtVector4R > &product) const
static std::string name(EvtId i)
static EvtId getId(const std::string &name)