{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MTFs\n", "\n", "`prysm` models often include analysis of Modulation Transfer Function (MTF) data. The MTF is formally defined as:\n", "\n", "> the normalized magnitude of the Fourier transform of the Point Spread Function\n", "\n", "It is nothing more and nothing less. It may not be negative, complex-valued, or equal to any value other than unity at the origin.\n", "\n", "Initializing an MTF model should feel similar to a [PSF](./PSFs.ipynb)," ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from prysm import MTF\n", "x = y = 1/np.linspace(-1,1,128)\n", "z = np.random.random((128,128))\n", "mt = MTF(data=z, x=x, y=y)\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MTFs are usually created from a PSF instance" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from prysm import Pupil, PSF\n", "pu = Pupil(dia=10, wavelength=0.5)\n", "ps = PSF.from_pupil(pu, efl=20)\n", "mt = MTF.from_psf(ps)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If modeling the MTF directly from a pupil plane, the intermediate PSF plane may be skipped;" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "mt = MTF.from_pupil(pu, Q=2, efl=20) # Q, efl same as PSF.from_pupil" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Much like a PSF or other Convolvable, MTFs have quick-access slices" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([ 0. , 3.95244712, 7.90489424, 11.85734136,\n", " 15.80978848, 19.7622356 , 23.71468272, 27.66712984,\n", " 31.61957696, 35.57202409, 39.52447121, 43.47691833,\n", " 47.42936545, 51.38181257, 55.33425969, 59.28670681,\n", " 63.23915393, 67.19160105, 71.14404817, 75.09649529,\n", " 79.04894241, 83.00138953, 86.95383665, 90.90628377,\n", " 94.85873089, 98.81117801, 102.76362514, 106.71607226,\n", " 110.66851938, 114.6209665 , 118.57341362, 122.52586074,\n", " 126.47830786, 130.43075498, 134.3832021 , 138.33564922,\n", " 142.28809634, 146.24054346, 150.19299058, 154.1454377 ,\n", " 158.09788482, 162.05033194, 166.00277906, 169.95522618,\n", " 173.90767331, 177.86012043, 181.81256755, 185.76501467,\n", " 189.71746179, 193.66990891, 197.62235603, 201.57480315,\n", " 205.52725027, 209.47969739, 213.43214451, 217.38459163,\n", " 221.33703875, 225.28948587, 229.24193299, 233.19438011,\n", " 237.14682723, 241.09927436, 245.05172148, 249.0041686 ,\n", " 252.95661572, 256.90906284, 260.86150996, 264.81395708,\n", " 268.7664042 , 272.71885132, 276.67129844, 280.62374556,\n", " 284.57619268, 288.5286398 , 292.48108692, 296.43353404,\n", " 300.38598116, 304.33842828, 308.29087541, 312.24332253,\n", " 316.19576965, 320.14821677, 324.10066389, 328.05311101,\n", " 332.00555813, 335.95800525, 339.91045237, 343.86289949,\n", " 347.81534661, 351.76779373, 355.72024085, 359.67268797,\n", " 363.62513509, 367.57758221, 371.53002933, 375.48247646,\n", " 379.43492358, 383.3873707 , 387.33981782, 391.29226494,\n", " 395.24471206, 399.19715918, 403.1496063 , 407.10205342,\n", " 411.05450054, 415.00694766, 418.95939478, 422.9118419 ,\n", " 426.86428902, 430.81673614, 434.76918326, 438.72163038,\n", " 442.67407751, 446.62652463, 450.57897175, 454.53141887,\n", " 458.48386599, 462.43631311, 466.38876023, 470.34120735,\n", " 474.29365447, 478.24610159, 482.19854871, 486.15099583,\n", " 490.10344295, 494.05589007, 498.00833719, 501.96078431,\n", " 505.91323143, 509.86567855, 513.81812568, 517.7705728 ,\n", " 521.72301992, 525.67546704, 529.62791416, 533.58036128,\n", " 537.5328084 , 541.48525552, 545.43770264, 549.39014976,\n", " 553.34259688, 557.295044 , 561.24749112, 565.19993824,\n", " 569.15238536, 573.10483248, 577.0572796 , 581.00972673,\n", " 584.96217385, 588.91462097, 592.86706809, 596.81951521,\n", " 600.77196233, 604.72440945, 608.67685657, 612.62930369,\n", " 616.58175081, 620.53419793, 624.48664505, 628.43909217,\n", " 632.39153929, 636.34398641, 640.29643353, 644.24888065,\n", " 648.20132778, 652.1537749 , 656.10622202, 660.05866914,\n", " 664.01111626, 667.96356338, 671.9160105 , 675.86845762,\n", " 679.82090474, 683.77335186, 687.72579898, 691.6782461 ,\n", " 695.63069322, 699.58314034, 703.53558746, 707.48803458,\n", " 711.4404817 , 715.39292883, 719.34537595, 723.29782307,\n", " 727.25027019, 731.20271731, 735.15516443, 739.10761155,\n", " 743.06005867, 747.01250579, 750.96495291, 754.91740003,\n", " 758.86984715, 762.82229427, 766.77474139, 770.72718851,\n", " 774.67963563, 778.63208275, 782.58452987, 786.536977 ,\n", " 790.48942412, 794.44187124, 798.39431836, 802.34676548,\n", " 806.2992126 , 810.25165972, 814.20410684, 818.15655396,\n", " 822.10900108, 826.0614482 , 830.01389532, 833.96634244,\n", " 837.91878956, 841.87123668, 845.8236838 , 849.77613092,\n", " 853.72857805, 857.68102517, 861.63347229, 865.58591941,\n", " 869.53836653, 873.49081365, 877.44326077, 881.39570789,\n", " 885.34815501, 889.30060213, 893.25304925, 897.20549637,\n", " 901.15794349, 905.11039061, 909.06283773, 913.01528485,\n", " 916.96773197, 920.9201791 , 924.87262622, 928.82507334,\n", " 932.77752046, 936.72996758, 940.6824147 , 944.63486182,\n", " 948.58730894, 952.53975606, 956.49220318, 960.4446503 ,\n", " 964.39709742, 968.34954454, 972.30199166, 976.25443878,\n", " 980.2068859 , 984.15933302, 988.11178015, 992.06422727,\n", " 996.01667439, 999.96912151, 1003.92156863, 1007.87401575]),\n", " array([1.00000000e+00, 9.94097672e-01, 9.89117775e-01, 9.84394062e-01,\n", " 9.79468091e-01, 9.74533237e-01, 9.69554731e-01, 9.64537867e-01,\n", " 9.59518878e-01, 9.54516791e-01, 9.49502751e-01, 9.44477472e-01,\n", " 9.39454415e-01, 9.34434579e-01, 9.29401831e-01, 9.24376615e-01,\n", " 9.19364085e-01, 9.14348856e-01, 9.09320218e-01, 9.04298404e-01,\n", " 8.99282529e-01, 8.94267461e-01, 8.89248258e-01, 8.84234552e-01,\n", " 8.79220956e-01, 8.74208979e-01, 8.69203917e-01, 8.64194357e-01,\n", " 8.59185056e-01, 8.54183405e-01, 8.49186128e-01, 8.44187920e-01,\n", " 8.39193622e-01, 8.34203302e-01, 8.29209927e-01, 8.24219107e-01,\n", " 8.19236823e-01, 8.14257203e-01, 8.09273672e-01, 8.04295010e-01,\n", " 7.99318832e-01, 7.94343789e-01, 7.89379369e-01, 7.84416408e-01,\n", " 7.79451894e-01, 7.74494137e-01, 7.69546532e-01, 7.64596888e-01,\n", " 7.59646666e-01, 7.54707842e-01, 7.49765201e-01, 7.44825233e-01,\n", " 7.39895274e-01, 7.34970446e-01, 7.30049636e-01, 7.25133566e-01,\n", " 7.20220883e-01, 7.15309874e-01, 7.10405126e-01, 7.05505623e-01,\n", " 7.00607625e-01, 6.95715998e-01, 6.90830789e-01, 6.85954190e-01,\n", " 6.81078508e-01, 6.76206527e-01, 6.71341934e-01, 6.66484731e-01,\n", " 6.61632226e-01, 6.56785163e-01, 6.51940424e-01, 6.47103533e-01,\n", " 6.42273726e-01, 6.37447202e-01, 6.32628424e-01, 6.27816824e-01,\n", " 6.23007959e-01, 6.18206676e-01, 6.13415736e-01, 6.08631311e-01,\n", " 6.03848881e-01, 5.99071723e-01, 5.94302599e-01, 5.89543145e-01,\n", " 5.84792036e-01, 5.80044287e-01, 5.75300942e-01, 5.70568877e-01,\n", " 5.65843977e-01, 5.61126589e-01, 5.56418258e-01, 5.51716796e-01,\n", " 5.47020136e-01, 5.42332176e-01, 5.37651986e-01, 5.32979405e-01,\n", " 5.28315311e-01, 5.23661656e-01, 5.19013280e-01, 5.14374843e-01,\n", " 5.09744291e-01, 5.05123412e-01, 5.00511532e-01, 4.95907921e-01,\n", " 4.91310716e-01, 4.86722250e-01, 4.82144788e-01, 4.77576895e-01,\n", " 4.73019490e-01, 4.68471614e-01, 4.63930082e-01, 4.59398541e-01,\n", " 4.54877284e-01, 4.50369272e-01, 4.45870546e-01, 4.41378062e-01,\n", " 4.36895035e-01, 4.32424506e-01, 4.27966429e-01, 4.23517322e-01,\n", " 4.19078479e-01, 4.14650812e-01, 4.10233055e-01, 4.05828310e-01,\n", " 4.01432912e-01, 3.97048867e-01, 3.92675648e-01, 3.88315303e-01,\n", " 3.83966532e-01, 3.79628667e-01, 3.75301673e-01, 3.70987952e-01,\n", " 3.66687484e-01, 3.62398632e-01, 3.58121194e-01, 3.53857260e-01,\n", " 3.49603985e-01, 3.45364346e-01, 3.41137264e-01, 3.36923497e-01,\n", " 3.32725321e-01, 3.28538754e-01, 3.24364049e-01, 3.20204869e-01,\n", " 3.16056006e-01, 3.11923649e-01, 3.07804928e-01, 3.03699414e-01,\n", " 2.99609345e-01, 2.95533915e-01, 2.91473758e-01, 2.87427491e-01,\n", " 2.83393985e-01, 2.79377793e-01, 2.75375682e-01, 2.71388716e-01,\n", " 2.67417516e-01, 2.63461535e-01, 2.59521815e-01, 2.55598722e-01,\n", " 2.51690560e-01, 2.47799978e-01, 2.43925890e-01, 2.40067463e-01,\n", " 2.36225899e-01, 2.32401768e-01, 2.28595197e-01, 2.24806141e-01,\n", " 2.21032365e-01, 2.17278597e-01, 2.13543080e-01, 2.09824809e-01,\n", " 2.06124392e-01, 2.02442820e-01, 1.98780451e-01, 1.95135878e-01,\n", " 1.91510899e-01, 1.87905024e-01, 1.84322539e-01, 1.80760141e-01,\n", " 1.77208957e-01, 1.73679822e-01, 1.70175047e-01, 1.66690830e-01,\n", " 1.63225380e-01, 1.59783080e-01, 1.56361937e-01, 1.52961344e-01,\n", " 1.49583185e-01, 1.46227033e-01, 1.42893653e-01, 1.39582578e-01,\n", " 1.36294968e-01, 1.33030917e-01, 1.29789136e-01, 1.26571872e-01,\n", " 1.23379492e-01, 1.20210416e-01, 1.17066050e-01, 1.13948136e-01,\n", " 1.10856557e-01, 1.07789271e-01, 1.04748263e-01, 1.01734357e-01,\n", " 9.87466982e-02, 9.57853254e-02, 9.28521643e-02, 8.99469365e-02,\n", " 8.70714189e-02, 8.42251481e-02, 8.14061743e-02, 7.86157006e-02,\n", " 7.58570607e-02, 7.31309690e-02, 7.04357261e-02, 6.77701487e-02,\n", " 6.51366438e-02, 6.25364639e-02, 5.99709775e-02, 5.74380672e-02,\n", " 5.49419492e-02, 5.24794077e-02, 5.00525932e-02, 4.76626808e-02,\n", " 4.53101660e-02, 4.29958038e-02, 4.07217572e-02, 3.84848060e-02,\n", " 3.62907841e-02, 3.41372565e-02, 3.20270905e-02, 2.99613776e-02,\n", " 2.79396095e-02, 2.59615107e-02, 2.40344828e-02, 2.21544009e-02,\n", " 2.03256361e-02, 1.85467348e-02, 1.68239297e-02, 1.51546317e-02,\n", " 1.35462449e-02, 1.19957012e-02, 1.05081388e-02, 9.08756489e-03,\n", " 7.73768814e-03, 6.46015940e-03, 5.26437329e-03, 4.14982861e-03,\n", " 3.13280144e-03, 2.21578487e-03, 1.41685604e-03, 7.51529327e-04,\n", " 2.99346589e-04, 7.04332525e-05, 6.10434825e-06, 1.24805758e-08]))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mt.slices().azavg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The MTF at exact frequencies may be queried through any of the following methods: `exact_polar`, takes arguments of freqs and azimuths. If there is a single frequency and multiple azimuths, the MTF at each azimuth and and the specified radial spatial frequency will be returned. The reverse is true for a single azimuth and multiple frequencies. `exact_xy` follows the same semantics, but with Cartesian coordinates instead of polar. `exact_x` and `exact_y` both take a single argument of freq, which may be an int, float, or ndarray.\n", "\n", "Finally, MTFs may be plotted:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(
,\n", " )" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mt.slices().plot(['x', 'y'], xlim=(0,1000), fig=None, ax=None)\n", "mt.plot2d(xlim=1000, power=1/2, fig=None, ax=None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "all arguments have these default values. The axes of plot2d will span (-max_freq, max_freq) on both x and y.\n", "\n", "This example should be familiar as the diffraction limited MTF of a circular aperture." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }