BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtSpinAmp Class Reference

#include <EvtSpinAmp.hh>

Public Member Functions

 EvtSpinAmp ()
 EvtSpinAmp (const vector< EvtSpinType::spintype > &twospin)
 EvtSpinAmp (const vector< EvtSpinType::spintype > &twospin, const EvtComplex &val)
 EvtSpinAmp (const vector< EvtSpinType::spintype > &twospin, const vector< EvtComplex > &elem)
 EvtSpinAmp (const EvtSpinAmp &)
 ~EvtSpinAmp ()
EvtComplexoperator() (const vector< int > &)
const EvtComplexoperator() (const vector< int > &) const
EvtComplexoperator() (int,...)
const EvtComplexoperator() (int,...) const
EvtSpinAmpoperator= (const EvtSpinAmp &)
EvtSpinAmp operator+ (const EvtSpinAmp &) const
EvtSpinAmpoperator+= (const EvtSpinAmp &)
EvtSpinAmp operator- (const EvtSpinAmp &) const
EvtSpinAmpoperator-= (const EvtSpinAmp &)
EvtSpinAmp operator* (const EvtSpinAmp &) const
EvtSpinAmpoperator*= (const EvtSpinAmp &)
EvtSpinAmpoperator*= (const EvtComplex &)
EvtSpinAmpoperator/= (const EvtComplex &)
void intcont (int, int)
void extcont (const EvtSpinAmp &, int, int)
void assign (const EvtComplex &val)
int rank () const
const vector< int > & dims () const
void addspin (int twospin)
void setelem (const vector< EvtComplex > &elem)
bool iterate (vector< int > &index) const
vector< int > iterinit () const
bool allowed (const vector< int > &index) const
bool iterateallowed (vector< int > &index) const
vector< int > iterallowedinit () const

Friends

EvtSpinAmp operator* (const EvtComplex &real, const EvtSpinAmp &cont)
EvtSpinAmp operator* (const EvtSpinAmp &cont, const EvtComplex &real)
EvtSpinAmp operator/ (const EvtSpinAmp &cont, const EvtComplex &real)
std::ostream & operator<< (std::ostream &os, const EvtSpinAmp &amp)

Detailed Description

Definition at line 17 of file EvtSpinAmp.hh.

Constructor & Destructor Documentation

◆ EvtSpinAmp() [1/5]

◆ EvtSpinAmp() [2/5]

EvtSpinAmp::EvtSpinAmp ( const vector< EvtSpinType::spintype > & twospin)

Definition at line 48 of file EvtSpinAmp.cc.

48 {
49 int num = 1;
50 _type = type;
51 _twospin = calctwospin( type );
52
53 for ( int i = 0; i < _twospin.size(); ++i ) num *= _twospin[i] + 1;
54
55 _elem = vector<EvtComplex>( num );
56}

◆ EvtSpinAmp() [3/5]

EvtSpinAmp::EvtSpinAmp ( const vector< EvtSpinType::spintype > & twospin,
const EvtComplex & val )

Definition at line 58 of file EvtSpinAmp.cc.

58 {
59 int num = 1;
60 _type = type;
61 _twospin = calctwospin( type );
62
63 for ( int i = 0; i < _twospin.size(); ++i ) num *= _twospin[i] + 1;
64
65 _elem = vector<EvtComplex>( num, val );
66}

◆ EvtSpinAmp() [4/5]

EvtSpinAmp::EvtSpinAmp ( const vector< EvtSpinType::spintype > & twospin,
const vector< EvtComplex > & elem )

Definition at line 68 of file EvtSpinAmp.cc.

69 {
70 int num = 1;
71
72 _type = type;
73 _twospin = calctwospin( type );
74 _elem = elem;
75
76 for ( int i = 0; i < _twospin.size(); ++i ) num *= _twospin[i] + 1;
77
78 if ( _elem.size() != num )
79 {
80 report( ERROR, "EvtGen" ) << "Wrong number of elements input:" << _elem.size() << " vs. "
81 << num << endl;
82 ::abort();
83 }
84}
ostream & report(Severity severity, const char *facility)
Definition EvtReport.cc:34
@ ERROR
Definition EvtReport.hh:49

◆ EvtSpinAmp() [5/5]

EvtSpinAmp::EvtSpinAmp ( const EvtSpinAmp & copy)

Definition at line 86 of file EvtSpinAmp.cc.

86 {
87 _twospin = copy._twospin;
88 _elem = copy._elem;
89 _type = copy._type;
90}
uint32_t copy(const node_t &list, uint32_t *dest, size_t max)
Definition node.cxx:60

◆ ~EvtSpinAmp()

EvtSpinAmp::~EvtSpinAmp ( )
inline

Definition at line 31 of file EvtSpinAmp.hh.

31{};

Member Function Documentation

◆ addspin()

void EvtSpinAmp::addspin ( int twospin)
inline

Definition at line 69 of file EvtSpinAmp.hh.

69{ _twospin.push_back( twospin ); }

◆ allowed()

bool EvtSpinAmp::allowed ( const vector< int > & index) const

Definition at line 328 of file EvtSpinAmp.cc.

328 {
329 if ( index.size() != _type.size() )
330 {
331 report( ERROR, "EvtGen" ) << "Wrong dimensino index input to allowed." << endl;
332 ::abort();
333 }
334
335 for ( int i = 0; i < index.size(); ++i )
336 {
337 switch ( _type[i] )
338 {
340 if ( abs( index[i] ) != 2 ) return false;
341 break;
343 report( ERROR, "EvtGen" ) << "EvMultibody currently cannot handle neutrinos." << endl;
344 ::abort();
345 default: break;
346 }
347 }
348
349 return true;
350}

Referenced by iterallowedinit(), and iterateallowed().

◆ assign()

void EvtSpinAmp::assign ( const EvtComplex & val)
inline

Definition at line 59 of file EvtSpinAmp.hh.

59{ _elem.assign( _elem.size(), val ); }

◆ dims()

const vector< int > & EvtSpinAmp::dims ( ) const
inline

Definition at line 65 of file EvtSpinAmp.hh.

65{ return _twospin; }

Referenced by EvtMultibody::decay().

◆ extcont()

void EvtSpinAmp::extcont ( const EvtSpinAmp & cont,
int a,
int b )

Definition at line 425 of file EvtSpinAmp.cc.

425 {
426 EvtSpinAmp ret = ( *this ) * cont;
427 ret.intcont( a, rank() + b );
428
429 *this = ret;
430}
EvtComplex cont(const EvtTensor4C &t1, const EvtTensor4C &t2)
int rank() const
Definition EvtSpinAmp.hh:62
void intcont(int, int)

Referenced by EvtMHelAmp::amplitude(), and EvtMultibody::decay().

◆ intcont()

void EvtSpinAmp::intcont ( int a,
int b )

Definition at line 367 of file EvtSpinAmp.cc.

367 {
368 int newrank = rank() - 2;
369 if ( newrank <= 0 )
370 {
371 report( ERROR, "EvtGen" ) << "EvtSpinAmp can't handle no indices" << endl;
372 ::abort();
373 }
374
375 if ( _twospin[a] != _twospin[b] )
376 {
377 report( ERROR, "EvtGen" ) << "Contaction called on indices of different dimension" << endl;
378 report( ERROR, "EvtGen" ) << "Called on " << _twospin[a] << " and " << _twospin[b] << endl;
379 ::abort();
380 }
381
382 vector<int> newtwospin( newrank );
383 vector<EvtSpinType::spintype> newtype( newrank );
384
385 for ( int i = 0, j = 0; i < _twospin.size(); ++i )
386 {
387 if ( i == a || i == b ) continue;
388
389 newtwospin[j] = _twospin[i];
390 newtype[j] = _type[i];
391 ++j;
392 }
393
394 EvtSpinAmp newamp( newtype );
395 vector<int> index( rank() ), newindex = newamp.iterinit();
396
397 for ( int i = 0; i < newrank; ++i ) newindex[i] = -newtwospin[i];
398
399 while ( true )
400 {
401
402 for ( int i = 0, j = 0; i < rank(); ++i )
403 {
404 if ( i == a || i == b ) continue;
405 index[i] = newindex[j];
406 ++j;
407 }
408
409 index[b] = index[a] = -_twospin[a];
410 newamp( newindex ) = ( *this )( index );
411 for ( int i = -_twospin[a] + 2; i <= _twospin[a]; i += 2 )
412 {
413 index[b] = index[a] = i;
414 newamp( newindex ) += ( *this )( index );
415 }
416
417 if ( !newamp.iterate( newindex ) ) break;
418 }
419
420 *this = newamp;
421}

