Skip to main content

Jones and Mueller polarization - Optics

Project description

Python polarization

https://img.shields.io/pypi/dm/py_pol https://img.shields.io/pypi/v/py_pol.svg Documentation Status logo.png

Features

Py-pol is a Python library for Jones and Stokes-Mueller polarization optics. It has 4 main modules:

  • jones_vector - Light polarization states in Jones formalism (2x1 vectors).

  • jones_matrix - Optical elements polarization properties in Jones formalism (2x2 matrices).

  • stokes - Light polarization states in Mueller-Stokes formalism (4x1 vectors).

  • mueller - Optical elements polarization properties in Mueller-Stokes formalism (4x4 matrices).

Each one has its own class, with multiple methods for generation, operation and parameters extraction.

Examples

Jones formalism

Generating Jones vectors and Matrices

from py_pol.jones_vector import Jones_vector
from py_pol.jones_matrix import Jones_matrix
from py_pol.utils import degrees

j0 = Jones_vector("j0")
j0.linear_light(angle=45*degrees)

m0 = Jones_matrix("m0")
m0.diattenuator_linear( p1=0.75, p2=0.25, angle=45*degrees)

m1 = Jones_matrix("m1")
m1.quarter_waveplate(angle=0 * degrees)

j1=m1*m0*j0

Extracting information form Jones Vector.

print(j0,'\n')
print(j0.parameters)
j0 = [+0.707; +0.707]

parameters of j0:
    intensity        : 1.000 arb.u
    alpha            : 45.000 deg
    delay            : 0.000 deg
    azimuth          : 45.000 deg
    ellipticity angle: 0.000 deg
    a, b             : 1.000  0.000
    phase            : 0.000 deg
print(j1,'\n')
print(j1.parameters)
m1 * m0 @45.00 deg * j0 = [+0.530+0.000j; +0.000+0.530j]'

parameters of m1 * m0 @45.00 deg * j0:
    intensity        : 0.562 arb.u
    alpha            : 45.000 deg
    delay            : 90.000 deg
    azimuth          : 8.618 deg
    ellipticity angle: -45.000 deg
    a, b             : 0.530  0.530
    phase            : 0.000 deg

Extracting information form Jones Matrices.

print(m0,'\n')
print(m0.parameters)
m0 @45.00 deg =
      [+0.500, +0.250]
      [+0.250, +0.500]

parameters of m0 @45.00 deg:
    is_homogeneous: True
    delay:          0.000 deg
    diattenuation:  0.800
print(m1,'\n')
print(m1.parameters)
m1 =
      [+1+0j, +0+0j]
      [+0+0j, +0+1j]

parameters of m1:
    is_homogeneous: True
    delay:          90.000 deg
    diattenuation:  0.000

Stokes-Mueller formalism

Generating Stokes vectors and Mueller matrices.

from py_pol.stokes import Stokes
from py_pol.mueller import Mueller
from py_pol.utils import degrees

j0 = Stokes("j0")
j0.linear_light(angle=45*degrees)

m1 = Mueller("m1")
m1.diattenuator_linear(p1=1, p2=0, angle=0*degrees)

j1=m1*j0

Extracting information from Stokes vectors.

Determining the intensity of a Stokes vector:

i1=j0.parameters.intensity()
print("intensity = {:4.3f} arb. u.".format(i1))
intensity = 1.000 arb. u.

Determining all the parameters of a Stokes vector:

print(j0,'\n')
print(j0.parameters)
j0 = [ +1;  +0;  +1;  +0]


parameters of j0:
    intensity             : 1.000 arb. u.
    amplitudes            : E0x 0.707, E0y 0.707, E0_unpol 0.000
    degree polarization   : 1.000
    degree linear pol.    : 1.000
    degree   circular pol.: 0.000
    alpha                 : 45.000 deg
    delay                 : 0.000 deg
    azimuth               : 45.000 deg
    ellipticity  angle    : 0.000 deg
    ellipticity  param    : 0.000
    eccentricity          : 1.000
    polarized vector      : [+1.000; +0.000; +1.000; +0.000]'
    unpolarized vector    : [+0.000; +0.000; +0.000; +0.000]'
print(j1,'\n')
print(j1.parameters)
m1 * j0 = [+0.500; +0.500; +0.000; +0.000]

parameters of m1 * j0:
    intensity             : 0.500 arb. u.
    amplitudes            : E0x 0.707, E0y 0.000, E0_unpol 0.000
    degree polarization   : 1.000
    degree linear pol.    : 1.000
    degree   circular pol.: 0.000
    alpha                 : 0.000 deg
    delay                 : 0.000 deg
    azimuth               : 0.000 deg
    ellipticity  angle    : 0.000 deg
    ellipticity  param    : 0.000
    eccentricity          : 1.000
    polarized vector      : [+0.500; +0.500; +0.000; +0.000]'
    unpolarized vector    : [+0.000; +0.000; +0.000; +0.000]'

Extracting information from Mueller matrices.

m2 = Mueller("m2")
m2.diattenuator_retarder_linear(D=90*degrees, p1=1, p2=0.5, angle=0)
delay = m2.parameters.retardance()
print("delay = {:2.1f}º".format(delay/degrees))
delay = 90.0º

There is a function in Parameters_Jones_Vector class, .get_all() that will compute all the parameters available and stores in a dictionary .dict_params(). Info about dict parameters can be revised using the print function.

print(m2,'\n')
m2.parameters.get_all()
print(m2.parameters)
  m2 =
    [+0.6250, +0.3750, +0.0000, +0.0000]
    [+0.3750, +0.6250, +0.0000, +0.0000]
    [+0.0000, +0.0000, +0.0000, +0.5000]
    [+0.0000, +0.0000, -0.5000, +0.0000]

Parameters of m2:
    Transmissions:
        - Mean                  : 62.5 %.
        - Maximum               : 100.0 %.
        - Minimum               : 25.0 %.
    Diattenuation:
        - Total                 : 0.600.
        - Linear                : 0.600.
        - Circular              : 0.000.
    Polarizance:
        - Total                 : 0.600.
        - Linear                : 0.600.
        - Circular              : 0.000.
    Spheric purity              : 0.872.
    Retardance                  : 1.571.
    Polarimetric purity         : 1.000.
    Depolarization degree       : 0.000.
    Depolarization factors:
        - Euclidean distance    : 1.732.
        - Depolarization factor : 0.000.
    Polarimetric purity indices:
        - P1                    : 1.000.
        - P2                    : 1.000.
        - P3                    : 1.000.

There are many types of Mueller matrices. The Check_Mueller calss implements all the checks that can be performed in order to clasify a Mueller matrix. They are stored in the checks field of Mueller class.

m1 = Mueller("m1")
m1.diattenuator_linear(p1=1, p2=0.2, angle=0*degrees)
print(m1,'\n')

c1 = m1.checks.is_physical()
c2 = m1.checks.is_homogeneous()
c3 = m1.checks.is_retarder()
print('The linear diattenuator is physical: {}; hogeneous: {}; and a retarder: {}.'.format(c1, c2, c3))
m1 =
  [+0.520, +0.480, +0.000, +0.000]
  [+0.480, +0.520, +0.000, +0.000]
  [+0.000, +0.000, +0.200, +0.000]
  [+0.000, +0.000, +0.000, +0.200]


The linear diattenuator is physical: True; hogeneous: True; and a retarder: False.

Drawings

The modules also allows to obtain graphical representation of polarization.

Drawing polarization ellipse for Jones vectors.

ellipse_Jones_1.png ellipse_Jones_3.png

Drawing polarization ellipse for Stokes vectors with random distribution due to unpolarized part of light.

ellipse_Stokes_1.png ellipse_Stokes_2.png

Drawing Stokes vectors in Poincare sphere.

poincare2.png poincare3.png poincare4.png

Conventions

In this module we assume the light is propagated along the z direction. Then, the electric field is defined as:

\begin{equation*} \overrightarrow{E}(x,y,z)=\left[\begin{array}{c} E_{x}(x,y)\\ E_{y}(x,y)\\ 0 \end{array}\right]e^{i(kz-\omega t)}, \end{equation*}

where \(E_x\) and \(E_y\) are the two components of the Jones vector. Also, we define the x component as the origin of global phase, so it is 0 when \(E_x\) is real and positive. In the extraordinary case when \(E_x = 0\), the global phase is extracted from the y component. Then, the most general unitary Jones vector can be described as:

\begin{equation*} E=E_{0}e^{i\Phi}\left[\begin{array}{c} \cos(\alpha)\\ \sin(\alpha)e^{i\delta} \end{array}\right] \end{equation*}

where \(E_0\) is the electric field amplitude, \(\Phi\) is the global phase, and \(\alpha\) and \(\delta\) are the characteristic angles of the light state.

This phase convention also affects the description of retarders. For example, a linear retarder with an azimuth of 0º for its fast eigenstate will have the following Jones matrix:

\begin{equation*} J_{R}=\left[\begin{array}{cc} 1 & 0\\ 0 & e^{-i\Delta} \end{array}\right], \end{equation*}

where \(\Delta\) is the retarder retardance.

Authors

logoUCM.png
  • Jesus del Hoyo <jhoyo@ucm.es>

  • Luis Miguel Sanchez Brea <optbrea@ucm.es>

    Universidad Complutense de Madrid, Faculty of Physical Sciences, Department of Optics Plaza de las ciencias 1, ES-28040 Madrid (Spain)

Citing

References

    1. Goldstein “Polarized light” 2nd edition, Marcel Dekker (1993).

      1. Gil, R. Ossikovsky “Polarized light and the Mueller Matrix approach”, CRC Press (2016).

    1. Brosseau “Fundamentals of Polarized Light” Wiley (1998).

    1. Martinez-Herrero, P. M. Mejias, G. Piquero “Characterization of partially polarized light fields” Springer series in Optical sciences (2009).

      1. Bennet “Handbook of Optics 1” Chapter 5 ‘Polarization’.

      1. Chipman “Handbook of Optics 2” Chapter 2 ‘Polarimetry’.

      1. Lu and RA Chipman, “Homogeneous and inhomogeneous Jones matrices”, J. Opt. Soc. Am. A 11(2) 766 (1994).

Acknowlegments

This software was initially developed for the project Retos-Colaboración 2016 “Ecograb” (RTC-2016-5277-5) and “Teluro-AEI” (RTC2019-007113-3) of Ministerio de Economía y Competitivdad (Spain) and the European funds for regional development (EU), led by Luis Miguel Sanchez-Brea.

Credits

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

History

1.3.0

  • Adition of ret as variable name for retardance in all retarder creation methods.

  • Adition of general, diattenuator_general and retarder_general methods which accept both characteristic angles and azimuth_ellipticity methods.

  • Addition of biaxial_material for creating retarders from their ordinary and extraordinary refractive indices.

  • Addition of Liquid crystal advanced example using different biaxial layer models.

  • Citation file.

  • Bug fix of multiplication of elements by arrays.

  • Fix in the definition of righ-handed and left-handed in the polarization ellipse representation.

  • Other bugfixes.

1.2.0

  • Addition of general creation methods that encompases both azimuth_ellipticity and charac_angles methods (which are maintained for retrocompatibility).

  • Added ret as parameters of retarders for homogeneity in naming (R is maintained for retrocompatibility).

  • New circular diattenuators and retarders methods.

  • Limits for alpha, delay, azimuth, ellipticity and retardance values are optional through the force_limits variable in creation methods, which is False by default.

  • New liquid crystal advanced exmple.

  • Bugfixes.

1.1.4

  • bugfix Jones_matrix.parameters.transmission

  • Remove the global phase of a diattenuattor before checking if it is a diattenuator

  • bugfix Jones_matrix.analysis.decompose_pure

  • Include amplitude_phase drawing

  • Change the representation origin to ‘lower’

1.1.3

  • bugfix zeroslike

  • bugfix not taking shape = False as flatten the object.

1.1.2

  • bugfix Jones_vector.parameters.global_phase

1.1.1

  • from_list can also be used with lists of Py_pol objects, lists and tuples. Also, all elemeents may have more than one elemnt.

  • minor bugfixes

1.1.0 (2022-3-31)

  • Added base class Py_pol

  • Objects are now iterable

  • 3D drawings changed to Plotly

  • New density and existence methods

1.0.4 (2022-02-07)

  • Bug fix related to variable limits

1.0.4 (2021-07-19)

  • Bug fixes

1.0.3 (2021-01-22)

  • Bug fixes

1.0.2 (2020-07-04)

  • Implemented workaround of axis_equal issue.

1.0.0 (2020-06-04)

py_pol multidimensional. Alpha state

This is a big overhaul with many changes. All of them are based on the possibility of storing several vector/matrices in the same object. This reduces significantly the time required to perform the same operation to multiple vectors/matrices, using numpy methods instead of for loops. We have calculated that the reduction is around one order of magnitude.

New methods have been introduced. First, methods available for Mueller / Stoes modules have been created also for Jones (when possible). Also, some bugs and errors in the calculations have been solved.

Finally, some method and argument names have been changed to be consistent between different classes. Also, the default value of arguments with the same name have also been unified.

The biggest TO DO we have are tests. Right now, we only have tests for the Jones_vector class. However, we thought that it would be useful to release this version so the community can use it.

NOTE: Due to the change of argument and method names, this version is not compatible with the previous ones.

0.2.2 (2019-09-04)

  • Bug fixes.

0.2.1 (2019-09-04)

  • Bug fixes.

  • Solve incidents.

  • Start to homogenize structures for both Jones and Stokes.

0.2.0 (2019-05-25)

pre-alpha state

  • Upgrade to Python 3

  • Stable version including tests

0.1.5 (2019-02-25)

  • Jones_vector, Jones_matrix, Stokes works.

  • Jones_vector: simplify function to represent better Jones vectors.

  • tests drawing: Made tests for drawing

  • Mueller is in progress.

  • Functions = 9/10

  • Documentation = 8/10

  • Tutorial = 8/10.

  • Examples = 8/10.

  • Tests = 8/10

  • Drawing = 10/10. Finished. Polarization ellipse for Jones and Stokes (partially random). Stokes on Poincaré sphere.

0.1.4 (2019-02-03)

  • bug fixes

0.1.3 (2019-01-22)

  • Fixed axis_equal issue.

  • Jones_vector, Jones_matrix, Stokes works.

  • Mueller is in progress.

  • Functions = 9/10

  • Documentation = 8/10

  • Tutorial = 7/10.

  • Examples = 6/10.

  • Drawing = 0/10.

0.1.1 (2018-12-22)

  • First release on PyPI in alpha state.

0.0.0 (2018-11-22)

First implementation of py_pol.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_pol-1.3.0.tar.gz (13.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_pol-1.3.0-py2.py3-none-any.whl (144.6 kB view details)

Uploaded Python 2Python 3

File details

Details for the file py_pol-1.3.0.tar.gz.

File metadata

  • Download URL: py_pol-1.3.0.tar.gz
  • Upload date:
  • Size: 13.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.6

File hashes

Hashes for py_pol-1.3.0.tar.gz
Algorithm Hash digest
SHA256 1a951d843052c2d19563662b7e239106d3fc01243ddd37299c5a1818e6c900f6
MD5 b091ad242b2db0bec32ff137d677d78f
BLAKE2b-256 7afe03fd3f8fbfc306ab487412a982a28570f6f2ecdd4f54b9d002102f92b8e3

See more details on using hashes here.

File details

Details for the file py_pol-1.3.0-py2.py3-none-any.whl.

File metadata

  • Download URL: py_pol-1.3.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 144.6 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.6

File hashes

Hashes for py_pol-1.3.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 df0fea9be6662bda4813bf0e49996c9ecc35c5182a260d5f523820aab53bf621
MD5 99a8faffcfd34611f2752b028c6c93a1
BLAKE2b-256 55a2ca34327b168c0264ebbb74e62edbe59c3146eeef8ce897282381629b97c2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page