LCOV - code coverage report
Current view: top level - PYTHIA8/pythia8210dev/include/Pythia8 - HelicityBasics.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 53 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 39 0.0 %

          Line data    Source code
       1             : // HelicityBasics.h is a part of the PYTHIA event generator.
       2             : // Copyright (C) 2015 Philip Ilten, Torbjorn Sjostrand.
       3             : // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
       4             : // Please respect the MCnet Guidelines, see GUIDELINES for details.
       5             : 
       6             : // Header file for a number of helper classes used in tau decays.
       7             : 
       8             : #ifndef Pythia8_HelicityBasics_H
       9             : #define Pythia8_HelicityBasics_H
      10             : 
      11             : #include "Pythia8/Basics.h"
      12             : #include "Pythia8/Event.h"
      13             : #include "Pythia8/PythiaComplex.h"
      14             : #include "Pythia8/PythiaStdlib.h"
      15             : 
      16             : namespace Pythia8 {
      17             : 
      18             : //==========================================================================
      19             : 
      20             : // The Wave4 class provides a class for complex four-vector wave functions.
      21             : // The Wave4 class can be multiplied with the GammaMatrix class to allow
      22             : // for the writing of helicity matrix elements.
      23             : 
      24             : class Wave4 {
      25             : 
      26             : public:
      27             : 
      28             :   // Constructors and destructor.
      29           0 :   Wave4() {};
      30           0 :   Wave4(complex v0, complex v1, complex v2, complex v3) {val[0] = v0;
      31           0 :     val[1] = v1; val[2] = v2; val[3] = v3;}
      32           0 :   Wave4(Vec4 v) {val[0] = v.e(); val[1] = v.px(); val[2] = v.py();
      33           0 :     val[3] = v.pz();}
      34           0 :   ~Wave4() {};
      35             : 
      36             :   // Access an element of the wave vector.
      37           0 :   complex& operator() (int i) {return val[i];}
      38             : 
      39             :   // Wave4 + Wave4.
      40           0 :   Wave4 operator+(Wave4 w) {return Wave4( val[0] + w.val[0],
      41           0 :     val[1] + w.val[1], val[2] + w.val[2], val[3] + w.val[3]);}
      42             : 
      43             :   // Wave4 - Wave4.
      44           0 :   Wave4 operator-(Wave4 w) {return Wave4( val[0] - w.val[0],
      45           0 :     val[1] - w.val[1], val[2] - w.val[2], val[3] - w.val[3]);}
      46             : 
      47             :   // - Wave4.
      48             :   Wave4 operator-() {return Wave4(-val[0], -val[1], -val[2], -val[3]);}
      49             : 
      50             :   // Wave4 * Wave4.
      51           0 :   complex operator*(Wave4 w) {return val[0] * w.val[0]
      52           0 :     + val[1] * w.val[1] + val[2] * w.val[2] + val[3] * w.val[3];}
      53             : 
      54             :   // Wave4 * complex.
      55           0 :   Wave4 operator*(complex s) {return Wave4(val[0] * s, val[1] * s,
      56           0 :     val[2] * s, val[3] * s);}
      57             : 
      58             :   // complex * Wave4.
      59             :   friend Wave4 operator*(complex s, const Wave4& w);
      60             : 
      61             :   // Wave4 * double.
      62           0 :   Wave4 operator*(double s) {return Wave4(val[0] * s, val[1] * s,
      63           0 :     val[2] * s, val[3] * s);}
      64             : 
      65             :   // double * Wave4.
      66             :   friend Wave4 operator*(double s, const Wave4& w);
      67             : 
      68             :   // Wave4 / complex.
      69           0 :   Wave4 operator/(complex s) {return Wave4(val[0] / s, val[1] / s,
      70           0 :     val[2] / s, val[3] / s);}
      71             : 
      72             :   // Wave4 / double.
      73             :   Wave4 operator/(double s) {return Wave4(val[0] / s, val[1] / s,
      74             :     val[2]/s, val[3]/s);}
      75             : 
      76             :   // Complex conjugate.
      77             :   friend Wave4 conj(Wave4 w);
      78             : 
      79             :   // Permutation operator.
      80             :   friend Wave4 epsilon(Wave4 w1, Wave4 w2, Wave4 w3);
      81             : 
      82             :   // Invariant squared mass for REAL Wave4 (to save time).
      83             :   friend double m2(Wave4 w);
      84             :   friend double m2(Wave4 w1, Wave4 w2);
      85             : 
      86             :   // Wave4 * GammaMatrix multiplication is defined in the GammaMatrix class.
      87             : 
      88             :   // Print a Wave4 vector.
      89             :   friend ostream& operator<<(ostream& output, Wave4 w);
      90             : 
      91             : protected:
      92             : 
      93             :   complex val[4];
      94             : 
      95             : };
      96             : 
      97             : //--------------------------------------------------------------------------
      98             : 
      99             : // Namespace function declarations; friends of Wave4 class.
     100             : Wave4 operator*(complex s, const Wave4& w);
     101             : Wave4 operator*(double s, const Wave4& w);
     102             : Wave4 conj(Wave4 w);
     103             : Wave4 epsilon(Wave4 w1, Wave4 w2, Wave4 w3);
     104             : double m2(Wave4 w);
     105             : double m2(Wave4 w1, Wave4 w2);
     106             : ostream& operator<< (ostream& os, Wave4 w);
     107             : 
     108             : //==========================================================================
     109             : 
     110             : // The GammaMatrix class is a special sparse matrix class used to write
     111             : // helicity matrix elements in conjuction with the Wave4 class. Note that
     112             : // only left to right multplication of Wave4 vectors with the GammaMatrix
     113             : // class is allowed. Additionally, subtracting a scalar from a GammaMatrix
     114             : // (or subtracting a GammaMatrix from a scalar) subtracts the scalar from
     115             : //each non-zero element of the GammaMatrix. This is designed specifically
     116             : // with the (1 - gamma^5) structure of matrix elements in mind.
     117             : 
     118             : class GammaMatrix {
     119             : 
     120             : public:
     121             : 
     122             :   // Constructors and destructor.
     123             :   GammaMatrix() {};
     124             :   GammaMatrix(int mu);
     125           0 :   ~GammaMatrix() {};
     126             : 
     127             :   // Access an element of the matrix.
     128           0 :   complex& operator() (int I, int J) {if (index[J] == I) return val[J];
     129           0 :     else return COMPLEXZERO; }
     130             : 
     131             :   // Wave4 * GammaMatrix.
     132             :   friend Wave4 operator*(Wave4 w, GammaMatrix g);
     133             : 
     134             :   // GammaMatrix * Scalar.
     135             :   GammaMatrix operator*(complex s) {val[0] = s*val[0]; val[1] = s*val[1];
     136             :     val[2] = s*val[2]; val[3] = s*val[3]; return *this;}
     137             : 
     138             :   // Scalar * GammaMatrix.
     139             :   friend GammaMatrix operator*(complex s, GammaMatrix g);
     140             : 
     141             :   // Gamma5 - I * Scalar.
     142             :   GammaMatrix operator-(complex s) {val[0] = val[0] - s; val[1] = val[1] - s;
     143             :     val[2] = val[2] - s; val[3] = val[3] - s; return *this;}
     144             : 
     145             :   // I * Scalar - Gamma5.
     146             :   friend GammaMatrix operator-(complex s, GammaMatrix g);
     147             : 
     148             :   // Gamma5 + I * Scalar
     149             :   GammaMatrix operator+(complex s) {val[0] = val[0] + s; val[1] = val[1] + s;
     150             :     val[2] = val[2] + s; val[3] = val[3] + s; return *this;}
     151             : 
     152             :   // I * Scalar + Gamma5
     153             :   friend GammaMatrix operator+(complex s, GammaMatrix g);
     154             : 
     155             :   // << GammaMatrix.
     156             :   friend ostream& operator<< (ostream& os, GammaMatrix g);
     157             : 
     158             : protected:
     159             : 
     160             :   complex val[4];
     161             :   int     index[4];
     162             : 
     163             :   // Need to define complex 0 as a variable for operator() to work.
     164             :   complex COMPLEXZERO;
     165             : 
     166             : };
     167             : 
     168             : //--------------------------------------------------------------------------
     169             : 
     170             : // Namespace function declarations; friends of GammaMatrix class.
     171             : Wave4 operator*(Wave4 w, GammaMatrix g);
     172             : GammaMatrix operator*(complex s, GammaMatrix g);
     173             : GammaMatrix operator-(complex s, GammaMatrix g);
     174             : GammaMatrix operator+(complex s, GammaMatrix g);
     175             : ostream& operator<< (ostream& os, GammaMatrix g);
     176             : 
     177             : //==========================================================================
     178             : 
     179             : // Helicity particle class containing helicity information, derived from
     180             : // particle base class.
     181             : 
     182           0 : class HelicityParticle : public Particle {
     183             : 
     184             : public:
     185             : 
     186             :   // Constructors.
     187           0 :   HelicityParticle() : Particle() { direction = 1;}
     188           0 :   HelicityParticle(int idIn, int statusIn = 0, int mother1In = 0,
     189             :     int mother2In = 0, int daughter1In = 0, int daughter2In = 0,
     190             :     int colIn = 0, int acolIn = 0, double pxIn = 0.,
     191             :     double pyIn = 0., double pzIn = 0., double eIn = 0.,
     192             :     double mIn = 0., double scaleIn = 0., ParticleData* ptr = 0)
     193           0 :     : Particle(idIn, statusIn, mother1In, mother2In, daughter1In, daughter2In,
     194           0 :     colIn, acolIn, pxIn, pyIn, pzIn, eIn, mIn, scaleIn) {
     195           0 :     if (ptr) setPDEPtr( ptr->particleDataEntryPtr( idIn) );
     196           0 :     initRhoD();
     197           0 :     direction = 1; }
     198           0 :   HelicityParticle(int idIn, int statusIn, int mother1In, int mother2In,
     199             :     int daughter1In, int daughter2In, int colIn, int acolIn, Vec4 pIn,
     200             :     double mIn = 0., double scaleIn = 0., ParticleData* ptr = 0)
     201           0 :     : Particle(idIn, statusIn, mother1In, mother2In, daughter1In, daughter2In,
     202           0 :     colIn, acolIn, pIn, mIn, scaleIn) {
     203           0 :     if (ptr) setPDEPtr( ptr->particleDataEntryPtr( idIn) );
     204           0 :     initRhoD();
     205           0 :     direction = 1; }
     206           0 :   HelicityParticle(const Particle& ptIn, ParticleData* ptr = 0)
     207           0 :     : Particle(ptIn) {
     208           0 :     indexSave = ptIn.index();
     209           0 :     if (ptr) setPDEPtr( ptr->particleDataEntryPtr( id()) );
     210           0 :     initRhoD();
     211           0 :     direction = 1; }
     212             : 
     213             :   // Methods.
     214             :   Wave4 wave(int h);
     215             :   Wave4 waveBar(int h);
     216             :   void normalize(vector< vector<complex> >& m);
     217             :   int spinStates();
     218             : 
     219             :   // Return and set mass (redefine from Particle).
     220           0 :   double m() {return mSave;}
     221           0 :   void   m(double mIn) {mSave = mIn; initRhoD();}
     222             : 
     223             :   // Event record position (redefine from Particle).
     224           0 :   int  index() const {return indexSave;}
     225           0 :   void index(int indexIn) {indexSave = indexIn;}
     226             : 
     227             :   // Flag for whether particle is incoming (-1) or outgoing (1).
     228             :   int direction;
     229             : 
     230             :   // Helicity density matrix.
     231             :   vector< vector<complex> > rho;
     232             : 
     233             :   // Decay matrix.
     234             :   vector< vector<complex> > D;
     235             : 
     236             : private:
     237             : 
     238             :   // Initialize the helicity density and decay matrix.
     239             :   void initRhoD() {
     240           0 :     rho = vector< vector<complex> >(spinStates(),
     241           0 :       vector<complex>(spinStates(), 0));
     242           0 :     D   = vector< vector<complex> >(spinStates(),
     243           0 :       vector<complex>(spinStates(), 0));
     244           0 :     for (int i = 0; i < spinStates(); i++) {
     245           0 :       rho[i][i] = 1.0 / spinStates(); D[i][i] = 1;}
     246           0 :   }
     247             : 
     248             :   // Particle index in the event record.
     249             :   int indexSave;
     250             : 
     251             : };
     252             : 
     253             : //==========================================================================
     254             : 
     255             : } // end namespace Pythia8
     256             : 
     257             : #endif // end Pythia8_HelicityBasics_H

Generated by: LCOV version 1.11