Something went wrong on our end
-
Bertram Kopf authoreda2a04df1
DiracAntiSpinor.hh 7.75 KiB
// DiracAntiSpinor class definition file -*- C++ -*-
/* Copyright 2008 Mike Williams (mwill@jlab.org)
*
* This file is part of qft++.
*
* qft++ is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* qft++ is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with qft++. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _DiracAntiSpinor_H
#define _DiracAntiSpinor_H
//_____________________________________________________________________________
/** @file DiracAntiSpinor.h
* @brief DiracAntiSpinor class definition file
*/
//_____________________________________________________________________________
#include <iostream>
#include <complex>
#include "qft++/relativistic-quantum-mechanics/PolVector.hh"
#include "qft++/relativistic-quantum-mechanics/Utils.hh"
#include "qft++/relativistic-quantum-mechanics/Spin.hh"
#include "qft++/topincludes/matrix.hh"
#include "qft++/topincludes/tensor.hh"
#include "qft++/relativistic-quantum-mechanics/DiracMatricies.hh"
using namespace std;
//_____________________________________________________________________________
/** @class DiracAntiSpinor
* @author Mike Williams
*
* @brief \f$ v(p,m) \f$: spin-1/2 anti-particle spinors.
*
* This class handles spin-1/2 anti-particles. The spinors are given by,
* \f[ v(p,m) = \sqrt{E+w} \left( \begin{array}{c} \frac{\vec{p}
* \cdot \vec{\sigma}}{E+w} \chi(m) \\ \chi(m) \end{array}\right) \f]
* where \f$w\f$ is the mass, \f$E\f$ is the energy and,
* \f[ \chi(+\frac{1}{2}) = \left(\begin{array}{c} 0\\1 \end{array}\right)
* \qquad \chi(-\frac{1}{2}) = \left(\begin{array}{c} 1\\0 \end{array}\right)
* \f]
*
* They can be accessed through the use of the () operator. DiracAntiSpinor
* also provides member functions to return the anti-particle projection
* operator, Projector(), and the Feynman and Breit-Wigner propagators
* (Propagator() and PropagatorBW()).
*
* <b> Example Usage: </b>
*
* The amplitude for \f$ e^+ e^- \rightarrow \gamma \rightarrow \mu^+ \mu^- \f$
* is proportional to
* \f[ \bar{u}(p_{\mu^+},m_{\mu^+}) \gamma_{\rho} v(p_{\mu^-},m_{\mu^-})
* \frac{1}{P^2} \bar{v}(p_{e^+},m_{e^+}) \gamma^{\rho}u(p_{e^-},m_{e^-}) \f]
* where \f$p\f$'s are the momenta, \f$m\f$'s are the spin projections and
* \f$P\f$ is the momenta of the virtual photon. We can write this in the code
* as follows,
*
* \include DiracAntiSpinor.ex
*
*/
//_____________________________________________________________________________
class DiracAntiSpinor {
private:
// data members:
Matrix<complex<double> > _spinors[2]; ///< spin up/down anti-particle spinors
Vector4<double> _p4; ///< The particle's 4-momentum
double _mass; ///< The particle's mass
Matrix<complex<double> > _projector; ///< Spin-1/2 projector
// private functions:
/// Initialize matricies
void _Init(){
for(int i = 0; i < 2; i++) _spinors[i].Resize(4,1);
_projector.Resize(4,4);
}
/// Copy @a aspin to @a this
void _Copy(const DiracAntiSpinor &__aspin){
this->_Init();
_p4 = __aspin._p4;
_mass = __aspin._mass;
_projector = __aspin._projector;
for(int i = 0; i < 2; i++) _spinors[i] = __aspin._spinors[i];
}
/** Set _projector for the current _p4.
*
* The spin-1/2 anti-particle projection operator is defined as,
* \f[ P^{(\frac{1}{2})}(P) = \frac{1}{2w}
* \sum\limits_{M}v(P,M)\bar{v}(P,M)
* = \frac{1}{2w}(\gamma^{\mu}P_{\mu} - w) \f]
* where \f$P\f$ is the 4-momentum, \f$ w \f$ is the mass,
* and \f$M = \pm \frac{1}{2} \f$ is the
* spin projection.
*/
void _SetProjector(){
IdentityMatrix<double> I(4);
DiracGamma gamma;
_projector = (_p4*gamma - I*_mass)/(2*_mass);
}
public:
// create/copy/destroy:
/// Default Constructor (spin 1/2)
DiracAntiSpinor(){
_mass = 0.;
this->_Init();
}
/// Copy Constructor
DiracAntiSpinor(const DiracAntiSpinor &__aspin){
this->_Copy(__aspin);
}
/** Destructor */
virtual ~DiracAntiSpinor() {}
// Setters:
/** Set the DiracAntiSpinor object for a given 4-momentum.
*
* @param p4 4-momentum
* @param mass mass (used to normalize the spinor)
*
* The anti-particle spinor can be written as,
* \f[ v(p,m) = \sqrt{E+w} \left( \begin{array}{c} \frac{\vec{p}
* \cdot \vec{\sigma}}{E+w} \chi(m) \\ \chi(m) \end{array}\right) \f]
* where \f$w\f$ is the mass, \f$E\f$ is the energy and,
* \f[ \chi(+\frac{1}{2}) = \left(\begin{array}{c} 0\\1 \end{array}\right)
* \qquad \chi(-\frac{1}{2}) = \left(\begin{array}{c} 1\\0 \end{array}\right)
* \f]
*
* This function also sets the projection operator (see SetProjector()).
*/
void SetP4(const Vector4<double> &__p4,double __mass);
// Getters:
/// Returns \f$ v(m_z) \f$.
const Matrix<complex<double> >& operator()(const Spin &__mz) const{
int index = (int)(__mz + 1/2.);
if(index < 0 || index > 1)
cout << "Error! Attempt to access non-existent spinor." << endl;
assert(index >= 0 && index <= 1);
return _spinors[index];
}
/** Returns the spin-1/2 anti-particle projection operator.
*
* The spin-1/2 anti-particle projection operator is defined as,
* \f[ P^{(\frac{1}{2})}(P) = \sum\limits_{M}v(P,M)\bar{v}(P,M)
* = \frac{1}{2w}(\gamma^{\mu}P_{\mu} - w) \f]
* where \f$P\f$ is the 4-momentum, \f$ w \f$ is the mass,
* and \f$M = \pm \frac{1}{2} \f$ is the
* spin projection.
*/
const Matrix<complex<double> >& Projector() const {
return _projector;
}
/** Returns the Feynman propagator for a spin-1/2 anti-particle.
*
* \returns \f[ \frac{2w P^{(\frac{1}{2})}(P)}{P^2 - w^2} \f]
* where \f$w\rightarrow\f$ _mass, \f$P\rightarrow\f$ _p4 and
* \f$P^{(\frac{1}{2})}(P)\f$ is returned by Projector().
*/
Matrix<complex<double> > Propagator() const {
Matrix<complex<double> > prop(4,4);
prop = (this->_projector*2.*_mass)/(_p4.M2() - _mass*_mass);
return prop;
}
/** Returns the Breit-Wigner propagator for a spin-1/2 anti-particle.
*
* @param width Width of the Breit-Wigner.
*
* \returns \f[ \frac{2w P^{(\frac{1}{2})}(P) w\Gamma}
* {P^2 - w^2 + iw\Gamma} \f]
* where \f$\Gamma\rightarrow\f$ width, \f$w\rightarrow\f$ _mass,
* \f$P\rightarrow\f$ _p4 and
* \f$P^{(\frac{1}{2})}(P)\f$ is returned by Projector().
*/
Matrix<complex<double> > PropagatorBW(double __width) const{
Matrix<complex<double> > prop(4,4);
prop = (this->_projector*2.*_mass)*BreitWigner(_p4,_mass,__width);
return prop;
}
// Functions:
/** Boost the spinor.
*
* The boost vector is defined as \f$\vec{\beta} = (bx,by,bz)\f$
*
* Boosting is done by constructing the boost operator for spinors,
* \f[ D(\vec{\beta}) = \left(\begin{array}{cc} cosh(\alpha/2) &
* \vec{\sigma}\cdot\hat{P} sinh(\alpha/2) \\ \vec{\sigma}\cdot\hat{P}
* sinh(\alpha/2) & cosh(\alpha/2) \end{array} \right) \f]
* where \f$ tanh(\alpha) = \beta \f$. Then the boosted spinor is given by,
* \f[ u(P,M) = D(\vec{\beta}) u(P',M) \f]
* where \f$P(P')\f$ is the momentum in the boosted(original) frame.
*/
void Boost(double __bx,double __by,double __bz);
/// Boost the spinor to p4's rest frame (see Boost(double,double,double)).
void Boost(const Vector4<double> &__p4){
double p = __p4.P();
this->Boost(-__p4.X()/p,-__p4.Y()/p,-__p4.Z()/p);
}
};
//_____________________________________________________________________________
#endif /* _DiracAntiSpinor_H */