"""
Represents a photon defined by its energy and direction vector
"""
from crystalpy.util.Vector import Vector
import scipy.constants as codata
import numpy
import copy
[docs]class Photon(object):
"""Constructor.
Parameters
----------
energy_in_ev : float, optional
Photon energy in eV.
direction_vector : Vector instance, optional
The direction of the photon (no need to be normalized).
"""
def __init__(self, energy_in_ev=1000.0, direction_vector=Vector(0.0,1.0,0.0)):
self._energy_in_ev = numpy.array(energy_in_ev)
self._unit_direction_vector = direction_vector.getNormalizedVector()
if self._unit_direction_vector.nStack() != self._energy_in_ev.size:
raise Exception("Energy array must be of the same dimension of the vector stack.")
[docs] def duplicate(self):
"""Return a clone of the Photon instance.
Returns
-------
Photon instance
"""
return copy.deepcopy(self)
[docs] def energy(self):
"""Get the photon energy in eV.
Returns
-------
float
The photon energy.
"""
return self._energy_in_ev
[docs] def setEnergy(self,value):
"""
Parameters
----------
value : float
The energy in eV to be set
"""
self._energy_in_ev = value
[docs] def wavelength(self):
"""Returns the photon wavelength in m.
Returns
-------
float
the photon wavelength
"""
E_in_Joule = self.energy() * codata.e # elementary_charge
# Wavelength in meter
wavelength = (codata.c * codata.h / E_in_Joule)
return wavelength
[docs] def wavenumber(self):
"""Returns the photon wavenumber (2 pi / wavelength) in m^-1.
Returns
-------
float
the photon wavenumber
"""
return (2.0 * numpy.pi) / self.wavelength()
[docs] def wavevector(self):
"""Returns the photon wavevector in m^-1.
Returns
-------
Vector instance
the photon wavevector
"""
return self.unitDirectionVector().scalarMultiplication(self.wavenumber())
[docs] def unitDirectionVector(self):
"""Returns the photon direction vector.
Returns
-------
Vector instance
the photon dicection.
"""
return self._unit_direction_vector
[docs] def setUnitDirectionVector(self,vector=Vector(0,1,0)):
"""Sets the Photon direction.
Parameters
----------
vector : Vector instance
The vector with the direction (may be not normalized).
"""
self._unit_direction_vector = vector.getNormalizedVector()
[docs] def deviation(self):
"""Returns the deviation angle (angle of the projection on YZ plane with Y axis)
Returns
-------
float
the deviation angle. The deviations are calculated supposing that the bunch moves along the y axis
"""
vector = self.unitDirectionVector().components() # ndarray([x, y, z])
deviation = numpy.arctan2(vector[2], vector[1])
return deviation
def __eq__(self, candidate):
if (self.energy() == candidate.energy() and
self.unitDirectionVector() == candidate.unitDirectionVector()):
return True
return False
def __ne__(self, candidate):
return not (self == candidate)