#ifndef __EVTSPINAMP_HH__ #define __EVTSPINAMP_HH__ #include "EvtGenBase/EvtSpinType.hh" #include "EvtGenBase/EvtComplex.hh" #include using std::vector; #include class EvtSpinAmp; EvtSpinAmp operator*( const EvtComplex&, const EvtSpinAmp& ); EvtSpinAmp operator*( const EvtSpinAmp&, const EvtComplex& ); EvtSpinAmp operator/( const EvtSpinAmp&, const EvtComplex& ); class EvtSpinAmp { friend EvtSpinAmp operator*( const EvtComplex&, const EvtSpinAmp& ); friend EvtSpinAmp operator*( const EvtSpinAmp&, const EvtComplex& ); friend EvtSpinAmp operator/( const EvtSpinAmp&, const EvtComplex& ); friend std::ostream& operator<< ( std::ostream&, const EvtSpinAmp& ); public: EvtSpinAmp( ) {}; EvtSpinAmp( const vector& ); EvtSpinAmp( const vector& , const EvtComplex& ); EvtSpinAmp( const vector& , const vector& ); EvtSpinAmp( const EvtSpinAmp & ); ~EvtSpinAmp( ) {}; // Input to the index functions are twice the magnetic quantum number EvtComplex& operator()( const vector& ); const EvtComplex& operator()( const vector& ) const; EvtComplex& operator()( int, ... ); const EvtComplex& operator()( int, ... ) const; EvtSpinAmp& operator=( const EvtSpinAmp& ); EvtSpinAmp operator+( const EvtSpinAmp& ) const; EvtSpinAmp& operator+=( const EvtSpinAmp& ); EvtSpinAmp operator-( const EvtSpinAmp& ) const; EvtSpinAmp& operator-=( const EvtSpinAmp& ); // Direct Product EvtSpinAmp operator*( const EvtSpinAmp& ) const; EvtSpinAmp& operator*=( const EvtSpinAmp& ); EvtSpinAmp& operator*=( const EvtComplex& ); EvtSpinAmp& operator/=( const EvtComplex& ); // Contraction of amplitudes void intcont( size_t, size_t ); void extcont( const EvtSpinAmp &, int, int ); // assign this value to every member in the container void assign( const EvtComplex & val ) { _elem.assign( _elem.size(), val ); } // get the order of the container size_t rank( ) const { return _twospin.size(); } // get the dimension vector of the container const vector & dims( ) const { return _twospin; } // set the elements and the dimensions of the vector - useful for something // things eventough it is usually not the cleanest solution void addspin( int twospin ) { _twospin.push_back( twospin ); } void setelem( const vector &elem ) { _elem = elem; } bool iterate( vector& index ) const; vector iterinit() const; bool allowed( const vector& index ) const; bool iterateallowed( vector& index) const; vector iterallowedinit() const; private: void checkindexargs( const vector& index ) const; void checktwospin( const vector& twospin ) const; int findtrueindex( const vector& index ) const; vector calctwospin( const vector& type ) const; vector _type; vector _twospin; vector _elem; }; #endif // __EVTSPINAMP__