#include #include #include #include "EvtGenBase/EvtParticle.hh" #include "EvtGenBase/EvtMTree.hh" #include "EvtGenBase/EvtConst.hh" #include "EvtGenBase/EvtKine.hh" #include "EvtGenBase/EvtReport.hh" // Make sure to include Lineshapes here #include "EvtGenBase/EvtMTrivialLS.hh" #include "EvtGenBase/EvtMBreitWigner.hh" // Make sure to include Parametrizations #include "EvtGenBase/EvtMHelAmp.hh" using std::endl; EvtMTree::EvtMTree( const EvtId * idtbl, unsigned int ndaug ) { for( size_t i=0; i EvtMTree::makeparticles( const string& strid ) { vector particles; vector labels; for( size_t i = 0; i<_lbltbl.size(); ++i ) { if( _lbltbl[i] == strid ) labels.push_back( i ); } if( labels.size() == 0 ) { report(ERROR,"EvtGen")<<"Error unknown particle label "<& lsarg, const string& type, const vector& amps, const vector& children ) { EvtMRes * resonance = NULL; EvtMLineShape * lineshape = NULL; if( ls=="BREITWIGNER" ) { lineshape = new EvtMBreitWigner( id, lsarg ); } else if( ls=="TRIVIAL" ) { lineshape = new EvtMTrivialLS( id, lsarg ); } else { report(ERROR,"EvtGen")<<"Lineshape "<setres( resonance ); return resonance; } void EvtMTree::parseerror( bool flag, ptype& c_iter, ptype& c_begin, ptype& c_end ) { if(!flag) return; string error; while( c_begin != c_end ) { if(c_begin == c_iter) { error+='_'; error+=*c_begin; error+='_'; } else error+=*c_begin; ++c_begin; } report(ERROR,"EvtGen")<<"Parse error at: "< EvtMTree::parseArg( ptype &c_iter, ptype &c_begin, ptype &c_end ) { vector arg; if( *c_iter != '[' ) return arg; ++c_iter; string temp; while(true) { parseerror( c_iter == c_end || parsecheck(*c_iter, "[()"), c_iter, c_begin, c_end ); if( *c_iter == ']' ) { ++c_iter; if(temp.size() > 0) arg.push_back( temp ); break; } if( *c_iter == ',') { arg.push_back( temp ); temp.clear(); ++c_iter; continue; } temp += *c_iter; ++c_iter; } parseerror(c_iter == c_end || *c_iter != ',', c_iter, c_begin, c_end); ++c_iter; return arg; } vector EvtMTree::parseAmps( ptype &c_iter, ptype &c_begin, ptype &c_end ) { vector parg = parseArg( c_iter, c_begin, c_end ); parseerror( parg.size() == 0, c_iter, c_begin, c_end ); // Get parametrization amplitudes vector::iterator amp_iter = parg.begin(); vector::iterator amp_end = parg.end(); vector amps; while( amp_iter != amp_end ) { const char * nptr; char * endptr = NULL; double amp=0.0, phase=0.0; nptr = (*amp_iter).c_str(); amp = strtod(nptr, &endptr); parseerror( nptr==endptr, c_iter, c_begin, c_end ); ++amp_iter; parseerror( amp_iter == amp_end, c_iter, c_begin, c_end ); nptr = (*amp_iter).c_str(); phase = strtod(nptr, &endptr); parseerror( nptr==endptr, c_iter, c_begin, c_end ); amps.push_back( amp*exp(EvtComplex(0.0, phase)) ); ++amp_iter; } return amps; } vector EvtMTree::duplicate( const vector& list ) const { vector newlist; for(size_t i=0; iduplicate() ); return newlist; } // XXX Warning it is unsafe to use cl1 after a call to this function XXX vector< vector > EvtMTree::unionChildren( const string& nodestr, vector< vector >& cl1 ) { vector cl2 = parsenode( nodestr, false ); vector< vector > cl; if( cl1.size() == 0 ) { for( size_t i=0; i temp(1, cl2[i]); cl.push_back( temp ); } return cl; } for( size_t i=0; i temp; temp = duplicate( cl1[i] ); temp.push_back( cl2[j]->duplicate() ); cl.push_back( temp ); } } for(size_t i=0; i > EvtMTree::parseChildren( ptype &c_iter, ptype &c_begin, ptype &c_end ) { bool test = true; int pcount=0; string nodestr; vector< vector > children; parseerror(c_iter == c_end || *c_iter != '[', c_iter, c_begin, c_end ); ++c_iter; while( test ) { parseerror( c_iter==c_end || pcount < 0, c_iter, c_begin, c_end ); switch( *c_iter ) { case ')': --pcount; nodestr += *c_iter; break; case '(': ++pcount; nodestr += *c_iter; break; case ']': if( pcount==0 ) { children = unionChildren( nodestr, children ); test=false; } else { nodestr += *c_iter; } break; case ',': if( pcount==0 ) { children = unionChildren( nodestr, children ); nodestr.clear(); } else { nodestr += *c_iter; } break; default: nodestr += *c_iter; break; } ++c_iter; } return children; } vector EvtMTree::parsenode( const string& args, bool rootnode ) { ptype c_iter, c_begin, c_end; c_iter=c_begin=args.begin(); c_end = args.end(); string strid = parseId( c_iter, c_begin, c_end ); // Case 1: Particle if( c_iter == c_end ) return makeparticles( strid ); // Case 2: Resonance - parse further EvtId id = EvtPDL::getId(strid); parseerror(EvtId( -1, -1 )==id, c_iter, c_begin, c_end); string ls; vector lsarg; if( rootnode ) { ls = "TRIVIAL"; } else { // Get lineshape (e.g. BREITWIGNER) ls = parseKey( c_iter, c_begin, c_end ); lsarg = parseArg( c_iter, c_begin, c_end ); } // Get resonance parametrization type (e.g. HELAMP) string type = parseKey( c_iter, c_begin, c_end ); vector amps = parseAmps( c_iter, c_begin, c_end ); // Children vector > children = parseChildren( c_iter, c_begin, c_end ); report(ERROR,"EvtGen")< resonances; for(size_t i=0; i res = root->getresonance(); vector check(res.size(), false); for( size_t i=0; i roots = parsenode( str, true ); _norm = 0; for( size_t i=0; irotateToHelicityBasis(); EvtSpinType::spintype type = EvtPDL::getSpinType(_root[0]->getid()); int twospin = EvtSpinType::getSpin2(type); vector types(2, type); EvtSpinAmp rot( types, EvtComplex(0.0, 0.0) ); vector index = rot.iterallowedinit(); do { rot(index) = sd.get((index[0]+twospin)/2,(index[1]+twospin)/2); } while( rot.iterateallowed( index ) ); return rot; } EvtSpinAmp EvtMTree::amplitude( EvtParticle * p ) const { vector product; for(size_t i=0; igetNDaug(); ++i) product.push_back(p->getDaug(i)->getP4Lab()); if( _root.size() == 0 ) { report(ERROR, "EvtGen")<<"No decay tree present."<amplitude( product ); for( size_t i=1; i<_root.size(); ++i ) { // Assume that helicity amplitude is returned amp += _root[i]->amplitude( product ); } amp = _norm*amp; //ryd return amp; // Do Rotation to Proper Frame EvtSpinAmp newamp = getrotation( p ); newamp.extcont(amp, 1, 0); return newamp; }