{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Jones_matrix class\n", "\n", "Jones_matrix is a class that manages Jones matrices. It allows the user to create and manipulate them.\n", "\n", "## Creating an instance\n", "\n", "An instance must be created before starting to operate with the Jones matrix. The initialization accepts one argument: the name of the vector. This name will be used for printing:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from py_pol.jones_matrix import Jones_matrix, create_Jones_matrices\n", "from py_pol.mueller import Mueller\n", "from py_pol.utils import degrees\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "empty_polarizer is empty\n", "\n" ] } ], "source": [ "J = Jones_matrix(\"empty_polarizer\")\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Several Jones_matrix objects can be created at the same time using the function *create_Jones_matrices*." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Element 1 is empty\n", " Element 2 is empty\n", "\n", "[J is empty\n", ", J is empty\n", ", J is empty\n", "]\n" ] } ], "source": [ "J1, J2 = create_Jones_matrices(name=('Element 1', 'Element 2'))\n", "print(J1, J2)\n", "\n", "list_of_J = create_Jones_matrices(N=3)\n", "print(list_of_J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jones_matrix class fields\n", "\n", "Jones_matrix class objects have some fields where some methods and information is stored:\n", "\n", "* **M**: 2x2xN array containing all the Jones matrices.\n", "* **name**: Name of the object for print purposes.\n", "* **shape**: Shape desired for the outputs.\n", "* **size**: Number of stored Jones matrices.\n", "* **ndim**: Number of dimensions for representation purposes.\n", "* **no_rotation**: If True, rotation method do not act upon the object. Useful for objects that shouldn't be rotated as mirrors.\n", "* **_type**: Type of the object ('Jones_matrix'). This is used for determining the object class as using isinstance may throw unexpected results in .ipynb files.\n", "\n", "Jones_matrix class has three classes which groups different methods to extract information:\n", "\n", "* **parameters**: Object of class *Parameters_Jones_matrix*.\n", "* **checks**: Object of class *Checks_Jones_matrix*.\n", "* **analysis**: Object of class *Analysis_Jones_matrix*." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Array: [[[1.00000000e+00+0.j 8.68198052e-01+0.j 5.50000000e-01+0.j\n", " 2.31801948e-01+0.j 1.00000000e-01+0.j]\n", " [0.00000000e+00+0.j 3.18198052e-01+0.j 4.50000000e-01+0.j\n", " 3.18198052e-01+0.j 5.51091060e-17+0.j]]\n", "\n", " [[0.00000000e+00+0.j 3.18198052e-01+0.j 4.50000000e-01+0.j\n", " 3.18198052e-01+0.j 5.51091060e-17+0.j]\n", " [1.00000000e-01+0.j 2.31801948e-01+0.j 5.50000000e-01+0.j\n", " 8.68198052e-01+0.j 1.00000000e+00+0.j]]]\n", "Name: Linear diattenuator\n", "Shape: [5]\n", "Size: 5\n", "Size: 1\n", "Type: Jones_matrix \n", "\n", "Parameters (global phase): \n", " [0. 0. 0. 0. 0.] \n", "\n", "Checks (element is homogeneous): \n", " [ True True True True True] \n", "\n", "Analysis (as diattenuator): \n", " ([array([1., 1., 1., 1., 1.]), array([0.01, 0.01, 0.01, 0.01, 0.01]), array([1., 1., 1., 1., 1.]), array([0.1, 0.1, 0.1, 0.1, 0.1])], [array([0. , 0.39269908, 0.78539816, 1.17809725, 1.57079633]), array([0., 0., 0., 0., 0.]), array([0. , 0.39269908, 0.78539816, 1.17809725, 1.57079633]), array([0., 0., 0., 0., 0.])]) \n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Linear diattenuator\")\n", "angles = np.linspace(0, 90*degrees, 5)\n", "J.diattenuator_linear(p1=1, p2=0.1, azimuth=angles)\n", "\n", "print('Array: ', J.M)\n", "print('Name: ', J.name)\n", "print('Shape: ', J.shape)\n", "print('Size: ', J.size)\n", "print('Size: ', J.ndim)\n", "print('Type: ', J._type, '\\n')\n", "\n", "print('Parameters (global phase): \\n', J.parameters.global_phase(), '\\n')\n", "print('Checks (element is homogeneous): \\n', J.checks.is_homogeneous(), '\\n')\n", "print('Analysis (as diattenuator): \\n', J.analysis.diattenuator(), '\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That is, the output beam is linearly polarized in the direction of the linear polarized axis, and some light is absorbed by the polarized." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating of optical elements\n", "\n", "As shown in the previous example, the Jones matrix is initialized with all elements equal to zero. There are many methods that can be used to generate a more desirable vector:\n", "\n", "* **from_components**: Creates a Jones_matrix object directly from the 4 elements (m00, m01, m10, m11).\n", "* **from_matrix**: Creates a Jones_matrix object directly from a 2x2xN numpy arrays.\n", "* **from_list**: Creates a Jones_matrix object directly from a list of 2x2 numpy arrays.\n", "* **from_Mueller**: Takes a non-depolarizing Mueller Matrix and converts into Jones matrix.\n", "* **vacuum**: Creates the matrix for vacuum.\n", "* **mirror**: Creates the matrix for a mirror. NOTE: Don't rotate this matrix.\n", "* **filter_amplifier**: Creates the matrix for a neutral filter or amplifier element\n", "* **diattenuator_perfect**: Creates a perfect linear diattenuator.\n", "* **diattenuator_linear**: Creates a real polarizer with perpendicular axes.\n", "* **diattenuator_general**: Creates the most general homogeneous diattenuator.\n", "* **diattenuator_charac_angles**: Creates the most general homogeneous diattenuator from the characteristic angles of the main eigenstate.\n", "* **diattenuator_azimuth_ellipticity**: Creates the general homogeneous diattenuator from the characteristic angles of the main eigenstate.\n", "* **quarter_waveplate**: Creates a quarter-waveplate.\n", "* **half_waveplate**: Creates a half-waveplate.\n", "* **retarder_linear**: Creates a retarder using delay.\n", "* **retarder_general**: Creates the most general homogeneous retarder.\n", "* **retarder_charac_angles**: Creates the most general homogenous retarder from the characteristic angles of the main eigenstate.\n", "* **retarder_azimuth_ellipticity**: Creates the general homogeneous retarder from the characteristic angles of the main eigenstate. \n", "* **diattenuator_retarder_linear**: Creates a linear diattenuator retarder with the same axes for diattenuation and retardance.\n", "* **diattenuator_retarder_general**: Creates the most general homogeneous diattenuator retarder.\n", "* **diattenuator_retarder_charac_angles**: Creates the most general homogeneous retarder from the characteristic angles of the main eigenstate.\n", "* **diattenuator_retarder_azimuth_ellipticity**: Creates the general homogeneous retarder from the characteristic angles of the main eigenstate.\n", "* **biaxial_material**: Creates a retarder using physical properties of a anisotropic material.\n", "* **general_eigenstates**: Generates the most general pure optical element from its eigenstates.\n", "\n", "For a more detailed description of each method, refer to the individual documentation of each one.\n", "\n", "Example: Linear polarizer." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer @ 10.00 deg = \n", "[+0.970 +0.171] \n", "[+0.171 +0.030] \n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Polarizer\")\n", "J.diattenuator_perfect(azimuth=10*degrees)\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The previous example only stores one Jones matrix. It is possible to store many Jones matrices in the same object. This is useful specially when the same operation is performed upon all of them, as rotation. In this way, it is not required to use for loops, reducing significantly the computation time.\n", "\n", "There are many ways of creating several Jones matrices in the same object. The first way is creating an object with several identical vectors. This is performed using the *length* argument of most of creation methods:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+0.750 +0.433] [+0.750 +0.433] [+0.750 +0.433] \n", "[+0.433 +0.250] [+0.433 +0.250] [+0.433 +0.250] \n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Polarizer\")\n", "J.diattenuator_perfect(azimuth = 30*degrees, length = 3)\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A second way of creating several Jones matrices at the same time is using an array as one of the parameters. Take into account that, if you use this option, all parameters must have the same number of elements or just one element. Otherwise, the program will throw an exception." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] [+0.854 +0.354] [+0.500 +0.500] [+0.146 +0.354] [+0.000 +0.000] \n", "[+0.000 +0.000] [+0.354 +0.146] [+0.500 +0.500] [+0.354 +0.854] [+0.000 +1.000] \n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Polarizer\")\n", "angles = np.linspace(0, 90*degrees, 5)\n", "J.diattenuator_perfect(azimuth = angles)\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the parameters have dimension higher than 1, the program will store that information in order to make prints and plots. In that case, the *print* function separates the four components Jones matrices:\n", "\n", "$$J=\\left[\\begin{array}{cc}\n", "J_{00} & J_{01}\\\\\n", "J_{10} & J_{11}\n", "\\end{array}\\right]$$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer J00 = \n", "[[0.9146759 +0.j 0.01129533+0.j 0.76815199+0.j]\n", " [0.87160191+0.j 0.79111437+0.j 0.80802083+0.j]\n", " [0.02389002+0.j 0.99708157+0.j 0.8412461 +0.j]]\n", "Polarizer J01 = \n", "[[ 0.27936337+0.j -0.10567755+0.j 0.42201245+0.j]\n", " [ 0.33453254+0.j -0.40651251+0.j 0.39385679+0.j]\n", " [ 0.15270654+0.j 0.05394358+0.j 0.36544643+0.j]]\n", "Polarizer J10 = \n", "[[ 0.27936337+0.j -0.10567755+0.j 0.42201245+0.j]\n", " [ 0.33453254+0.j -0.40651251+0.j 0.39385679+0.j]\n", " [ 0.15270654+0.j 0.05394358+0.j 0.36544643+0.j]]\n", "Polarizer J11 = \n", "[[0.0853241 +0.j 0.98870467+0.j 0.23184801+0.j]\n", " [0.12839809+0.j 0.20888563+0.j 0.19197917+0.j]\n", " [0.97610998+0.j 0.00291843+0.j 0.1587539 +0.j]]\n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Polarizer\")\n", "angles = np.random.rand(3,3) * 180*degrees\n", "J.diattenuator_perfect(azimuth = angles)\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to transform *Mueller* objects into *Jones_matrix* objects. Any depolarization properties are removed in the process." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "J = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n" ] } ], "source": [ "M = Mueller().diattenuator_perfect(azimuth=0)\n", "J = Jones_matrix().from_Mueller(M)\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Features of creation methods\n", "\n", "*py_pol* model sets the origin of phase in $J_{00}$. It means that the parameter *global_phase* of most creation methods and the methods *remove_global_phase* and *set_global_phase* (see below) will take it as the reference." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer @ 45.00 deg = \n", "[+0.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Polarizer @ 45.00 deg = \n", "[+0.500 +0.500] \n", "[+0.500 +0.500] \n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Polarizer\")\n", "J.diattenuator_perfect(azimuth = 45*degrees, global_phase = 90*degrees)\n", "print(J)\n", "\n", "J.remove_global_phase()\n", "print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic operations\n", "\n", "Some physical phenomena that affects polarization optical elements is described by simple operations performed to their Jones matrices.\n", "\n", "### Multiplication of a Jones matrix by a Jones vector\n", "\n", "When a light beam $E_1$ goes through a polarization optical element $J_1$, the polarization state of the output beam can be determined as: $E_2 = J_1 * E_1$. This can be implemented in *py_pol* as:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "J1 = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "E1 = \n", "[+0.707] \n", "[+0.707] \n", "\n", "J1 * E1 = \n", "[+0.707] \n", "[+0.000] \n", "\n" ] } ], "source": [ "from py_pol.jones_vector import Jones_vector\n", "J1 = Jones_matrix(\"J1\")\n", "J1.diattenuator_perfect(azimuth=0*degrees)\n", "print(J1)\n", "\n", "E1 = Jones_vector(\"E1\")\n", "E1.linear_light(azimuth=45*degrees)\n", "print(E1)\n", "\n", "E2 = J1 * E1\n", "print(E2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Multiplication of 2 Jones matrices\n", "\n", "When two polarizing elementsare placed one after the other in the light path, first $J_1$ and then $J_2$, the system composed of both elements can be described by a single Jones matrix $J_3$, which is calculated as $J_3 = J_2 * J_1$.\n", "\n", "Example: Matrix representing a perfect linear polarized and a $\\lambda/4$ retarder." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Retarder @ 45.00 deg = \n", "[+0.500 +0.500] \n", "[+0.500 +0.500] \n", "\n", "Retarder @ 45.00 deg * Polarizer = \n", "[+0.500 +0.000] \n", "[+0.500 +0.000] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_perfect()\n", "print(J1)\n", "\n", "J2 = Jones_matrix(\"Retarder\")\n", "J2.quarter_waveplate(azimuth=45*degrees)\n", "print(J2)\n", "\n", "J3 = J2 * J1\n", "print(J3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Multiplication by a constant\n", "\n", "The absorption and gain experienced by a light wave that goes through a polarization optical element can be increased or decreased by multiplying its Jones matrix by a real number." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer @ 30.00 deg = \n", "[+0.750 +0.433] \n", "[+0.433 +0.250] \n", "\n", "Polarizer @ 30.00 deg * 2 = \n", "[+1.500 +0.866] \n", "[+0.866 +0.500] \n", "\n", "Polarizer @ 30.00 deg / 2 = \n", "[+0.375 +0.217] \n", "[+0.217 +0.125] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_perfect(azimuth=30*degrees)\n", "print(J1)\n", "\n", "J2 = 2 * J1\n", "print(J2)\n", "\n", "J2 = J1 / 2\n", "print(J2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The global phase change experienced by the light wave can also be changed by multiplying the Jones matrix of the element by a complex number." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer @ 30.00 deg = \n", "[+0.750 +0.433] \n", "[+0.433 +0.250] \n", "\n", "Polarizer @ 30.00 deg * 1j = \n", "[+0.000 +0.000] \n", "[+0.000 +0.000] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_perfect(azimuth=30*degrees)\n", "print(J1)\n", "\n", "c = 1j\n", "J2 = c * J1\n", "print(J2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Addition of two Jones matrices\n", "\n", "The physical meaning of this operation is a little bit more complex. Imagine a light wave $E_0$ which goes through two spatially separated polarization optical elements $J_1$ and $J_2$. If the light waves are then coherently added, the behavior of the two elements can be described by a single Jones matrix $J_3 = J_1 + J_2$." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Retarder @ 45.00 deg = \n", "[+0.500 +0.500] \n", "[+0.500 +0.500] \n", "\n", "Retarder @ 45.00 deg + Polarizer = \n", "[+1.500 +0.500] \n", "[+0.500 +0.500] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_perfect()\n", "print(J1)\n", "J2 = Jones_matrix(\"Retarder\")\n", "J2.quarter_waveplate(azimuth=45*degrees)\n", "print(J2)\n", "\n", "J3 = J2 + J1\n", "print(J3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Equality\n", "\n", "It is possible to compare two *Jones_matrix* objects and tell if they are the same. It just compares the matrix components, not the rest of object fields." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Retarder 1 = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Retarder 2 @ 0.01 deg = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Comparison: False\n" ] } ], "source": [ "J1 = Jones_matrix(\"Retarder 1\")\n", "J1.quarter_waveplate(azimuth=0*degrees)\n", "print(J1)\n", "J2 = Jones_matrix(\"Retarder 2\")\n", "J2.quarter_waveplate(azimuth=0.01*degrees)\n", "print(J2)\n", "\n", "print('Comparison: ', E1==E2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Operations and multidimensionality\n", "\n", "The basic operations of *Jones_matrix* objects are subject to the same casting rules as numpy arrays. This means that they can be easily used even if one or both elements of the operation have more than one element.\n", "\n", "Here are some examples:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Retarder = \n", "[+1.000 +0.000] [+0.750 +0.433] [+0.250 +0.433] [+0.000 +0.000] \n", "[+0.000 +0.000] [+0.433 +0.250] [+0.433 +0.750] [+0.000 +1.000] \n", "\n", "Retarder * Polarizer = \n", "[+1.000 +0.000] [+0.750 +0.000] [+0.250 +0.000] [+0.000 +0.000] \n", "[+0.000 +0.000] [+0.433 +0.000] [+0.433 +0.000] [+0.000 +0.000] \n", "\n" ] } ], "source": [ "# Multiplication of two Jones matrices\n", "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_perfect()\n", "print(J1)\n", "J2 = Jones_matrix(\"Retarder\")\n", "angles = np.linspace(0, 90*degrees, 4)\n", "J2.quarter_waveplate(azimuth=angles)\n", "print(J2)\n", "\n", "J3 = J2 * J1\n", "print(J3)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer @ 30.00 deg = \n", "[+0.750 +0.433] \n", "[+0.433 +0.250] \n", "\n", "J = \n", "[+0.189 +0.109] [+0.658 +0.380] [+0.634 +0.366] [+0.102 +0.059] \n", "[+0.109 +0.063] [+0.380 +0.219] [+0.366 +0.211] [+0.059 +0.034] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_perfect(azimuth=30*degrees)\n", "print(J1)\n", "\n", "c = 1j + np.random.rand(4)\n", "J2 = c * J1\n", "print(J2)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] [+0.750 +0.433] [+0.250 +0.433] [+0.000 +0.000] \n", "[+0.000 +0.000] [+0.433 +0.250] [+0.433 +0.750] [+0.000 +1.000] \n", "\n", "Retarder = \n", "[+0.000 +0.000] [+0.250 -0.433] [+0.750 -0.433] [+1.000 -0.000] \n", "[+0.000 +1.000] [-0.433 +0.750] [-0.433 +0.250] [-0.000 +0.000] \n", "\n", "Retarder + Polarizer = \n", "[+1.000 +0.000] [+1.000 +0.000] [+1.000 -0.000] [+1.000 -0.000] \n", "[+0.000 +1.000] [+0.000 +1.000] [-0.000 +1.000] [-0.000 +1.000] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "angles = np.linspace(0, 90*degrees, 4)\n", "J1.diattenuator_perfect(azimuth=angles)\n", "print(J1)\n", "J2 = Jones_matrix(\"Retarder\")\n", "J2.quarter_waveplate(azimuth=90*degrees+angles)\n", "print(J2)\n", "\n", "J3 = J2 + J1\n", "print(J3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jones matrix manipulation\n", "\n", "There are several operations that can be applied to a Jones matrix. Some of them are common to all py_pol objects and are inherited from their parent *Py_pol* class:\n", "\n", "* **clear**: Removes data and name form Jones vector.\n", "* **copy**: Creates a copy of the Jones_vector object.\n", "* **stretch**: Stretches a Jones vector of size 1.\n", "* **shape_like**: Takes the shape of another object to use as its own.\n", "* **reshape**: Changes the shape of the object.\n", "* **flatten**: Transforms N-D objects into 1-D objects (0-D if only 1 element).\n", "* **flip**: Flips the object along some dimensions.\n", "* **get_list**: Creates a list with single elements.\n", "* **from_list**: Creates the object from a list of single elements.\n", "* **concatenate**: Canocatenates several objects into a single one.\n", "* **draw**: Draws the components of the object.\n", "* **clear**: Clears the information of the object.\n", "\n", "The rest of the manipulation methods are:\n", "\n", "* **rotate**: Rotates the Jones matrix.\n", "* **sum**: Calculates the summatory of the Jones matrices in the object.\n", "* **prod**: Calculates the product of the Jones matrices in the object.\n", "* **remove_global_phase**: Removes the phase introduced by the optical element (respect to J00).\n", "* **add_global_phase**: Increases the phase introduced by the optical element.\n", "* **set_global_phase**: Sets the phase introduced by the optical element.\n", "* **reciprocal**: The optical element is fliped so the light transverses it in the opposite direction.\n", "* **transpose**: Transposes the Jones matrix of the element.\n", "* **hermitan**: Calculates the hermitan matrix of the Jones matrix.\n", "* **inverse**: Calculates the inverse matrix of the Jones matrix.\n", "\n", "All the methods return a *Jones_matrix* object. For a more detailed description of each method, refer to the individual documentation of each one.\n", "\n", "Example: inverse." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] \n", "[+0.000 +0.200] \n", " \n", "\n", "Inverse of Polarizer = \n", "[+1.000 +0.000] \n", "[+0.000 +5.000] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_linear(p1=1, p2=0.2)\n", "print(J1,'\\n')\n", "\n", "Inv = J1.inverse()\n", "print(Inv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All manipulation methods have the *keep* argument that specifies if the originial object must be preserved or transformed. If *keep* is True (default is False), a new object is created:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] \n", "[+0.000 +0.200] \n", " J2 = \n", "[+0.600 +0.400] \n", "[+0.400 +0.600] \n", "\n", "J2 = \n", "[+0.600 +0.400] \n", "[+0.400 +0.600] \n", " J2 = \n", "[+0.600 +0.400] \n", "[+0.400 +0.600] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "J1.diattenuator_linear(p1=1, p2=0.2)\n", "\n", "J2 = J1.rotate(angle=45*degrees, keep=True)\n", "J2.name = 'J2'\n", "print(J1, J2)\n", "\n", "J2 = J1.rotate(angle=45*degrees, keep=False)\n", "J2.name = 'J2'\n", "print(J1, J2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Jones_matrix* objects allow taking elements and changing them through indices like a *numpy.ndarray*.\n", "\n", "Examples:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original J00 = \n", "[[0.2427003 +0.j 0.83680528+0.j 0.49415743+0.j 0.3494361 +0.j\n", " 0.51691834+0.j]\n", " [0.74940353+0.j 0.15056623+0.j 0.88741593+0.j 0.17529797+0.j\n", " 0.45592376+0.j]\n", " [0.34251418+0.j 0.83540615+0.j 0.94662159+0.j 0.45095752+0.j\n", " 0.61134041+0.j]]\n", "Original J01 = \n", "[[0.18120135+0.j 0.47057596+0.j 0.34842914+0.j 0.74597368+0.j\n", " 0.4727434 +0.j]\n", " [0.74792405+0.j 0.0327115 +0.j 0.14106218+0.j 0.82525365+0.j\n", " 0.62216015+0.j]\n", " [0.13612136+0.j 0.92291119+0.j 0.41760627+0.j 0.6381236 +0.j\n", " 0.13419595+0.j]]\n", "Original J10 = \n", "[[0.69347798+0.j 0.13973507+0.j 0.83948509+0.j 0.92395274+0.j\n", " 0.48242732+0.j]\n", " [0.63991581+0.j 0.91578376+0.j 0.08508936+0.j 0.85635078+0.j\n", " 0.38343872+0.j]\n", " [0.5457108 +0.j 0.66463643+0.j 0.53205792+0.j 0.8104139 +0.j\n", " 0.02617972+0.j]]\n", "Original J11 = \n", "[[0.93627798+0.j 0.1214582 +0.j 0.90444555+0.j 0.54911483+0.j\n", " 0.4650621 +0.j]\n", " [0.85463828+0.j 0.23123486+0.j 0.09972302+0.j 0.62925417+0.j\n", " 0.04923351+0.j]\n", " [0.96474192+0.j 0.24052581+0.j 0.52204289+0.j 0.46353065+0.j\n", " 0.96966382+0.j]]\n", "\n", "Original_picked = \n", "[+0.243 +0.181] [+0.837 +0.471] [+0.494 +0.348] \n", "[+0.693 +0.936] [+0.140 +0.121] [+0.839 +0.904] \n", "\n" ] } ], "source": [ "M = np.random.rand(2, 2, 3, 5)\n", "J = Jones_matrix('Original')\n", "J.from_matrix(M)\n", "print(J)\n", "\n", "J2 = J[0:3]\n", "print(J2)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Polarizer = \n", "[+1.000 +0.000] [+0.750 +0.433] [+0.250 +0.433] [+0.000 +0.000] \n", "[+0.000 +0.000] [+0.433 +0.250] [+0.433 +0.750] [+0.000 +1.000] \n", "\n", "Retarder = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "Modified = \n", "[+1.000 +0.000] [+0.750 +0.433] [+1.000 +0.000] [+0.000 +0.000] \n", "[+0.000 +0.000] [+0.433 +0.250] [+0.000 +0.000] [+0.000 +1.000] \n", "\n" ] } ], "source": [ "J1 = Jones_matrix(\"Polarizer\")\n", "angles = np.linspace(0, 90*degrees, 4)\n", "J1.diattenuator_perfect(azimuth=angles)\n", "print(J1)\n", "\n", "J2 = Jones_matrix(\"Retarder\")\n", "J2.quarter_waveplate()\n", "print(J2)\n", "\n", "J1[2] = J2\n", "J1.name = 'Modified'\n", "print(J1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Picking and setting\n", "\n", "*Py_pol* objects allow taking elements and changing them through indices like a *numpy.ndarray*.\n", "\n", "Examples:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original = \n", "[+0.088 +0.435] [+0.992 +0.159] [+0.236 +0.388] [+0.616 +0.618] [+0.663 +0.845] \n", "[+0.967 +0.084] [+0.079 +0.858] [+0.830 +0.514] [+0.409 +0.592] [+0.863 +0.086] \n", "\n", "Original_picked = \n", "[+0.992 +0.159] [+0.236 +0.388] \n", "[+0.079 +0.858] [+0.830 +0.514] \n", "\n" ] } ], "source": [ "M = np.random.rand(2, 2, 5)\n", "J1 = Jones_matrix('Original')\n", "J1.from_matrix(M)\n", "print(J1)\n", "\n", "J2 = J1[1:3]\n", "print(J2)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original J00 = \n", "[[1. 0.95677273 0.8345653 0.6545085 ]\n", " [0.44773577 0.25 0.0954915 0.0109262 ]\n", " [0.0109262 0.0954915 0.25 0.44773577]\n", " [0.6545085 0.8345653 0.95677273 1. ]]\n", "Original J01 = \n", "[[ 0.00000000e+00 2.03368322e-01 3.71572413e-01 4.75528258e-01]\n", " [ 4.97260948e-01 4.33012702e-01 2.93892626e-01 1.03955845e-01]\n", " [-1.03955845e-01 -2.93892626e-01 -4.33012702e-01 -4.97260948e-01]\n", " [-4.75528258e-01 -3.71572413e-01 -2.03368322e-01 -1.22464680e-16]]\n", "Original J10 = \n", "[[ 0.00000000e+00 2.03368322e-01 3.71572413e-01 4.75528258e-01]\n", " [ 4.97260948e-01 4.33012702e-01 2.93892626e-01 1.03955845e-01]\n", " [-1.03955845e-01 -2.93892626e-01 -4.33012702e-01 -4.97260948e-01]\n", " [-4.75528258e-01 -3.71572413e-01 -2.03368322e-01 -1.22464680e-16]]\n", "Original J11 = \n", "[[0.00000000e+00 4.32272712e-02 1.65434697e-01 3.45491503e-01]\n", " [5.52264232e-01 7.50000000e-01 9.04508497e-01 9.89073800e-01]\n", " [9.89073800e-01 9.04508497e-01 7.50000000e-01 5.52264232e-01]\n", " [3.45491503e-01 1.65434697e-01 4.32272712e-02 1.49975978e-32]]\n", "\n", "Original_picked J00 = \n", "[[0.0954915 0.0109262 ]\n", " [0.25 0.44773577]]\n", "Original_picked J01 = \n", "[[ 0.29389263 0.10395585]\n", " [-0.4330127 -0.49726095]]\n", "Original_picked J10 = \n", "[[ 0.29389263 0.10395585]\n", " [-0.4330127 -0.49726095]]\n", "Original_picked J11 = \n", "[[0.9045085 0.9890738 ]\n", " [0.75 0.55226423]]\n", "\n" ] } ], "source": [ "J1 = Jones_matrix('Original')\n", "angles = np.linspace(0,180*degrees, 16)\n", "J1.diattenuator_linear(azimuth=angles, shape=[4,4])\n", "print(J1)\n", "\n", "J2 = J1[1:3,2:4]\n", "print(J2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Iterating\n", "\n", "*Py_pol* objects are iterable. When introduced in a for loop, a new object picking in the first dimension is returned." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "J_picked = \n", "[+1.000 +0.000] \n", "[+0.000 +0.000] \n", "\n", "J_picked = \n", "[+0.500 +0.500] \n", "[+0.500 +0.500] \n", "\n", "J_picked = \n", "[+0.000 +0.000] \n", "[+0.000 +1.000] \n", "\n", "J_picked = \n", "[+0.500 -0.500] \n", "[-0.500 +0.500] \n", "\n", "J_picked = \n", "[+1.000 -0.000] \n", "[-0.000 +0.000] \n", "\n" ] } ], "source": [ "angles = np.linspace(0, 180*degrees, 5)\n", "Jtotal = Jones_matrix().diattenuator_linear(azimuth=angles)\n", "for J in Jtotal:\n", " print(J)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parameters of Jones_matrix\n", "\n", "Several parameters can be measured from a Jones matrix. They are implemented in the independent class *Parameters_Jones_Matrix*, which is stored in the *parameters* field of *Jones_matrix* class.\n", "\n", "* **matrix**: Gets a numpy array with all the matrices.\n", "* **components**: Extracts the four components of the Jones matrix.\n", "* **inhomogeneity**: Calculates the inhomogeneity parameter.\n", "* **diattenuation / polarizance**: Calculates the diattenuation of the matrix.\n", "* **retardance**: Calculates the retardance (or delay) introduced between the fast and slow axes.\n", "* **global_phase**: Calculates the phase introduced by the optical element (respect to J00).\n", "* **transmissions**: Calculates the maximum and minimum field and/or intensity transmissions.\n", "* **mean_transmission**: Calculates the mean intensity transmission.\n", "* **eig**: Calculates the eigenvalues and eigenstates (eigenvectors) of the Jones matrices.\n", "* **eigenvalues**: Calculates the eigenvalues and of the Jones matrices.\n", "* **eigenstates**: Calculates the eigenstates (eigenvectors) of the Jones matrices.\n", "* **det**: Calculates the determinant and of the Jones matrices.\n", "* **trace**: Calculates the trace of the Jones matrices.\n", "* **norm**: Calculates the norm of the Jones matrices.\n", "\n", "\n", "* **get_all**: Returns a dictionary with all the parameters of the object.\n", "\n", "For a more detailed description of each method, refer to the individual documentation of each one.\n", "\n", "Example:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Retardance = 90.0º\n" ] } ], "source": [ "J = Jones_matrix(\"Diattenuator retarder\")\n", "J.diattenuator_retarder_linear(R=90*degrees, p1=1, p2=0.5, azimuth=30*degrees)\n", "R = J.parameters.retardance()\n", "print(\"Retardance = {:2.1f}º\".format(R/degrees))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When several Jones matrices are stored in the object, setting *verbose* argument to *True* makes the method print the values in screen. Also, 1D or 2D figures can be shown if the *draw* argument is set to *True*::" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The retardance of Diattenuator retarder is (deg.):\n", "[ 0. 15. 30. 45. 60. 75. 90. 105. 120. 135. 150. 165. 180.]\n", "The mean value is 90.0 +- 56.12486080160913\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "J = Jones_matrix(\"Diattenuator retarder\")\n", "R = np.linspace(0, 180*degrees, 13)\n", "J.diattenuator_retarder_linear(R=R, p1=1, p2=0.5, azimuth=30*degrees)\n", "R = J.parameters.retardance(verbose=True, draw=True)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The field transmissions of Diattenuator are:\n", "The mean value of param Maximum (int.) is 0.7500000000003215 +- 0.14546964399033177\n", "The mean value of param Minimum (int.) is 0.24999999999967848 +- 0.14546964399033177\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "J = Jones_matrix(\"Diattenuator\")\n", "p1 = np.linspace(0.5, 1, 128)\n", "p2 = np.linspace(0, 0.5, 128)\n", "P1, P2 = np.meshgrid(p1, p2)\n", "J.diattenuator_linear(p1=P1, p2=P2, azimuth=30*degrees)\n", "P1, P2 = J.parameters.transmissions(kind='field', draw=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a function in *Parameters_Jones_Matrix* class, **.get_all()** that computes all the parameters available and stores in a dictionary **.dict_params()**. This function is called when using print upon the *Parameters_Jones_Matrix* class.\n", "\n", "Example:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diattenuator retarder @ 30.00 deg = \n", "[+0.750 +0.433] \n", "[+0.433 +0.250] \n", " \n", "\n", "The matrix components of Diattenuator retarder @ 30.00 deg are:\n", " J00\n", "(0.7500000000000001+0.12499999999999997j)\n", " J01\n", "(0.4330127018922193-0.21650635094610965j)\n", " J10\n", "(0.4330127018922193-0.21650635094610965j)\n", " J11\n", "(0.24999999999999997+0.37500000000000006j)\n", "Low dimensionality, figure not available.\n", "\n", "The diattenuation of Diattenuator retarder @ 30.00 deg is:\n", "[0.6]\n", "Low dimensionality, figure not available.\n", "\n", "The retardance of Diattenuator retarder @ 30.00 deg is (deg.):\n", "90.00000000000001\n", "Low dimensionality, figure not available.\n", "\n", "The global phase of Diattenuator retarder @ 30.00 deg is (deg.):\n", "9.462322208025613\n", "Low dimensionality, figure not available.\n", "\n", "The inhomogeneity parameter of Diattenuator retarder @ 30.00 deg is:\n", "8.881784197001253e-17\n", "Low dimensionality, figure not available.\n", "\n", "The intensity transmissions of Diattenuator retarder @ 30.00 deg are:\n", " Maximum (int.)\n", "1.0000000000000002\n", " Minimum (int.)\n", "0.24999999999999994\n", "Low dimensionality, figure not available.\n", "\n", "The field transmissions of Diattenuator retarder @ 30.00 deg are:\n", " Maximum (int.)\n", "1.0\n", " Minimum (int.)\n", "0.49999999999999994\n", "Low dimensionality, figure not available.\n", "\n", "The mean transmission of Diattenuator retarder @ 30.00 deg is:\n", "0.3750000000000001\n", "Low dimensionality, figure not available.\n", "\n", "The determinant of Diattenuator retarder @ 30.00 deg is:\n", "(2.775557561562892e-17+0.5j)\n", "Low dimensionality, figure not available.\n", "\n", "The trace of Diattenuator retarder @ 30.00 deg is:\n", "(1+0.5j)\n", "Low dimensionality, figure not available.\n", "\n", "The norm of Diattenuator retarder @ 30.00 deg is:\n", "1.118033988749895\n", "Low dimensionality, figure not available.\n", "\n", "The eigenvalues of Diattenuator retarder @ 30.00 deg are:\n", " v1\n", "[1.-5.55111512e-17j]\n", " v2\n", "[-5.55111512e-17+0.5j]\n", "Low dimensionality, figure not available.\n", "\n", "The eigenvectors of Diattenuator retarder @ 30.00 deg are:\n", " e1x\n", "[0.8660254+0.j]\n", " e1y\n", "[0.5+0.j]\n", " e2x\n", "[-0.5+5.55111512e-17j]\n", " e2y\n", "[0.8660254+0.j]\n", "Low dimensionality, figure not available.\n", "\n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Diattenuator retarder\")\n", "J.diattenuator_retarder_linear(R=90*degrees, p1=1, p2=0.5, azimuth=30*degrees)\n", "print(J,'\\n') \n", "print(J.parameters)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Checks of Jones_matrix\n", "\n", "There are several checks that can be performed upon a Jones vector. They are implemented in the independent class *Checks_Jones_matrix*, which is stored in the *checks* field of *Jones_matrix* class.\n", "\n", "* **is_phisycall**: Check if the Jones matrices correspond to physically realizable optical elements.\n", "* **is_homogeneous**: Determines if the matrices correspond to homogeneous optical elements.\n", "* **is_retarder**: Checks if the Jones matrices correspond to homogeneous retarders.\n", "* **is_diattenuator / is_polarizer**: Checks if the Jones matrices correspond to homogeneous diattenuators.\n", "* **is_symmetric**: Checks if the Jones matrices are symmetric.\n", "* **is_conjugate_symmetric**: Checks if the Jones matrices are conjugate symmetric.\n", "* **is_eigenstate**: Checks if a given light state is an eigenstate of the objct.\n", "\n", "\n", "\n", "* **get_all**: Returns a dictionary with all the checks of the object.\n", "\n", "For a more detailed description of each method, refer to the individual documentation of each one.\n", "\n", "Example:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diattenuator retarder @ 30.00 deg is an homogeneous retarder:\n", "False\n", "\n" ] } ], "source": [ "J = Jones_matrix(\"Diattenuator retarder\")\n", "J.diattenuator_retarder_linear(R=90*degrees, p1=1, p2=0.5, azimuth=30*degrees)\n", "cond = J.checks.is_retarder(verbose=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As with the *Parameters_Jones_matrix* class, 1D and 2D plot draws are also implemented for this class. Also, the *print* function calls to *get_all*:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diattenuator retarder is an homogeneous diattenuator:\n", "The mean value is 0.1 +- 0.30000000000000004\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "R = np.random.rand(20) * 180*degrees\n", "R[R < 50*degrees] = 0 # In some cases, the diattenuator retarder is reduced to a pure diattenuator\n", "\n", "J = Jones_matrix(\"Diattenuator retarder\")\n", "J.diattenuator_retarder_linear(R=R, p1=1, p2=0.5, azimuth=30*degrees)\n", "cond = J.checks.is_diattenuator(draw=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis of Jones_matrix\n", "\n", "There are several analysis that can be performed upon a Jones vector. They are implemented in the independent class *Analysis_Jones_matrix*, which is stored in the *analysis* field of *Jones_matrix* class.\n", "\n", "* **decompose_pure**: Decomposes the Jones matrices in two: an homogeneous retarder and diattenuator.\n", "* **diattenuator / polarizer**: Analyzes the Jones matrices as if they were diattenuators.\n", "* **retarder**: Analyzes the Jones matrices as if they were retarders.\n", "\n", "\n", "* **get_all**: Returns a dictionary with all the analysis information of the object.\n", "\n", "Note: Some methods are still to be finished.\n", "\n", "For a more detailed description of each method, refer to the individual documentation of each one.\n", "\n", "Example:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Diattenuator = \n", "[+0.436 +0.022] \n", "[+0.022 +0.437] \n", "\n", "Retarder = \n", "[+0.898 -0.439] \n", "[+0.303 +0.662] \n", "\n", "Product Diattenuator = \n", "[+0.436 +0.022] \n", "[+0.022 +0.437] \n", " Product Retarder = \n", "[+0.898 -0.439] \n", "[+0.303 +0.662] \n", "\n" ] } ], "source": [ "# Create a random diattenuator\n", "p1, p2 = np.random.rand(2)\n", "alpha, delta = np.random.rand(2) * 90*degrees\n", "delta = delta*4\n", "Jd = Jones_matrix(\"Diattenuator\")\n", "Jd.diattenuator_charac_angles(p1=p1, p2=p2, alpha=alpha, delay=delta)\n", "print(Jd)\n", "# Create a random retarder\n", "R, alpha, delta = np.random.rand(3) * 90*degrees\n", "(R, delta) = (R*2, delta*4)\n", "Jr = Jones_matrix(\"Retarder\")\n", "Jr.retarder_charac_angles(R=R, alpha=alpha, delay=delta)\n", "print(Jr)\n", "\n", "# Multiply them and try to decompose\n", "J = Jr * Jd\n", "J.name = 'Product'\n", "Jr2, Jd2 = J.analysis.decompose_pure(decomposition='RD')\n", "print(Jd2, Jr2)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.12" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }