File indexing completed on 2026-08-06 09:20:03
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #ifndef __EVTSPINAMP_HH__
0022 #define __EVTSPINAMP_HH__
0023
0024 #include "EvtGenBase/EvtComplex.hh"
0025 #include "EvtGenBase/EvtSpinType.hh"
0026
0027 #include <vector>
0028 using std::vector;
0029
0030 #include <cstdarg>
0031
0032 class EvtSpinAmp;
0033 EvtSpinAmp operator*( const EvtComplex&, const EvtSpinAmp& );
0034 EvtSpinAmp operator*( const EvtSpinAmp&, const EvtComplex& );
0035 EvtSpinAmp operator/( const EvtSpinAmp&, const EvtComplex& );
0036
0037 class EvtSpinAmp {
0038 friend EvtSpinAmp operator*( const EvtComplex&, const EvtSpinAmp& );
0039 friend EvtSpinAmp operator*( const EvtSpinAmp&, const EvtComplex& );
0040 friend EvtSpinAmp operator/( const EvtSpinAmp&, const EvtComplex& );
0041 friend std::ostream& operator<<( std::ostream&, const EvtSpinAmp& );
0042
0043 public:
0044 EvtSpinAmp(){};
0045 EvtSpinAmp( const vector<EvtSpinType::spintype>& );
0046 EvtSpinAmp( const vector<EvtSpinType::spintype>&, const EvtComplex& );
0047 EvtSpinAmp( const vector<EvtSpinType::spintype>&, const vector<EvtComplex>& );
0048 EvtSpinAmp( const EvtSpinAmp& );
0049
0050 ~EvtSpinAmp(){};
0051
0052
0053 EvtComplex& operator()( const vector<int>& );
0054 const EvtComplex& operator()( const vector<int>& ) const;
0055 EvtComplex& operator()( int, ... );
0056 const EvtComplex& operator()( int, ... ) const;
0057
0058 EvtSpinAmp& operator=( const EvtSpinAmp& );
0059
0060 EvtSpinAmp operator+( const EvtSpinAmp& ) const;
0061 EvtSpinAmp& operator+=( const EvtSpinAmp& );
0062
0063 EvtSpinAmp operator-( const EvtSpinAmp& ) const;
0064 EvtSpinAmp& operator-=( const EvtSpinAmp& );
0065
0066
0067 EvtSpinAmp operator*(const EvtSpinAmp&)const;
0068 EvtSpinAmp& operator*=( const EvtSpinAmp& );
0069
0070 EvtSpinAmp& operator*=( const EvtComplex& );
0071 EvtSpinAmp& operator/=( const EvtComplex& );
0072
0073
0074 void intcont( size_t, size_t );
0075 void extcont( const EvtSpinAmp&, int, int );
0076
0077
0078 void assign( const EvtComplex& val ) { _elem.assign( _elem.size(), val ); }
0079
0080
0081 size_t rank() const { return _twospin.size(); }
0082
0083
0084 const vector<unsigned int>& dims() const { return _twospin; }
0085
0086
0087
0088 void addspin( int twospin ) { _twospin.push_back( twospin ); }
0089 void setelem( const vector<EvtComplex>& elem ) { _elem = elem; }
0090
0091 bool iterate( vector<int>& index ) const;
0092 vector<int> iterinit() const;
0093
0094 bool allowed( const vector<int>& index ) const;
0095 bool iterateallowed( vector<int>& index ) const;
0096 vector<int> iterallowedinit() const;
0097
0098 private:
0099 void checkindexargs( const vector<int>& index ) const;
0100 void checktwospin( const vector<unsigned int>& twospin ) const;
0101 int findtrueindex( const vector<int>& index ) const;
0102 vector<unsigned int> calctwospin(
0103 const vector<EvtSpinType::spintype>& type ) const;
0104
0105 vector<EvtSpinType::spintype> _type;
0106 vector<unsigned int> _twospin;
0107 vector<EvtComplex> _elem;
0108 };
0109
0110 #endif