5 #include "EvtGenBase/EvtParticle.hh"
7 #include "EvtGenBase/EvtMTree.hh"
8 #include "EvtGenBase/EvtConst.hh"
9 #include "EvtGenBase/EvtKine.hh"
10 #include "EvtGenBase/EvtReport.hh"
12 // Make sure to include Lineshapes here
13 #include "EvtGenBase/EvtMTrivialLS.hh"
14 #include "EvtGenBase/EvtMBreitWigner.hh"
16 // Make sure to include Parametrizations
17 #include "EvtGenBase/EvtMHelAmp.hh"
21 EvtMTree::EvtMTree( const EvtId * idtbl, unsigned int ndaug )
23 for( size_t i=0; i<ndaug; ++i ) {
24 _lbltbl.push_back( EvtPDL::name( idtbl[i] ) );
30 for(size_t i=0; i<_root.size(); ++i) delete _root[i];
33 bool EvtMTree::parsecheck( char arg, const string& chars )
37 for(size_t i=0; i<chars.size(); ++i) {
38 ret = ret || (chars[i]==arg);
44 vector<EvtMNode *> EvtMTree::makeparticles( const string& strid )
46 vector<EvtMNode *> particles;
49 for( size_t i = 0; i<_lbltbl.size(); ++i ) {
50 if( _lbltbl[i] == strid ) labels.push_back( i );
53 if( labels.size() == 0 ) {
54 report(ERROR,"EvtGen")<<"Error unknown particle label "<<strid<<endl;
58 for( size_t i = 0; i<labels.size(); ++i )
59 particles.push_back( new EvtMParticle( labels[i], EvtPDL::getId( strid ) ) );
64 EvtMRes * EvtMTree::makeresonance( const EvtId& id, const string& ls,
65 const vector<string>& lsarg, const string& type,
66 const vector<EvtComplex>& amps, const vector<EvtMNode *>& children )
68 EvtMRes * resonance = NULL;
69 EvtMLineShape * lineshape = NULL;
71 if( ls=="BREITWIGNER" ) {
72 lineshape = new EvtMBreitWigner( id, lsarg );
73 } else if( ls=="TRIVIAL" ) {
74 lineshape = new EvtMTrivialLS( id, lsarg );
76 report(ERROR,"EvtGen")<<"Lineshape "<<lineshape
77 <<" not recognized."<<endl;
81 if( type=="HELAMP" ) {
82 resonance = new EvtMHelAmp( id, lineshape, children, amps );
84 report(ERROR,"EvtGen")<<"Model "<<type<<" not recognized."<<endl;
88 lineshape->setres( resonance );
93 void EvtMTree::parseerror( bool flag, ptype& c_iter, ptype& c_begin,
100 while( c_begin != c_end ) {
101 if(c_begin == c_iter) {
111 report(ERROR,"EvtGen")<<"Parse error at: "<<error<<endl;
115 string EvtMTree::parseId( ptype& c_iter, ptype& c_begin, ptype& c_end )
119 while(c_iter != c_end) {
120 parseerror(parsecheck(*c_iter, ")[],"), c_iter, c_begin, c_end);
121 if( *c_iter == '(' ) {
133 string EvtMTree::parseKey( ptype& c_iter, ptype& c_begin, ptype& c_end )
137 while( *c_iter != ',' ) {
138 parseerror(c_iter==c_end || parsecheck(*c_iter, "()[]"),
139 c_iter, c_begin, c_end);
146 parseerror(c_iter == c_end, c_iter, c_begin, c_end);
151 vector<string> EvtMTree::parseArg( ptype &c_iter, ptype &c_begin, ptype &c_end )
155 if( *c_iter != '[' ) return arg;
160 parseerror( c_iter == c_end || parsecheck(*c_iter, "[()"),
161 c_iter, c_begin, c_end );
163 if( *c_iter == ']' ) {
165 if(temp.size() > 0) arg.push_back( temp );
169 if( *c_iter == ',') {
170 arg.push_back( temp );
179 parseerror(c_iter == c_end || *c_iter != ',', c_iter, c_begin, c_end);
185 vector<EvtComplex> EvtMTree::parseAmps( ptype &c_iter,
186 ptype &c_begin, ptype &c_end )
188 vector<string> parg = parseArg( c_iter, c_begin, c_end );
189 parseerror( parg.size() == 0, c_iter, c_begin, c_end );
191 // Get parametrization amplitudes
192 vector<string>::iterator amp_iter = parg.begin();
193 vector<string>::iterator amp_end = parg.end();
194 vector<EvtComplex> amps;
196 while( amp_iter != amp_end ) {
198 char * endptr = NULL;
199 double amp=0.0, phase=0.0;
201 nptr = (*amp_iter).c_str();
202 amp = strtod(nptr, &endptr);
203 parseerror( nptr==endptr, c_iter, c_begin, c_end );
206 parseerror( amp_iter == amp_end, c_iter, c_begin, c_end );
208 nptr = (*amp_iter).c_str();
209 phase = strtod(nptr, &endptr);
210 parseerror( nptr==endptr, c_iter, c_begin, c_end );
212 amps.push_back( amp*exp(EvtComplex(0.0, phase)) );
220 vector<EvtMNode *> EvtMTree::duplicate( const vector<EvtMNode *>& list ) const
222 vector<EvtMNode *> newlist;
224 for(size_t i=0; i<list.size(); ++i)
225 newlist.push_back( list[i]->duplicate() );
230 // XXX Warning it is unsafe to use cl1 after a call to this function XXX
231 vector< vector<EvtMNode * > > EvtMTree::unionChildren( const string& nodestr,
232 vector< vector<EvtMNode * > >& cl1 )
234 vector<EvtMNode *> cl2 = parsenode( nodestr, false );
235 vector< vector<EvtMNode * > > cl;
237 if( cl1.size() == 0 ) {
238 for( size_t i=0; i<cl2.size(); ++i ) {
239 vector<EvtMNode *> temp(1, cl2[i]);
240 cl.push_back( temp );
246 for( size_t i=0; i<cl1.size(); ++i ) {
247 for( size_t j=0; j<cl2.size(); ++j ) {
248 vector<EvtMNode *> temp;
249 temp = duplicate( cl1[i] );
250 temp.push_back( cl2[j]->duplicate() );
252 cl.push_back( temp );
256 for(size_t i=0; i<cl1.size(); ++i)
257 for(size_t j=0; j<cl1[i].size(); ++j)
259 for(size_t i=0; i<cl2.size(); ++i)
265 vector< vector<EvtMNode * > > EvtMTree::parseChildren( ptype &c_iter,
266 ptype &c_begin, ptype &c_end )
271 vector< vector<EvtMNode * > > children;
273 parseerror(c_iter == c_end || *c_iter != '[', c_iter, c_begin, c_end );
277 parseerror( c_iter==c_end || pcount < 0, c_iter, c_begin, c_end );
290 children = unionChildren( nodestr, children );
298 children = unionChildren( nodestr, children );
315 vector<EvtMNode *> EvtMTree::parsenode( const string& args, bool rootnode )
317 ptype c_iter, c_begin, c_end;
319 c_iter=c_begin=args.begin();
322 string strid = parseId( c_iter, c_begin, c_end );
325 if( c_iter == c_end ) return makeparticles( strid );
327 // Case 2: Resonance - parse further
328 EvtId id = EvtPDL::getId(strid);
329 parseerror(EvtId( -1, -1 )==id, c_iter, c_begin, c_end);
332 vector<string> lsarg;
337 // Get lineshape (e.g. BREITWIGNER)
338 ls = parseKey( c_iter, c_begin, c_end );
339 lsarg = parseArg( c_iter, c_begin, c_end );
342 // Get resonance parametrization type (e.g. HELAMP)
343 string type = parseKey( c_iter, c_begin, c_end );
344 vector<EvtComplex> amps = parseAmps( c_iter, c_begin, c_end );
347 vector<vector<EvtMNode * > > children = parseChildren( c_iter, c_begin,
350 report(ERROR,"EvtGen")<<children.size()<<endl;
351 vector<EvtMNode *> resonances;
352 for(size_t i=0; i<children.size(); ++i ) {
353 resonances.push_back(makeresonance(id,ls,lsarg,type,amps,children[i]));
356 parseerror(c_iter == c_end || *c_iter!=')', c_iter, c_begin, c_end);
361 bool EvtMTree::validTree( const EvtMNode * root ) const
363 vector<int> res = root->getresonance();
364 vector<bool> check(res.size(), false);
366 for( size_t i=0; i<res.size(); ++i) {
367 check[res[i]] = true;
372 for( size_t i=0; i<check.size(); ++i ) {
379 void EvtMTree::addtree( const string& str )
381 vector<EvtMNode *> roots = parsenode( str, true );
384 for( size_t i=0; i<roots.size(); ++i ) {
385 if( validTree( roots[i] ) ) {
386 _root.push_back( roots[i] );
392 _norm = 1.0/sqrt(_norm);
394 EvtSpinAmp EvtMTree::getrotation( EvtParticle * p ) const
396 // Set up the rotation matrix for the root particle (for now)
397 EvtSpinDensity sd = p->rotateToHelicityBasis();
398 EvtSpinType::spintype type = EvtPDL::getSpinType(_root[0]->getid());
399 int twospin = EvtSpinType::getSpin2(type);
401 vector<EvtSpinType::spintype> types(2, type);
402 EvtSpinAmp rot( types, EvtComplex(0.0, 0.0) );
403 vector<int> index = rot.iterallowedinit();
405 rot(index) = sd.get((index[0]+twospin)/2,(index[1]+twospin)/2);
406 } while( rot.iterateallowed( index ) );
411 EvtSpinAmp EvtMTree::amplitude( EvtParticle * p ) const
413 vector<EvtVector4R> product;
414 for(size_t i=0; i<p->getNDaug(); ++i)
415 product.push_back(p->getDaug(i)->getP4Lab());
417 if( _root.size() == 0 ) {
418 report(ERROR, "EvtGen")<<"No decay tree present."<<endl;
422 EvtSpinAmp amp = _root[0]->amplitude( product );
423 for( size_t i=1; i<_root.size(); ++i ) {
424 // Assume that helicity amplitude is returned
425 amp += _root[i]->amplitude( product );
432 // Do Rotation to Proper Frame
433 EvtSpinAmp newamp = getrotation( p );
434 newamp.extcont(amp, 1, 0);