"""
Represents a photon defined by its energy, direction vector and pi and sigma complex amplitudes.
"""
from crystalpy.util.Photon import Photon
import numpy
[docs]class ComplexAmplitudePhoton(Photon):
"""Constructor.
Parameters
----------
energy_in_ev : float
Photon energy in eV.
direction_vector : Vector instance
The direction of the photon (no need to be normalized).
Esigma : complex
The sigma-amplitude.
Esigma : complex
The pi-amplitude.
"""
def __init__(self, energy_in_ev, direction_vector, Esigma=None, Epi=None):
# Call base constructor.
Photon.__init__(self, energy_in_ev, direction_vector)
if Esigma is None:
self._Esigma = numpy.array(1/numpy.sqrt(2)+0j)
else:
self._Esigma = numpy.array(Esigma, dtype=complex)
if Epi is None:
self._Epi = numpy.array(1/numpy.sqrt(2)+0j)
else:
self._Epi = numpy.array(Epi, dtype=complex)
[docs] def rescaleEsigma(self, factor):
"""Multiply the sigma complex amplitude by a factor.
Parameters
----------
factor : float
The multiplying factor.
"""
self._Esigma = self._Esigma * numpy.array(factor, dtype=complex) # TODO: this cast may lose resolution
[docs] def rescaleEpi(self, factor):
"""Multiply the pi complex amplitude by a factor.
Parameters
----------
factor : float
The multiplying factor.
"""
self._Epi = self._Epi * numpy.array(factor, dtype=complex) # TODO: this cast may lose resolution
[docs] def getIntensityS(self):
"""Gets the sigma intensity.
Returns
-------
float
Intensity (sigma) of photon.
"""
return numpy.abs(self._Esigma) ** 2
[docs] def getIntensityP(self):
"""Gets the pi intensity.
Returns
-------
float
Intensity (pi) of photon.
"""
return numpy.abs(self._Epi) ** 2
[docs] def getIntensity(self):
"""Gets the total (sigma plus pi) intensity.
Returns
-------
float
Intensity of photon.
"""
return self.getIntensityS() + self.getIntensityP()
[docs] def getPhaseS(self):
"""Gets the sigma phase.
Returns
-------
float
Sigma-phase in radians.
"""
return numpy.angle(numpy.array(self._Esigma, dtype=complex))
[docs] def getPhaseP(self):
"""Gets the pi phase.
Returns
-------
float
Pi-phase in radians.
"""
return numpy.angle(numpy.array(self._Epi, dtype=complex))
[docs] def getComplexAmplitudeS(self):
"""Gets the sigma complex amplitude.
Returns
-------
complex
Sigma-complex amplitude.
"""
return self._Esigma
[docs] def getComplexAmplitudeP(self):
"""Gets the pi complex amplitude.
Returns
-------
complex
Pi-complex amplitude.
"""
return self._Epi
[docs] def setComplexAmplitudeS(self, value):
"""Sets the sigma complex amplitude.
Parameters
----------
value : complex, numpy array
the value (complex) or numpy array (dtype=complex)
"""
self._Esigma = value
[docs] def setComplexAmplitudeP(self, value):
"""Sets the pi complex amplitude.
Parameters
----------
value : complex, numpy array
the value (complex) or numpy array (dtype=complex)
"""
self._Epi = value
def __eq__(self, candidate):
if ((self.energy() == candidate.energy() and
self.unitDirectionVector() == candidate.unitDirectionVector()) and
self._Esigma.complexAmplitude() == candidate._Esigma.complexAmplitude() and
self._Epi.complexAmplitude() == candidate._Epi.complexAmplitude() ):
return True
return False
def __ne__(self, candidate):
return not (self == candidate)