Referenced by extcont().

◆ iterallowedinit()

vector< int > EvtSpinAmp::iterallowedinit ( ) const

Definition at line 360 of file EvtSpinAmp.cc.

360 {
361 vector<int> init = iterinit();
362 while ( !allowed( init ) ) { iterate( init ); }
363
364 return init;
365}
vector< int > iterinit() const
bool iterate(vector< int > &index) const
bool allowed(const vector< int > &index) const
InputRawInit init

Referenced by EvtMHelAmp::amplitude(), and EvtMultibody::decay().

◆ iterate()

bool EvtSpinAmp::iterate ( vector< int > & index) const

Definition at line 310 of file EvtSpinAmp.cc.

310 {
311 int last = _twospin.size() - 1;
312
313 index[0] += 2;
314 for ( int j = 0; j < last; ++j )
315 {
316 if ( index[j] > _twospin[j] )
317 {
318 index[j] = -_twospin[j];
319 index[j + 1] += 2;
320 }
321 }
322
323 return abs( index[last] ) <= _twospin[last];
324}

Referenced by intcont(), iterallowedinit(), iterateallowed(), operator*(), and operator<<.

◆ iterateallowed()

bool EvtSpinAmp::iterateallowed ( vector< int > & index) const

Definition at line 352 of file EvtSpinAmp.cc.

352 {
353 while ( true )
354 {
355 if ( !iterate( index ) ) return false;
356 if ( allowed( index ) ) return true;
357 }
358}

Referenced by EvtMHelAmp::amplitude(), and EvtMultibody::decay().

◆ iterinit()

vector< int > EvtSpinAmp::iterinit ( ) const

Definition at line 302 of file EvtSpinAmp.cc.

302 {
303 vector<int> init( _twospin.size() );
304
305 for ( int i = 0; i < _twospin.size(); ++i ) init[i] = -_twospin[i];
306
307 return init;
308}

Referenced by intcont(), iterallowedinit(), and operator<<.

◆ operator()() [1/4]

EvtComplex & EvtSpinAmp::operator() ( const vector< int > & index)

Definition at line 142 of file EvtSpinAmp.cc.

142 {
143 checkindexargs( index );
144
145 int trueindex = findtrueindex( index );
146 if ( trueindex >= _elem.size() )
147 {
148 report( ERROR, "EvtGen" ) << "indexing error " << trueindex << " " << _elem.size() << endl;
149 for ( int i = 0; i < _twospin.size(); ++i ) { report( ERROR, "" ) << _twospin[i] << " "; }
150 report( ERROR, "" ) << endl;
151
152 for ( int i = 0; i < index.size(); ++i ) { report( ERROR, "" ) << index[i] << " "; }
153 report( ERROR, "" ) << endl;
154
155 ::abort();
156 }
157
158 return _elem[trueindex];
159}

◆ operator()() [2/4]

const EvtComplex & EvtSpinAmp::operator() ( const vector< int > & index) const

Definition at line 161 of file EvtSpinAmp.cc.

