U
    	Ç-eºS  ã                   @   sØ   d Z ddlmZmZ ddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ dd	lmZ d
d„ Zd"dd„Zdd„ Zd#dd„Zd$dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd%dd „Zd!S )&u«	  
The module implements routines to model the polarization of optical fields
and can be used to calculate the effects of polarization optical elements on
the fields.

- Jones vectors.

- Stokes vectors.

- Jones matrices.

- Mueller matrices.

Examples
========

We calculate a generic Jones vector:

>>> from sympy import symbols, pprint, zeros, simplify
>>> from sympy.physics.optics.polarization import (jones_vector, stokes_vector,
...     half_wave_retarder, polarizing_beam_splitter, jones_2_stokes)

>>> psi, chi, p, I0 = symbols("psi, chi, p, I0", real=True)
>>> x0 = jones_vector(psi, chi)
>>> pprint(x0, use_unicode=True)
âŽ¡-â…ˆâ‹…sin(Ï‡)â‹…sin(Ïˆ) + cos(Ï‡)â‹…cos(Ïˆ)âŽ¤
âŽ¢                                âŽ¥
âŽ£â…ˆâ‹…sin(Ï‡)â‹…cos(Ïˆ) + sin(Ïˆ)â‹…cos(Ï‡) âŽ¦

And the more general Stokes vector:

>>> s0 = stokes_vector(psi, chi, p, I0)
>>> pprint(s0, use_unicode=True)
âŽ¡          Iâ‚€          âŽ¤
âŽ¢                      âŽ¥
âŽ¢Iâ‚€â‹…pâ‹…cos(2â‹…Ï‡)â‹…cos(2â‹…Ïˆ)âŽ¥
âŽ¢                      âŽ¥
âŽ¢Iâ‚€â‹…pâ‹…sin(2â‹…Ïˆ)â‹…cos(2â‹…Ï‡)âŽ¥
âŽ¢                      âŽ¥
âŽ£    Iâ‚€â‹…pâ‹…sin(2â‹…Ï‡)     âŽ¦

We calculate how the Jones vector is modified by a half-wave plate:

>>> alpha = symbols("alpha", real=True)
>>> HWP = half_wave_retarder(alpha)
>>> x1 = simplify(HWP*x0)

We calculate the very common operation of passing a beam through a half-wave
plate and then through a polarizing beam-splitter. We do this by putting this
Jones vector as the first entry of a two-Jones-vector state that is transformed
by a 4x4 Jones matrix modelling the polarizing beam-splitter to get the
transmitted and reflected Jones vectors:

>>> PBS = polarizing_beam_splitter()
>>> X1 = zeros(4, 1)
>>> X1[:2, :] = x1
>>> X2 = PBS*X1
>>> transmitted_port = X2[:2, :]
>>> reflected_port = X2[2:, :]

This allows us to calculate how the power in both ports depends on the initial
polarization:

>>> transmitted_power = jones_2_stokes(transmitted_port)[0]
>>> reflected_power = jones_2_stokes(reflected_port)[0]
>>> print(transmitted_power)
cos(-2*alpha + chi + psi)**2/2 + cos(2*alpha + chi - psi)**2/2


>>> print(reflected_power)
sin(-2*alpha + chi + psi)**2/2 + sin(2*alpha + chi - psi)**2/2

Please see the description of the individual functions for further
details and examples.

References
==========

.. [1] https://en.wikipedia.org/wiki/Jones_calculus
.. [2] https://en.wikipedia.org/wiki/Mueller_calculus
.. [3] https://en.wikipedia.org/wiki/Stokes_parameters

é    )ÚIÚpi)ÚAbsÚimÚre)Úexp)Úsqrt)ÚcosÚsin)ÚMatrix)Úsimplify)ÚTensorProductc                 C   sN   t t t|ƒ t| ƒ t|ƒt| ƒ  tt|ƒ t| ƒ t| ƒt|ƒ  gƒS )uÃ  A Jones vector corresponding to a polarization ellipse with `psi` tilt,
    and `chi` circularity.

    Parameters
    ==========

    psi : numeric type or SymPy Symbol
        The tilt of the polarization relative to the `x` axis.

    chi : numeric type or SymPy Symbol
        The angle adjacent to the mayor axis of the polarization ellipse.


    Returns
    =======

    Matrix :
        A Jones vector.

    Examples
    ========

    The axes on the PoincarÃ© sphere.

    >>> from sympy import pprint, symbols, pi
    >>> from sympy.physics.optics.polarization import jones_vector
    >>> psi, chi = symbols("psi, chi", real=True)

    A general Jones vector.

    >>> pprint(jones_vector(psi, chi), use_unicode=True)
    âŽ¡-â…ˆâ‹…sin(Ï‡)â‹…sin(Ïˆ) + cos(Ï‡)â‹…cos(Ïˆ)âŽ¤
    âŽ¢                                âŽ¥
    âŽ£â…ˆâ‹…sin(Ï‡)â‹…cos(Ïˆ) + sin(Ïˆ)â‹…cos(Ï‡) âŽ¦

    Horizontal polarization.

    >>> pprint(jones_vector(0, 0), use_unicode=True)
    âŽ¡1âŽ¤
    âŽ¢ âŽ¥
    âŽ£0âŽ¦

    Vertical polarization.

    >>> pprint(jones_vector(pi/2, 0), use_unicode=True)
    âŽ¡0âŽ¤
    âŽ¢ âŽ¥
    âŽ£1âŽ¦

    Diagonal polarization.

    >>> pprint(jones_vector(pi/4, 0), use_unicode=True)
    âŽ¡âˆš2âŽ¤
    âŽ¢â”€â”€âŽ¥
    âŽ¢2 âŽ¥
    âŽ¢  âŽ¥
    âŽ¢âˆš2âŽ¥
    âŽ¢â”€â”€âŽ¥
    âŽ£2 âŽ¦

    Anti-diagonal polarization.

    >>> pprint(jones_vector(-pi/4, 0), use_unicode=True)
    âŽ¡ âˆš2 âŽ¤
    âŽ¢ â”€â”€ âŽ¥
    âŽ¢ 2  âŽ¥
    âŽ¢    âŽ¥
    âŽ¢-âˆš2 âŽ¥
    âŽ¢â”€â”€â”€â”€âŽ¥
    âŽ£ 2  âŽ¦

    Right-hand circular polarization.

    >>> pprint(jones_vector(0, pi/4), use_unicode=True)
    âŽ¡ âˆš2 âŽ¤
    âŽ¢ â”€â”€ âŽ¥
    âŽ¢ 2  âŽ¥
    âŽ¢    âŽ¥
    âŽ¢âˆš2â‹…â…ˆâŽ¥
    âŽ¢â”€â”€â”€â”€âŽ¥
    âŽ£ 2  âŽ¦

    Left-hand circular polarization.

    >>> pprint(jones_vector(0, -pi/4), use_unicode=True)
    âŽ¡  âˆš2  âŽ¤
    âŽ¢  â”€â”€  âŽ¥
    âŽ¢  2   âŽ¥
    âŽ¢      âŽ¥
    âŽ¢-âˆš2â‹…â…ˆ âŽ¥
    âŽ¢â”€â”€â”€â”€â”€â”€âŽ¥
    âŽ£  2   âŽ¦

    )r   r   r
   r	   )ÚpsiÚchi© r   úb/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/physics/optics/polarization.pyÚjones_vectora   s    _&"ÿr   é   c                 C   sh   |}|| t d|  ƒ t d| ƒ }|| td|  ƒ t d| ƒ }|| td| ƒ }t||||gƒS )u7	  A Stokes vector corresponding to a polarization ellipse with ``psi``
    tilt, and ``chi`` circularity.

    Parameters
    ==========

    psi : numeric type or SymPy Symbol
        The tilt of the polarization relative to the ``x`` axis.
    chi : numeric type or SymPy Symbol
        The angle adjacent to the mayor axis of the polarization ellipse.
    p : numeric type or SymPy Symbol
        The degree of polarization.
    I : numeric type or SymPy Symbol
        The intensity of the field.


    Returns
    =======

    Matrix :
        A Stokes vector.

    Examples
    ========

    The axes on the PoincarÃ© sphere.

    >>> from sympy import pprint, symbols, pi
    >>> from sympy.physics.optics.polarization import stokes_vector
    >>> psi, chi, p, I = symbols("psi, chi, p, I", real=True)
    >>> pprint(stokes_vector(psi, chi, p, I), use_unicode=True)
    âŽ¡          I          âŽ¤
    âŽ¢                     âŽ¥
    âŽ¢Iâ‹…pâ‹…cos(2â‹…Ï‡)â‹…cos(2â‹…Ïˆ)âŽ¥
    âŽ¢                     âŽ¥
    âŽ¢Iâ‹…pâ‹…sin(2â‹…Ïˆ)â‹…cos(2â‹…Ï‡)âŽ¥
    âŽ¢                     âŽ¥
    âŽ£    Iâ‹…pâ‹…sin(2â‹…Ï‡)     âŽ¦


    Horizontal polarization

    >>> pprint(stokes_vector(0, 0), use_unicode=True)
    âŽ¡1âŽ¤
    âŽ¢ âŽ¥
    âŽ¢1âŽ¥
    âŽ¢ âŽ¥
    âŽ¢0âŽ¥
    âŽ¢ âŽ¥
    âŽ£0âŽ¦

    Vertical polarization

    >>> pprint(stokes_vector(pi/2, 0), use_unicode=True)
    âŽ¡1 âŽ¤
    âŽ¢  âŽ¥
    âŽ¢-1âŽ¥
    âŽ¢  âŽ¥
    âŽ¢0 âŽ¥
    âŽ¢  âŽ¥
    âŽ£0 âŽ¦

    Diagonal polarization

    >>> pprint(stokes_vector(pi/4, 0), use_unicode=True)
    âŽ¡1âŽ¤
    âŽ¢ âŽ¥
    âŽ¢0âŽ¥
    âŽ¢ âŽ¥
    âŽ¢1âŽ¥
    âŽ¢ âŽ¥
    âŽ£0âŽ¦

    Anti-diagonal polarization

    >>> pprint(stokes_vector(-pi/4, 0), use_unicode=True)
    âŽ¡1 âŽ¤
    âŽ¢  âŽ¥
    âŽ¢0 âŽ¥
    âŽ¢  âŽ¥
    âŽ¢-1âŽ¥
    âŽ¢  âŽ¥
    âŽ£0 âŽ¦

    Right-hand circular polarization

    >>> pprint(stokes_vector(0, pi/4), use_unicode=True)
    âŽ¡1âŽ¤
    âŽ¢ âŽ¥
    âŽ¢0âŽ¥
    âŽ¢ âŽ¥
    âŽ¢0âŽ¥
    âŽ¢ âŽ¥
    âŽ£1âŽ¦

    Left-hand circular polarization

    >>> pprint(stokes_vector(0, -pi/4), use_unicode=True)
    âŽ¡1 âŽ¤
    âŽ¢  âŽ¥
    âŽ¢0 âŽ¥
    âŽ¢  âŽ¥
    âŽ¢0 âŽ¥
    âŽ¢  âŽ¥
    âŽ£-1âŽ¦

    Unpolarized light

    >>> pprint(stokes_vector(0, 0, 0), use_unicode=True)
    âŽ¡1âŽ¤
    âŽ¢ âŽ¥
    âŽ¢0âŽ¥
    âŽ¢ âŽ¥
    âŽ¢0âŽ¥
    âŽ¢ âŽ¥
    âŽ£0âŽ¦

    é   )r	   r
   r   )r   r   Úpr   ZS0ZS1ZS2ZS3r   r   r   Ústokes_vectorÄ   s
    w  r   c              	   C   s`   | \}}t t|ƒd t|ƒd  t|ƒd t|ƒd  dt|| ¡  ƒ dt|| ¡  ƒ gƒS )u³  Return the Stokes vector for a Jones vector ``e``.

    Parameters
    ==========

    e : SymPy Matrix
        A Jones vector.

    Returns
    =======

    SymPy Matrix
        A Jones vector.

    Examples
    ========

    The axes on the PoincarÃ© sphere.

    >>> from sympy import pprint, pi
    >>> from sympy.physics.optics.polarization import jones_vector
    >>> from sympy.physics.optics.polarization import jones_2_stokes
    >>> H = jones_vector(0, 0)
    >>> V = jones_vector(pi/2, 0)
    >>> D = jones_vector(pi/4, 0)
    >>> A = jones_vector(-pi/4, 0)
    >>> R = jones_vector(0, pi/4)
    >>> L = jones_vector(0, -pi/4)
    >>> pprint([jones_2_stokes(e) for e in [H, V, D, A, R, L]],
    ...         use_unicode=True)
    âŽ¡âŽ¡1âŽ¤  âŽ¡1 âŽ¤  âŽ¡1âŽ¤  âŽ¡1 âŽ¤  âŽ¡1âŽ¤  âŽ¡1 âŽ¤âŽ¤
    âŽ¢âŽ¢ âŽ¥  âŽ¢  âŽ¥  âŽ¢ âŽ¥  âŽ¢  âŽ¥  âŽ¢ âŽ¥  âŽ¢  âŽ¥âŽ¥
    âŽ¢âŽ¢1âŽ¥  âŽ¢-1âŽ¥  âŽ¢0âŽ¥  âŽ¢0 âŽ¥  âŽ¢0âŽ¥  âŽ¢0 âŽ¥âŽ¥
    âŽ¢âŽ¢ âŽ¥, âŽ¢  âŽ¥, âŽ¢ âŽ¥, âŽ¢  âŽ¥, âŽ¢ âŽ¥, âŽ¢  âŽ¥âŽ¥
    âŽ¢âŽ¢0âŽ¥  âŽ¢0 âŽ¥  âŽ¢1âŽ¥  âŽ¢-1âŽ¥  âŽ¢0âŽ¥  âŽ¢0 âŽ¥âŽ¥
    âŽ¢âŽ¢ âŽ¥  âŽ¢  âŽ¥  âŽ¢ âŽ¥  âŽ¢  âŽ¥  âŽ¢ âŽ¥  âŽ¢  âŽ¥âŽ¥
    âŽ£âŽ£0âŽ¦  âŽ£0 âŽ¦  âŽ£0âŽ¦  âŽ£0 âŽ¦  âŽ£1âŽ¦  âŽ£-1âŽ¦âŽ¦

    r   éþÿÿÿ)r   r   r   Ú	conjugater   )ÚeÚexZeyr   r   r   Újones_2_stokesB  s    (ýr   c                 C   s@   t t| ƒd t| ƒt| ƒ gt| ƒt| ƒ t| ƒd ggƒ}|S )u4  A linear polarizer Jones matrix with transmission axis at
    an angle ``theta``.

    Parameters
    ==========

    theta : numeric type or SymPy Symbol
        The angle of the transmission axis relative to the horizontal plane.

    Returns
    =======

    SymPy Matrix
        A Jones matrix representing the polarizer.

    Examples
    ========

    A generic polarizer.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import linear_polarizer
    >>> theta = symbols("theta", real=True)
    >>> J = linear_polarizer(theta)
    >>> pprint(J, use_unicode=True)
    âŽ¡      2                     âŽ¤
    âŽ¢   cos (Î¸)     sin(Î¸)â‹…cos(Î¸)âŽ¥
    âŽ¢                            âŽ¥
    âŽ¢                     2      âŽ¥
    âŽ£sin(Î¸)â‹…cos(Î¸)     sin (Î¸)   âŽ¦


    r   )r   r	   r
   )ÚthetaÚMr   r   r   Úlinear_polarizerq  s    "ÿr   c                 C   s¢   t t| ƒd tt| ƒt| ƒd   dtt| ƒ t| ƒ t| ƒ gdtt| ƒ t| ƒ t| ƒ t| ƒd tt| ƒt| ƒd   ggƒ}|tt | d ƒ S )u/  A phase retarder Jones matrix with retardance ``delta`` at angle ``theta``.

    Parameters
    ==========

    theta : numeric type or SymPy Symbol
        The angle of the fast axis relative to the horizontal plane.
    delta : numeric type or SymPy Symbol
        The phase difference between the fast and slow axes of the
        transmitted light.

    Returns
    =======

    SymPy Matrix :
        A Jones matrix representing the retarder.

    Examples
    ========

    A generic retarder.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import phase_retarder
    >>> theta, delta = symbols("theta, delta", real=True)
    >>> R = phase_retarder(theta, delta)
    >>> pprint(R, use_unicode=True)
    âŽ¡                          -â…ˆâ‹…Î´               -â…ˆâ‹…Î´               âŽ¤
    âŽ¢                          â”€â”€â”€â”€â”€              â”€â”€â”€â”€â”€              âŽ¥
    âŽ¢âŽ› â…ˆâ‹…Î´    2         2   âŽž    2    âŽ›     â…ˆâ‹…Î´âŽž    2                âŽ¥
    âŽ¢âŽâ„¯   â‹…sin (Î¸) + cos (Î¸)âŽ â‹…â„¯       âŽ1 - â„¯   âŽ â‹…â„¯     â‹…sin(Î¸)â‹…cos(Î¸)âŽ¥
    âŽ¢                                                                âŽ¥
    âŽ¢            -â…ˆâ‹…Î´                                           -â…ˆâ‹…Î´ âŽ¥
    âŽ¢            â”€â”€â”€â”€â”€                                          â”€â”€â”€â”€â”€âŽ¥
    âŽ¢âŽ›     â…ˆâ‹…Î´âŽž    2                  âŽ› â…ˆâ‹…Î´    2         2   âŽž    2  âŽ¥
    âŽ£âŽ1 - â„¯   âŽ â‹…â„¯     â‹…sin(Î¸)â‹…cos(Î¸)  âŽâ„¯   â‹…cos (Î¸) + sin (Î¸)âŽ â‹…â„¯     âŽ¦

    r   r   )r   r	   r   r   r
   )r   ÚdeltaÚRr   r   r   Úphase_retarder˜  s    '$ÿ"ÿþr!   c                 C   s
   t | tƒS )u¥  A half-wave retarder Jones matrix at angle ``theta``.

    Parameters
    ==========

    theta : numeric type or SymPy Symbol
        The angle of the fast axis relative to the horizontal plane.

    Returns
    =======

    SymPy Matrix
        A Jones matrix representing the retarder.

    Examples
    ========

    A generic half-wave plate.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import half_wave_retarder
    >>> theta= symbols("theta", real=True)
    >>> HWP = half_wave_retarder(theta)
    >>> pprint(HWP, use_unicode=True)
    âŽ¡   âŽ›     2         2   âŽž                        âŽ¤
    âŽ¢-â…ˆâ‹…âŽ- sin (Î¸) + cos (Î¸)âŽ     -2â‹…â…ˆâ‹…sin(Î¸)â‹…cos(Î¸)  âŽ¥
    âŽ¢                                                âŽ¥
    âŽ¢                             âŽ›   2         2   âŽžâŽ¥
    âŽ£   -2â‹…â…ˆâ‹…sin(Î¸)â‹…cos(Î¸)     -â…ˆâ‹…âŽsin (Î¸) - cos (Î¸)âŽ âŽ¦

    ©r!   r   ©r   r   r   r   Úhalf_wave_retarderÆ  s     r$   c                 C   s   t | td ƒS )u?  A quarter-wave retarder Jones matrix at angle ``theta``.

    Parameters
    ==========

    theta : numeric type or SymPy Symbol
        The angle of the fast axis relative to the horizontal plane.

    Returns
    =======

    SymPy Matrix
        A Jones matrix representing the retarder.

    Examples
    ========

    A generic quarter-wave plate.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import quarter_wave_retarder
    >>> theta= symbols("theta", real=True)
    >>> QWP = quarter_wave_retarder(theta)
    >>> pprint(QWP, use_unicode=True)
    âŽ¡                       -â…ˆâ‹…Ï€            -â…ˆâ‹…Ï€               âŽ¤
    âŽ¢                       â”€â”€â”€â”€â”€           â”€â”€â”€â”€â”€              âŽ¥
    âŽ¢âŽ›     2         2   âŽž    4               4                âŽ¥
    âŽ¢âŽâ…ˆâ‹…sin (Î¸) + cos (Î¸)âŽ â‹…â„¯       (1 - â…ˆ)â‹…â„¯     â‹…sin(Î¸)â‹…cos(Î¸)âŽ¥
    âŽ¢                                                          âŽ¥
    âŽ¢         -â…ˆâ‹…Ï€                                        -â…ˆâ‹…Ï€ âŽ¥
    âŽ¢         â”€â”€â”€â”€â”€                                       â”€â”€â”€â”€â”€âŽ¥
    âŽ¢           4                  âŽ›   2           2   âŽž    4  âŽ¥
    âŽ£(1 - â…ˆ)â‹…â„¯     â‹…sin(Î¸)â‹…cos(Î¸)  âŽsin (Î¸) + â…ˆâ‹…cos (Î¸)âŽ â‹…â„¯     âŽ¦

    r   r"   r#   r   r   r   Úquarter_wave_retarderé  s    $r%   c                 C   s   t t| ƒdgdt| ƒggƒS )uT  An attenuator Jones matrix with transmittance ``T``.

    Parameters
    ==========

    T : numeric type or SymPy Symbol
        The transmittance of the attenuator.

    Returns
    =======

    SymPy Matrix
        A Jones matrix representing the filter.

    Examples
    ========

    A generic filter.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import transmissive_filter
    >>> T = symbols("T", real=True)
    >>> NDF = transmissive_filter(T)
    >>> pprint(NDF, use_unicode=True)
    âŽ¡âˆšT  0 âŽ¤
    âŽ¢      âŽ¥
    âŽ£0   âˆšTâŽ¦

    r   ©r   r   )ÚTr   r   r   Útransmissive_filter  s    r(   c                 C   s   t t| ƒdgdt| ƒ ggƒS )u?  A reflective filter Jones matrix with reflectance ``R``.

    Parameters
    ==========

    R : numeric type or SymPy Symbol
        The reflectance of the filter.

    Returns
    =======

    SymPy Matrix
        A Jones matrix representing the filter.

    Examples
    ========

    A generic filter.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import reflective_filter
    >>> R = symbols("R", real=True)
    >>> pprint(reflective_filter(R), use_unicode=True)
    âŽ¡âˆšR   0 âŽ¤
    âŽ¢       âŽ¥
    âŽ£0   -âˆšRâŽ¦

    r   r&   )r    r   r   r   Úreflective_filter1  s    r)   c                 C   sP   t ddddgddddgddddgdt tdggƒ}t|t| |  ¡ ƒ | ¡  ƒS )u~  The Mueller matrix corresponding to Jones matrix `J`.

    Parameters
    ==========

    J : SymPy Matrix
        A Jones matrix.

    Returns
    =======

    SymPy Matrix
        The corresponding Mueller matrix.

    Examples
    ========

    Generic optical components.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import (mueller_matrix,
    ...     linear_polarizer, half_wave_retarder, quarter_wave_retarder)
    >>> theta = symbols("theta", real=True)

    A linear_polarizer

    >>> pprint(mueller_matrix(linear_polarizer(theta)), use_unicode=True)
    âŽ¡            cos(2â‹…Î¸)      sin(2â‹…Î¸)     âŽ¤
    âŽ¢  1/2       â”€â”€â”€â”€â”€â”€â”€â”€      â”€â”€â”€â”€â”€â”€â”€â”€    0âŽ¥
    âŽ¢               2             2         âŽ¥
    âŽ¢                                       âŽ¥
    âŽ¢cos(2â‹…Î¸)  cos(4â‹…Î¸)   1    sin(4â‹…Î¸)     âŽ¥
    âŽ¢â”€â”€â”€â”€â”€â”€â”€â”€  â”€â”€â”€â”€â”€â”€â”€â”€ + â”€    â”€â”€â”€â”€â”€â”€â”€â”€    0âŽ¥
    âŽ¢   2         4       4       4         âŽ¥
    âŽ¢                                       âŽ¥
    âŽ¢sin(2â‹…Î¸)    sin(4â‹…Î¸)    1   cos(4â‹…Î¸)   âŽ¥
    âŽ¢â”€â”€â”€â”€â”€â”€â”€â”€    â”€â”€â”€â”€â”€â”€â”€â”€    â”€ - â”€â”€â”€â”€â”€â”€â”€â”€  0âŽ¥
    âŽ¢   2           4        4      4       âŽ¥
    âŽ¢                                       âŽ¥
    âŽ£   0           0             0        0âŽ¦

    A half-wave plate

    >>> pprint(mueller_matrix(half_wave_retarder(theta)), use_unicode=True)
    âŽ¡1              0                           0               0 âŽ¤
    âŽ¢                                                             âŽ¥
    âŽ¢        4           2                                        âŽ¥
    âŽ¢0  8â‹…sin (Î¸) - 8â‹…sin (Î¸) + 1           sin(4â‹…Î¸)            0 âŽ¥
    âŽ¢                                                             âŽ¥
    âŽ¢                                     4           2           âŽ¥
    âŽ¢0          sin(4â‹…Î¸)           - 8â‹…sin (Î¸) + 8â‹…sin (Î¸) - 1  0 âŽ¥
    âŽ¢                                                             âŽ¥
    âŽ£0              0                           0               -1âŽ¦

    A quarter-wave plate

    >>> pprint(mueller_matrix(quarter_wave_retarder(theta)), use_unicode=True)
    âŽ¡1       0             0            0    âŽ¤
    âŽ¢                                        âŽ¥
    âŽ¢   cos(4â‹…Î¸)   1    sin(4â‹…Î¸)             âŽ¥
    âŽ¢0  â”€â”€â”€â”€â”€â”€â”€â”€ + â”€    â”€â”€â”€â”€â”€â”€â”€â”€    -sin(2â‹…Î¸)âŽ¥
    âŽ¢      2       2       2                 âŽ¥
    âŽ¢                                        âŽ¥
    âŽ¢     sin(4â‹…Î¸)    1   cos(4â‹…Î¸)           âŽ¥
    âŽ¢0    â”€â”€â”€â”€â”€â”€â”€â”€    â”€ - â”€â”€â”€â”€â”€â”€â”€â”€  cos(2â‹…Î¸) âŽ¥
    âŽ¢        2        2      2               âŽ¥
    âŽ¢                                        âŽ¥
    âŽ£0    sin(2â‹…Î¸)     -cos(2â‹…Î¸)        0    âŽ¦

    r   r   éÿÿÿÿ)r   r   r   r   r   Úinv)ÚJÚAr   r   r   Úmueller_matrixQ  s    G

ýr.   c              	   C   s€   t t| ƒdtt|ƒ dgdt|ƒdt t|ƒ tt| ƒ gtt|ƒ dt| ƒdgdt t|ƒ tt| ƒ dt|ƒggƒ}|S )a“  A polarizing beam splitter Jones matrix at angle `theta`.

    Parameters
    ==========

    J : SymPy Matrix
        A Jones matrix.
    Tp : numeric type or SymPy Symbol
        The transmissivity of the P-polarized component.
    Rs : numeric type or SymPy Symbol
        The reflectivity of the S-polarized component.
    Ts : numeric type or SymPy Symbol
        The transmissivity of the S-polarized component.
    Rp : numeric type or SymPy Symbol
        The reflectivity of the P-polarized component.
    phia : numeric type or SymPy Symbol
        The phase difference between transmitted and reflected component for
        output mode a.
    phib : numeric type or SymPy Symbol
        The phase difference between transmitted and reflected component for
        output mode b.


    Returns
    =======

    SymPy Matrix
        A 4x4 matrix representing the PBS. This matrix acts on a 4x1 vector
        whose first two entries are the Jones vector on one of the PBS ports,
        and the last two entries the Jones vector on the other port.

    Examples
    ========

    Generic polarizing beam-splitter.

    >>> from sympy import pprint, symbols
    >>> from sympy.physics.optics.polarization import polarizing_beam_splitter
    >>> Ts, Rs, Tp, Rp = symbols(r"Ts, Rs, Tp, Rp", positive=True)
    >>> phia, phib = symbols("phi_a, phi_b", real=True)
    >>> PBS = polarizing_beam_splitter(Tp, Rs, Ts, Rp, phia, phib)
    >>> pprint(PBS, use_unicode=False)
    [   ____                           ____                    ]
    [ \/ Tp            0           I*\/ Rp           0         ]
    [                                                          ]
    [                  ____                       ____  I*phi_a]
    [   0            \/ Ts            0      -I*\/ Rs *e       ]
    [                                                          ]
    [    ____                         ____                     ]
    [I*\/ Rp           0            \/ Tp            0         ]
    [                                                          ]
    [               ____  I*phi_b                    ____      ]
    [   0      -I*\/ Rs *e            0            \/ Ts       ]

    r   )r   r   r   r   )ZTpZRsZTsZRpZphiaZphibZPBSr   r   r   Úpolarizing_beam_splitter   s    8$$ýr/   N)r   r   )r   )r   r   )r   r   r   r   r   r   ) Ú__doc__Zsympy.core.numbersr   r   Z$sympy.functions.elementary.complexesr   r   r   Z&sympy.functions.elementary.exponentialr   Z(sympy.functions.elementary.miscellaneousr   Z(sympy.functions.elementary.trigonometricr	   r
   Zsympy.matrices.denser   Zsympy.simplify.simplifyr   Zsympy.physics.quantumr   r   r   r   r   r!   r$   r%   r(   r)   r.   r/   r   r   r   r   Ú<module>   s&   Tc
~/
'
.#'! O