File indexing completed on 2025-04-19 09:10:07
0001 #ifndef METOOLS_SpinCorrelations_Amplitude2_Tensor_H
0002 #define METOOLS_SpinCorrelations_Amplitude2_Tensor_H
0003
0004 #include <vector>
0005 #include <memory>
0006 #include "ATOOLS/Math/MyComplex.H"
0007 #include "METOOLS/SpinCorrelations/Amplitude2_Matrix.H"
0008 #include "METOOLS/Main/Spin_Structure.H"
0009 #include "ATOOLS/Phys/Particle.H"
0010 #include "ATOOLS/Math/Vector.H"
0011
0012 namespace METOOLS {
0013 class Decay_Matrix;
0014
0015
0016 class Amplitude2_Tensor {
0017 std::vector<Amplitude2_Tensor*>* p_next;
0018 Complex m_value;
0019 ATOOLS::Particle* p_part;
0020 size_t m_nhel;
0021
0022 Complex ContractRemaining(const std::vector<ATOOLS::Particle*> &parts,
0023 const std::vector<int> &permutation,
0024 size_t level,
0025 const std::vector<Spin_Amplitudes> &diagrams,
0026 std::vector<int> &spin_i, std::vector<int> &spin_j,
0027 double factor) const;
0028
0029 public:
0030 Amplitude2_Tensor(const std::vector<ATOOLS::Particle*>& parts, size_t level);
0031 Amplitude2_Tensor(const std::vector<ATOOLS::Particle*>& parts,
0032 size_t level,
0033 const std::vector<Spin_Amplitudes*>& diagrams,
0034 std::vector<int>& spin_i,
0035 std::vector<int>& spin_j);
0036 Amplitude2_Tensor(const std::vector<ATOOLS::Particle*>& parts,
0037 const std::vector<int>& permutation,
0038 size_t level,
0039 const std::vector<Spin_Amplitudes>& diagrams,
0040 std::vector<int>& spin_i, std::vector<int>& spin_j);
0041 Amplitude2_Tensor(const Amplitude2_Tensor& other);
0042 ~Amplitude2_Tensor();
0043
0044 void Contract(const Amplitude2_Matrix* D);
0045 Amplitude2_Matrix ReduceToMatrix(const ATOOLS::Particle* leftover) const;
0046 void Add(const Amplitude2_Tensor* amp, const Complex& factor);
0047 void Multiply(const Complex& factor);
0048
0049
0050
0051
0052
0053
0054 void Multiply(const Amplitude2_Matrix* D);
0055
0056
0057
0058
0059
0060 Complex Sum();
0061 Complex Trace() const;
0062 bool Contains(const ATOOLS::Particle* part) const;
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 std::pair<const int, const ATOOLS::Particle*> Search(int part_number, int level=1) const;
0074
0075
0076
0077
0078
0079
0080
0081 int NumberParticles(int num=0) const;
0082
0083
0084
0085
0086
0087 bool IsP_Next() const;
0088 void UpdateParticlePointers(const std::map<ATOOLS::Particle*,ATOOLS::Particle*>& pmap);
0089
0090 inline const std::vector<Amplitude2_Tensor*> Next() const {return *p_next;}
0091 inline const ATOOLS::Particle CurrentParticle() const { return *p_part; }
0092 inline const Complex Value() const { return m_value; }
0093 inline const size_t SpinDegreesofFreedom() const { return m_nhel; }
0094
0095 void Print(std::ostream& ostr, std::string label) const;
0096 friend std::ostream& operator<<(std::ostream&, const Amplitude2_Tensor&);
0097
0098 static bool SortCrit(const std::pair<ATOOLS::Particle*, size_t>& p1,
0099 const std::pair<ATOOLS::Particle*, size_t>& p2);
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128 void PolBasisTrafo(const std::vector<std::vector<std::vector<Complex> > >& coeff,
0129 const std::vector<std::vector<std::vector<Complex> > >& conj_coeff, int level=0,
0130 std::vector<std::vector<std::vector<Complex> > > coeff_tmp=std::vector<std::vector<std::vector<Complex> > >(),
0131 std::vector<std::vector<std::vector<Complex> > > conj_coeff_tmp=std::vector<std::vector<std::vector<Complex> > >(),
0132 Amplitude2_Tensor* old_amps=NULL);
0133 };
0134
0135 using Amplitude2_Tensor_SP = std::shared_ptr<METOOLS::Amplitude2_Tensor>;
0136 }
0137
0138
0139 #endif