161 {
162 checkindexargs( index );
163
164 int trueindex = findtrueindex( index );
165 if ( trueindex >= _elem.size() )
166 {
167 report( ERROR, "EvtGen" ) << "indexing error " << trueindex << " " << _elem.size() << endl;
168 for ( int i = 0; i < _twospin.size(); ++i ) { report( ERROR, "" ) << _twospin[i] << " "; }
169 report( ERROR, "" ) << endl;
170
171 for ( int i = 0; i < index.size(); ++i ) { report( ERROR, "" ) << index[i] << " "; }
172 report( ERROR, "" ) << endl;
173
174 ::abort();
175 }
176
177 return _elem[trueindex];
178}

◆ operator()() [3/4]

EvtComplex & EvtSpinAmp::operator() ( int i,
... )

Definition at line 180 of file EvtSpinAmp.cc.

180 {
181 va_list ap;
182 vector<int> index( _twospin.size() );
183
184 va_start( ap, i );
185
186 index[0] = i;
187 for ( int n = 1; n < _twospin.size(); ++n ) index[n] = va_arg( ap, int );
188
189 va_end( ap );
190
191 return ( *this )( index );
192}
const Int_t n

◆ operator()() [4/4]

const EvtComplex & EvtSpinAmp::operator() ( int i,
... ) const

Definition at line 194 of file EvtSpinAmp.cc.

194 {
195 vector<int> index( _twospin.size() );
196 va_list ap;
197
198 va_start( ap, i );
199
200 index[0] = i;
201 for ( int n = 1; n < _twospin.size(); ++n ) index[n] = va_arg( ap, int );
202
203 va_end( ap );
204
205 return ( *this )( index );
206}

◆ operator*()

EvtSpinAmp EvtSpinAmp::operator* ( const EvtSpinAmp & amp2) const

Definition at line 251 of file EvtSpinAmp.cc.

251 {
252 vector<int> index( rank() + amp2.rank() );
253 vector<int> index1( rank() ), index2( amp2.rank() );
254 EvtSpinAmp amp;
255
256 amp._twospin = _twospin;
257 amp._type = _type;
258
259 for ( int i = 0; i < amp2._twospin.size(); ++i )
260 {
261 amp._twospin.push_back( amp2._twospin[i] );
262 amp._type.push_back( amp2._type[i] );
263 }
264
265 amp._elem = vector<EvtComplex>( _elem.size() * amp2._elem.size() );
266
267 for ( int i = 0; i < index1.size(); ++i ) index[i] = index1[i] = -_twospin[i];
268
269 for ( int i = 0; i < index2.size(); ++i ) index[i + rank()] = index2[i] = -amp2._twospin[i];
270
271 while ( true )
272 {
273 amp( index ) = ( *this )(index1)*amp2( index2 );
274 if ( !amp.iterate( index ) ) break;
275
276 for ( int i = 0; i < index1.size(); ++i ) index1[i] = index[i];
277
278 for ( int i = 0; i < index2.size(); ++i ) index2[i] = index[i + rank()];
279 }
280
281 return amp;
282}

◆ operator*=() [1/2]

EvtSpinAmp & EvtSpinAmp::operator*= ( const EvtComplex & real)

Definition at line 290 of file EvtSpinAmp.cc.

290 {
291 for ( int i = 0; i < _elem.size(); ++i ) _elem[i] *= real;
292
293 return *this;
294}

◆ operator*=() [2/2]

EvtSpinAmp & EvtSpinAmp::operator*= ( const EvtSpinAmp & cont)

Definition at line 284 of file EvtSpinAmp.cc.

284 {
285 EvtSpinAmp ret = ( *this ) * cont;
286 *this = ret;
287 return *this;
288}

◆ operator+()

EvtSpinAmp EvtSpinAmp::operator+ ( const EvtSpinAmp & cont) const

Definition at line 216 of file EvtSpinAmp.cc.

216 {
217 checktwospin( cont._twospin );
218
219 EvtSpinAmp ret( cont );
220 for ( int i = 0; i < ret._elem.size(); ++i ) { ret._elem[i] += _elem[i]; }
221
222 return ret;
223}

◆ operator+=()

EvtSpinAmp & EvtSpinAmp::operator+= ( const EvtSpinAmp & cont)

Definition at line 225 of file EvtSpinAmp.cc.

225 {
226 checktwospin( cont._twospin );
227
228 for ( int i = 0; i < _elem.size(); ++i ) _elem[i] += cont._elem[i];
229
230 return *this;
231}

◆ operator-()

EvtSpinAmp EvtSpinAmp::operator- ( const EvtSpinAmp & cont) const

Definition at line 233 of file EvtSpinAmp.cc.

233 {
234 checktwospin( cont._twospin );
235
236 EvtSpinAmp ret( *this );
237 for ( int i = 0; i < ret._elem.size(); ++i ) ret._elem[i] -= cont._elem[i];
238
239 return ret;
240}

◆ operator-=()

EvtSpinAmp & EvtSpinAmp::operator-= ( const EvtSpinAmp & cont)

Definition at line 242 of file EvtSpinAmp.cc.

242 {
243 checktwospin( cont._twospin );
244
245 for ( int i = 0; i < _elem.size(); ++i ) _elem[i] -= cont._elem[i];
246
247 return *this;
248}

◆ operator/=()

EvtSpinAmp & EvtSpinAmp::operator/= ( const EvtComplex & real)

Definition at line 296 of file EvtSpinAmp.cc.

296 {
297 for ( int i = 0; i < _elem.size(); ++i ) _elem[i] /= real;
298
299 return *this;
300}

◆ operator=()

EvtSpinAmp & EvtSpinAmp::operator= ( const EvtSpinAmp & cont)

Definition at line 208 of file EvtSpinAmp.cc.

208 {
209 _twospin = cont._twospin;
210 _elem = cont._elem;
211 _type = cont._type;
212
213 return *this;
214}

◆ rank()

int EvtSpinAmp::rank ( ) const
inline

Definition at line 62 of file EvtSpinAmp.hh.

62{ return _twospin.size(); }

Referenced by EvtMultibody::decay(), extcont(), intcont(), and operator*().

◆ setelem()

void EvtSpinAmp::setelem ( const vector< EvtComplex > & elem)
inline

Definition at line 70 of file EvtSpinAmp.hh.

70{ _elem = elem; }

◆ operator* [1/2]

EvtSpinAmp operator* ( const EvtComplex & real,
const EvtSpinAmp & cont )
friend

Definition at line 21 of file EvtSpinAmp.cc.

21 {
22 EvtSpinAmp ret( cont );
23
24 for ( int i = 0; i < ret._elem.size(); ++i ) { ret._elem[i] *= real; }
25
26 return ret;
27}

◆ operator* [2/2]

EvtSpinAmp operator* ( const EvtSpinAmp & cont,
const EvtComplex & real )
friend

Definition at line 29 of file EvtSpinAmp.cc.

29{ return real * cont; }

◆ operator/

EvtSpinAmp operator/ ( const EvtSpinAmp & cont,
const EvtComplex & real )
friend

Definition at line 31 of file EvtSpinAmp.cc.

31 {
32 EvtSpinAmp ret( cont );
33
34 for ( int i = 0; i < ret._elem.size(); ++i ) { ret._elem[i] /= real; }
35
36 return ret;
37}

◆ operator<<

std::ostream & operator<< ( std::ostream & os,
const EvtSpinAmp & amp )
friend

Definition at line 8 of file EvtSpinAmp.cc.

8 {
9 vector<int> index = amp.iterinit();
10
11 os << ":";
12 do {
13 os << "<";
14 for ( int i = 0; i < index.size() - 1; ++i ) { os << index[i]; }
15 os << index[index.size() - 1] << ">" << amp( index ) << ":";
16 } while ( amp.iterate( index ) );
17
18 return os;
19}

The documentation for this class was generated from the following files: