├── README.md ├── day1 └── index.md ├── day2 ├── Martin-Carrillo_past.pdf ├── Moss_arXiver_small.pdf ├── PythonAstronomy2015-Gomez.pdf ├── Tollerud_Astropy.pdf ├── index.md └── moorhead.pdf ├── day3 ├── EJeschke_Ginga_LT.pdf ├── Smith_yt.pdf ├── Terron_LEMON_differential_photometry.pdf ├── index.md ├── servillat_CTA-VO_PiA.pdf ├── tardis_leiden.pdf └── vanElteren_intro_to_AMUSE_astropy2015.pdf ├── day4 ├── CVilforth_CheatSheet_Print.pdf ├── CVilforth_PythonTutorial_Data.txt ├── CVilforth_Worksheet.ipynb ├── Dencheva_gwcs │ ├── dist.asdf │ ├── foc2sky.asdf │ ├── gwcs_demo.ipynb │ ├── gwcs_slides.ipynb │ ├── pix2sky.asdf │ └── tools.py ├── archibald.pdf ├── crawford_data_reduction │ ├── data_pyastro15.ipynb │ └── data_pyastro15_slides.pdf └── index.md └── day5 ├── Greenfield_Python_at_STScI.pdf ├── JoeZuntz-CosmoSIS.pdf ├── craig-astropy-undergrads.pdf ├── index.md └── ishida_COIN.pdf /README.md: -------------------------------------------------------------------------------- 1 | # talk_slides 2 | Talk slides from the Python in Astronomy 2015 workshop are in this repository. 3 | 4 | Thanks to Zenodo, they now have a DOI and are citable! 5 | [![DOI](https://zenodo.org/badge/13007/python-in-astronomy/talk_slides.svg)](http://dx.doi.org/10.5281/zenodo.17666) 6 | 7 | 8 | -------------------------------------------------------------------------------- /day1/index.md: -------------------------------------------------------------------------------- 1 | Edit this file to add your link here. 2 | -------------------------------------------------------------------------------- /day2/Martin-Carrillo_past.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day2/Martin-Carrillo_past.pdf -------------------------------------------------------------------------------- /day2/Moss_arXiver_small.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day2/Moss_arXiver_small.pdf -------------------------------------------------------------------------------- /day2/PythonAstronomy2015-Gomez.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day2/PythonAstronomy2015-Gomez.pdf -------------------------------------------------------------------------------- /day2/Tollerud_Astropy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day2/Tollerud_Astropy.pdf -------------------------------------------------------------------------------- /day2/index.md: -------------------------------------------------------------------------------- 1 | Links 2 | ===== 3 | 4 | **Kyle Barbary: SEP lightning talk** 5 | 6 | - [Demo notebook](http://nbviewer.ipython.org/gist/kbarbary/f689153cbec3bc869849) 7 | - [Docs](https://sep.readthedocs.org) 8 | - [Code](https://github.com/kbarbary/sep) 9 | -------------------------------------------------------------------------------- /day2/moorhead.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day2/moorhead.pdf -------------------------------------------------------------------------------- /day3/EJeschke_Ginga_LT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day3/EJeschke_Ginga_LT.pdf -------------------------------------------------------------------------------- /day3/Smith_yt.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day3/Smith_yt.pdf -------------------------------------------------------------------------------- /day3/Terron_LEMON_differential_photometry.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day3/Terron_LEMON_differential_photometry.pdf -------------------------------------------------------------------------------- /day3/index.md: -------------------------------------------------------------------------------- 1 | Edit this file to add your link here. 2 | 3 | [Prefig](https://speakerdeck.com/rjsmethurst/prefig), R. Smethurst 4 | 5 | [Performance tutorial](http://stsdas.stsci.edu/download/mdroe/coverage/index.html), M. Droettboom 6 | 7 | [Python packaging](https://docs.google.com/document/d/1EpC1Lhy3q-NfSNWPLkerfBWcugFQCBNEJat6IA5k-6k/edit?pli=1), E. Bray 8 | -------------------------------------------------------------------------------- /day3/servillat_CTA-VO_PiA.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day3/servillat_CTA-VO_PiA.pdf -------------------------------------------------------------------------------- /day3/tardis_leiden.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day3/tardis_leiden.pdf -------------------------------------------------------------------------------- /day3/vanElteren_intro_to_AMUSE_astropy2015.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day3/vanElteren_intro_to_AMUSE_astropy2015.pdf -------------------------------------------------------------------------------- /day4/CVilforth_CheatSheet_Print.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day4/CVilforth_CheatSheet_Print.pdf -------------------------------------------------------------------------------- /day4/CVilforth_Worksheet.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "Worksheet.ipynb" 4 | }, 5 | "nbformat": 3, 6 | "nbformat_minor": 0, 7 | "worksheets": [ 8 | { 9 | "cells": [ 10 | { 11 | "cell_type": "heading", 12 | "level": 1, 13 | "metadata": {}, 14 | "source": [ 15 | "Python Lab - Learning Programming using Quasars" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "Quasars are amongst the most luminous astronomical objects. They are powered by black holes accreting gas from their surroundings. Despite their small sizes, much smaller than the galaxies they reside in, quasars outshine their \u201chost\u201d galaxies, in some cases they can be more than 100 times brighter. In this tutorial, we will analyze properties of quasars from the Sloan Digital Sky Survey (sdss.org).\n", 23 | "\n", 24 | "Note: all logarithms in this tutorial use base 10, not e!" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "Useful links:\n", 32 | "\n", 33 | "* [Numpy Example List](http://wiki.scipy.org/Numpy_Example_List_With_Doc)\n", 34 | "* [matplotlib/pylab webpage](http://matplotlib.org/api/pyplot_summary.html)\n", 35 | "* [documentation for pylab.plot](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot)" 36 | ] 37 | }, 38 | { 39 | "cell_type": "raw", 40 | "metadata": {}, 41 | "source": [ 42 | "Before getting started, import numpy and pylab as described in the tutorial." 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "collapsed": false, 48 | "input": [ 49 | "import numpy" 50 | ], 51 | "language": "python", 52 | "metadata": {}, 53 | "outputs": [], 54 | "prompt_number": 1 55 | }, 56 | { 57 | "cell_type": "code", 58 | "collapsed": false, 59 | "input": [], 60 | "language": "python", 61 | "metadata": {}, 62 | "outputs": [], 63 | "prompt_number": 2 64 | }, 65 | { 66 | "cell_type": "heading", 67 | "level": 2, 68 | "metadata": {}, 69 | "source": [ 70 | "Question 1: Loading Data" 71 | ] 72 | }, 73 | { 74 | "cell_type": "raw", 75 | "metadata": {}, 76 | "source": [ 77 | "Load the data file provided using numpy.loadtxt(). The data columns are given in the header." 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "collapsed": false, 83 | "input": [], 84 | "language": "python", 85 | "metadata": {}, 86 | "outputs": [] 87 | }, 88 | { 89 | "cell_type": "heading", 90 | "level": 2, 91 | "metadata": {}, 92 | "source": [ 93 | "Question 2: Array Basics" 94 | ] 95 | }, 96 | { 97 | "cell_type": "raw", 98 | "metadata": {}, 99 | "source": [ 100 | "What is the range of log(L5100)? What is the minimum and maximum? What is the mean?" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "collapsed": false, 106 | "input": [], 107 | "language": "python", 108 | "metadata": {}, 109 | "outputs": [] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "collapsed": false, 114 | "input": [], 115 | "language": "python", 116 | "metadata": {}, 117 | "outputs": [] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "collapsed": false, 122 | "input": [], 123 | "language": "python", 124 | "metadata": {}, 125 | "outputs": [] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "collapsed": false, 130 | "input": [], 131 | "language": "python", 132 | "metadata": {}, 133 | "outputs": [] 134 | }, 135 | { 136 | "cell_type": "heading", 137 | "level": 2, 138 | "metadata": {}, 139 | "source": [ 140 | "Question 3: Getting started with plotting" 141 | ] 142 | }, 143 | { 144 | "cell_type": "raw", 145 | "metadata": {}, 146 | "source": [ 147 | "Plot some data from the file. Can you see any correlations? Label the axis on all your plots." 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "collapsed": false, 153 | "input": [], 154 | "language": "python", 155 | "metadata": {}, 156 | "outputs": [] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "collapsed": false, 161 | "input": [], 162 | "language": "python", 163 | "metadata": {}, 164 | "outputs": [] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "collapsed": false, 169 | "input": [], 170 | "language": "python", 171 | "metadata": {}, 172 | "outputs": [] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "collapsed": false, 177 | "input": [], 178 | "language": "python", 179 | "metadata": {}, 180 | "outputs": [] 181 | }, 182 | { 183 | "cell_type": "heading", 184 | "level": 2, 185 | "metadata": {}, 186 | "source": [ 187 | "Question 4: Plotting Part II: Histograms" 188 | ] 189 | }, 190 | { 191 | "cell_type": "raw", 192 | "metadata": {}, 193 | "source": [ 194 | "Plot a histogram of the logarithm of the luminosity at 5100A. Remember to label your axis." 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "collapsed": false, 200 | "input": [], 201 | "language": "python", 202 | "metadata": {}, 203 | "outputs": [] 204 | }, 205 | { 206 | "cell_type": "heading", 207 | "level": 2, 208 | "metadata": {}, 209 | "source": [ 210 | "Question 5: Understanding data using plots" 211 | ] 212 | }, 213 | { 214 | "cell_type": "raw", 215 | "metadata": {}, 216 | "source": [ 217 | "\u201cAbsolute magnitudes\u201d are given in the data as well. They are also a measure of how bright an object is. What is their range? From this data, can you say how magnitudes work?" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "collapsed": false, 223 | "input": [], 224 | "language": "python", 225 | "metadata": {}, 226 | "outputs": [] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "collapsed": false, 231 | "input": [], 232 | "language": "python", 233 | "metadata": {}, 234 | "outputs": [] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "collapsed": false, 239 | "input": [], 240 | "language": "python", 241 | "metadata": {}, 242 | "outputs": [] 243 | }, 244 | { 245 | "cell_type": "heading", 246 | "level": 2, 247 | "metadata": {}, 248 | "source": [ 249 | "Question 6: Complex calculations using arrays" 250 | ] 251 | }, 252 | { 253 | "cell_type": "raw", 254 | "metadata": {}, 255 | "source": [ 256 | "The table contains some values that can be used to calculate the mass of the black hole: the velocity dispersion of the gas and the luminosity at 3000\u00c5. You can calculate the black hole mass for all objects using the formula below. What is the range of black hole masses?" 257 | ] 258 | }, 259 | { 260 | "cell_type": "markdown", 261 | "metadata": {}, 262 | "source": [ 263 | "$$M_{BH} = 10^{6.86} M_{\\odot} \\times \\left( \\dfrac{FWHM(MgII) [km/s]}{1000 km/s} \\right) ^{2} \\times \\left( \\dfrac{3000 \\times L_{3000} [erg/s]}{10^{44} erg/s}\\right) ^{0.5}$$" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "collapsed": false, 269 | "input": [], 270 | "language": "python", 271 | "metadata": {}, 272 | "outputs": [] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "collapsed": false, 277 | "input": [], 278 | "language": "python", 279 | "metadata": {}, 280 | "outputs": [] 281 | }, 282 | { 283 | "cell_type": "code", 284 | "collapsed": false, 285 | "input": [], 286 | "language": "python", 287 | "metadata": {}, 288 | "outputs": [] 289 | }, 290 | { 291 | "cell_type": "heading", 292 | "level": 2, 293 | "metadata": {}, 294 | "source": [ 295 | "Question 7: Defining a function" 296 | ] 297 | }, 298 | { 299 | "cell_type": "raw", 300 | "metadata": {}, 301 | "source": [ 302 | "Define a function that allows to calculate the black hole mass for any quasar given the velocity dispersion in the gas and the luminosity." 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "collapsed": false, 308 | "input": [], 309 | "language": "python", 310 | "metadata": {}, 311 | "outputs": [] 312 | }, 313 | { 314 | "cell_type": "raw", 315 | "metadata": {}, 316 | "source": [ 317 | " What is the black hole mass of a quasar with the following properties:" 318 | ] 319 | }, 320 | { 321 | "cell_type": "markdown", 322 | "metadata": {}, 323 | "source": [ 324 | "$$FWHM(MgII) = 5000 km\\ s^{-1}, L_{3000} = 10^{45} erg\\ s^{-1}$$" 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "collapsed": false, 330 | "input": [], 331 | "language": "python", 332 | "metadata": {}, 333 | "outputs": [] 334 | }, 335 | { 336 | "cell_type": "heading", 337 | "level": 2, 338 | "metadata": {}, 339 | "source": [ 340 | "Question 8: Fitting data using numpy" 341 | ] 342 | }, 343 | { 344 | "cell_type": "raw", 345 | "metadata": {}, 346 | "source": [ 347 | "Does the logarithm of the black hole mass of an object correlate with the logarithm its luminosity at 5100A?" 348 | ] 349 | }, 350 | { 351 | "cell_type": "code", 352 | "collapsed": false, 353 | "input": [], 354 | "language": "python", 355 | "metadata": {}, 356 | "outputs": [] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "collapsed": false, 361 | "input": [], 362 | "language": "python", 363 | "metadata": {}, 364 | "outputs": [] 365 | }, 366 | { 367 | "cell_type": "raw", 368 | "metadata": {}, 369 | "source": [ 370 | "Show how they are related by fitting a line using numpy.polyfit." 371 | ] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "collapsed": false, 376 | "input": [], 377 | "language": "python", 378 | "metadata": {}, 379 | "outputs": [] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "collapsed": false, 384 | "input": [], 385 | "language": "python", 386 | "metadata": {}, 387 | "outputs": [] 388 | }, 389 | { 390 | "cell_type": "raw", 391 | "metadata": {}, 392 | "source": [ 393 | " Make a plot showing the results." 394 | ] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "collapsed": false, 399 | "input": [], 400 | "language": "python", 401 | "metadata": {}, 402 | "outputs": [] 403 | }, 404 | { 405 | "cell_type": "heading", 406 | "level": 2, 407 | "metadata": {}, 408 | "source": [ 409 | "Question 9: Correlations" 410 | ] 411 | }, 412 | { 413 | "cell_type": "raw", 414 | "metadata": {}, 415 | "source": [ 416 | "The black hole mass and the luminosity look like they are correlated. Let's check if they are correlated using a statitiscal test. Import scipy.stats and then use the function scipy.stats.pearsonr to perform a Pearson rank correlation test. The function will return the correlation coefficient and the so-called p-value. The correlation coefficient is positive if the data are positively correlated (larger x means larger y) and negative if they are anti-correlated (larger x means smaller y). The p-value tells you if the correlation is statistically significant. If it is below 0.05, the correlation is statistically significant. Using the Pearson rand test, can you tell if the correlation is statistically significant? Does the correlation coefficient have a value that you expected from the plot?" 417 | ] 418 | }, 419 | { 420 | "cell_type": "code", 421 | "collapsed": false, 422 | "input": [], 423 | "language": "python", 424 | "metadata": {}, 425 | "outputs": [] 426 | }, 427 | { 428 | "cell_type": "code", 429 | "collapsed": false, 430 | "input": [], 431 | "language": "python", 432 | "metadata": {}, 433 | "outputs": [] 434 | }, 435 | { 436 | "cell_type": "heading", 437 | "level": 2, 438 | "metadata": {}, 439 | "source": [ 440 | "Bonus question I: Advanced array manipulation" 441 | ] 442 | }, 443 | { 444 | "cell_type": "raw", 445 | "metadata": {}, 446 | "source": [ 447 | "Some quasars have powerful jets, these are flows of particles moving close to the speed of light along a narrow beam. Jets emit synchrotron emission, which is visible in the radio. Have a look at the ratio of radio to optical emission (R). How does R correlate with the luminosity?" 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "collapsed": false, 453 | "input": [], 454 | "language": "python", 455 | "metadata": {}, 456 | "outputs": [] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "collapsed": false, 461 | "input": [], 462 | "language": "python", 463 | "metadata": {}, 464 | "outputs": [] 465 | }, 466 | { 467 | "cell_type": "raw", 468 | "metadata": {}, 469 | "source": [ 470 | "There are also morphological types. How many of each are there?" 471 | ] 472 | }, 473 | { 474 | "cell_type": "code", 475 | "collapsed": false, 476 | "input": [], 477 | "language": "python", 478 | "metadata": {}, 479 | "outputs": [] 480 | }, 481 | { 482 | "cell_type": "code", 483 | "collapsed": false, 484 | "input": [], 485 | "language": "python", 486 | "metadata": {}, 487 | "outputs": [] 488 | }, 489 | { 490 | "cell_type": "code", 491 | "collapsed": false, 492 | "input": [], 493 | "language": "python", 494 | "metadata": {}, 495 | "outputs": [] 496 | }, 497 | { 498 | "cell_type": "code", 499 | "collapsed": false, 500 | "input": [], 501 | "language": "python", 502 | "metadata": {}, 503 | "outputs": [] 504 | }, 505 | { 506 | "cell_type": "raw", 507 | "metadata": {}, 508 | "source": [ 509 | "Do objects of morphological type 1 or 2 have higher luminosities?" 510 | ] 511 | }, 512 | { 513 | "cell_type": "code", 514 | "collapsed": false, 515 | "input": [], 516 | "language": "python", 517 | "metadata": {}, 518 | "outputs": [] 519 | }, 520 | { 521 | "cell_type": "code", 522 | "collapsed": false, 523 | "input": [], 524 | "language": "python", 525 | "metadata": {}, 526 | "outputs": [] 527 | }, 528 | { 529 | "cell_type": "raw", 530 | "metadata": {}, 531 | "source": [ 532 | "What about black hole masses?" 533 | ] 534 | }, 535 | { 536 | "cell_type": "code", 537 | "collapsed": false, 538 | "input": [], 539 | "language": "python", 540 | "metadata": {}, 541 | "outputs": [] 542 | }, 543 | { 544 | "cell_type": "code", 545 | "collapsed": false, 546 | "input": [], 547 | "language": "python", 548 | "metadata": {}, 549 | "outputs": [] 550 | }, 551 | { 552 | "cell_type": "heading", 553 | "level": 2, 554 | "metadata": {}, 555 | "source": [ 556 | "Bonus questions II: More advanced array manipulations" 557 | ] 558 | }, 559 | { 560 | "cell_type": "raw", 561 | "metadata": {}, 562 | "source": [ 563 | "The column labelled BAL_FLAG indicates if an object has an ultra-fast outflow detected. 0 means no signs of outflow, 1 and higher indicate an outflow. How many objects have outflows?" 564 | ] 565 | }, 566 | { 567 | "cell_type": "code", 568 | "collapsed": false, 569 | "input": [], 570 | "language": "python", 571 | "metadata": {}, 572 | "outputs": [] 573 | }, 574 | { 575 | "cell_type": "code", 576 | "collapsed": false, 577 | "input": [], 578 | "language": "python", 579 | "metadata": {}, 580 | "outputs": [] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "collapsed": false, 585 | "input": [], 586 | "language": "python", 587 | "metadata": {}, 588 | "outputs": [] 589 | }, 590 | { 591 | "cell_type": "raw", 592 | "metadata": {}, 593 | "source": [ 594 | "What percentage of quasars show outflows?" 595 | ] 596 | }, 597 | { 598 | "cell_type": "code", 599 | "collapsed": false, 600 | "input": [], 601 | "language": "python", 602 | "metadata": {}, 603 | "outputs": [] 604 | }, 605 | { 606 | "cell_type": "code", 607 | "collapsed": false, 608 | "input": [], 609 | "language": "python", 610 | "metadata": {}, 611 | "outputs": [] 612 | }, 613 | { 614 | "cell_type": "code", 615 | "collapsed": false, 616 | "input": [], 617 | "language": "python", 618 | "metadata": {}, 619 | "outputs": [] 620 | }, 621 | { 622 | "cell_type": "raw", 623 | "metadata": {}, 624 | "source": [ 625 | "Divide the sample into objects with and without outflow. How do their luminosities compare?" 626 | ] 627 | }, 628 | { 629 | "cell_type": "code", 630 | "collapsed": false, 631 | "input": [], 632 | "language": "python", 633 | "metadata": {}, 634 | "outputs": [] 635 | }, 636 | { 637 | "cell_type": "code", 638 | "collapsed": false, 639 | "input": [], 640 | "language": "python", 641 | "metadata": {}, 642 | "outputs": [] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "collapsed": false, 647 | "input": [], 648 | "language": "python", 649 | "metadata": {}, 650 | "outputs": [] 651 | }, 652 | { 653 | "cell_type": "code", 654 | "collapsed": false, 655 | "input": [], 656 | "language": "python", 657 | "metadata": {}, 658 | "outputs": [] 659 | } 660 | ], 661 | "metadata": {} 662 | } 663 | ] 664 | } -------------------------------------------------------------------------------- /day4/Dencheva_gwcs/dist.asdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day4/Dencheva_gwcs/dist.asdf -------------------------------------------------------------------------------- /day4/Dencheva_gwcs/foc2sky.asdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day4/Dencheva_gwcs/foc2sky.asdf -------------------------------------------------------------------------------- /day4/Dencheva_gwcs/gwcs_demo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 34, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "from __future__ import division, print_function\n", 12 | "import numpy as np\n", 13 | "from astropy.modeling import models\n", 14 | "from astropy import coordinates as coord\n", 15 | "%matplotlib inline\n", 16 | "from matplotlib import pyplot as plt\n", 17 | "plt.rcParams['image.origin'] = 'lower'\n", 18 | "x, y = np.mgrid[:1000, :1000]" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "### Imaging Example" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 35, 31 | "metadata": { 32 | "collapsed": false, 33 | "slideshow": { 34 | "slide_type": "slide" 35 | } 36 | }, 37 | "outputs": [], 38 | "source": [ 39 | "import tools\n", 40 | "from gwcs import wcs\n" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 36, 46 | "metadata": { 47 | "collapsed": false, 48 | "slideshow": { 49 | "slide_type": "slide" 50 | } 51 | }, 52 | "outputs": [ 53 | { 54 | "name": "stdout", 55 | "output_type": "stream", 56 | "text": [ 57 | " From Transform\n", 58 | "-------- ---------\n", 59 | "detector pix2sky\n", 60 | " icrs None\n" 61 | ] 62 | } 63 | ], 64 | "source": [ 65 | "# Read a pixel to sky transform from a file and create the\n", 66 | "# WCS object using the default \"input_frame='detector'\"\n", 67 | "\n", 68 | "transform = tools.read_model('pix2sky.asdf')\n", 69 | "gw = wcs.WCS(output_frame='icrs', forward_transform=transform)\n", 70 | "print(gw)\n" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 37, 76 | "metadata": { 77 | "collapsed": false 78 | }, 79 | "outputs": [ 80 | { 81 | "name": "stdout", 82 | "output_type": "stream", 83 | "text": [ 84 | "5.6305262191 -72.0545768649\n" 85 | ] 86 | } 87 | ], 88 | "source": [ 89 | "# Call the WCS object as a function\n", 90 | "# to perform the forward transform\n", 91 | "\n", 92 | "ra, dec = gw(1, 2)\n", 93 | "print(ra, dec)\n" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 38, 99 | "metadata": { 100 | "collapsed": false, 101 | "scrolled": true 102 | }, 103 | "outputs": [ 104 | { 105 | "data": { 106 | "text/plain": [ 107 | "(1.0001954633661871, 2.000000000806444)" 108 | ] 109 | }, 110 | "execution_count": 38, 111 | "metadata": {}, 112 | "output_type": "execute_result" 113 | } 114 | ], 115 | "source": [ 116 | "gw.invert(ra, dec)" 117 | ] 118 | }, 119 | { 120 | "cell_type": "code", 121 | "execution_count": 39, 122 | "metadata": { 123 | "collapsed": false 124 | }, 125 | "outputs": [ 126 | { 127 | "name": "stdout", 128 | "output_type": "stream", 129 | "text": [ 130 | " From Transform \n", 131 | "----------- ----------\n", 132 | " detector distortion\n", 133 | "focal_plane foc2sky\n", 134 | " icrs None\n" 135 | ] 136 | } 137 | ], 138 | "source": [ 139 | "# Using frame objects allows to connect it with astropy.coordinates\n", 140 | "from gwcs import coordinate_frames as cf\n", 141 | "detector = cf.DetectorFrame()\n", 142 | "focal = cf.FocalPlaneFrame()\n", 143 | "sky = cf.CelestialFrame(reference_frame=coord.ICRS(), axes_order=(0, 1))\n", 144 | "\n", 145 | "distortion = tools.read_model('dist.asdf')\n", 146 | "focal2sky = tools.read_model('foc2sky.asdf')\n", 147 | "\n", 148 | "pipeline = [(detector, distortion),\n", 149 | " (focal, focal2sky),\n", 150 | " (sky, None)]\n", 151 | "\n", 152 | "imwcs = wcs.WCS(output_frame=sky, forward_transform=pipeline)\n", 153 | "print(imwcs)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 40, 159 | "metadata": { 160 | "collapsed": false 161 | }, 162 | "outputs": [ 163 | { 164 | "data": { 165 | "text/plain": [ 166 | "{u'detector': , reference_positionLocal,unit=[Unit(\"pix\"), Unit(\"pix\")], axes_names=[u'x', u'y'], name=focal_plane)>,\n", 168 | " 'icrs': , axes_order=(0, 1), reference_position=Barycenter, unit=[Unit(\"deg\"), Unit(\"deg\")], name=icrs)>}" 169 | ] 170 | }, 171 | "execution_count": 40, 172 | "metadata": {}, 173 | "output_type": "execute_result" 174 | } 175 | ], 176 | "source": [ 177 | "# The frames available within a pipeline a stored in a dict \n", 178 | "\n", 179 | "imwcs.available_frames" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 41, 185 | "metadata": { 186 | "collapsed": false 187 | }, 188 | "outputs": [ 189 | { 190 | "name": "stdout", 191 | "output_type": "stream", 192 | "text": [ 193 | "5.63030044041 -72.0544788707\n" 194 | ] 195 | } 196 | ], 197 | "source": [ 198 | "ra, dec = imwcs(1, 2)\n", 199 | "print(ra, dec)" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 42, 205 | "metadata": { 206 | "collapsed": false 207 | }, 208 | "outputs": [ 209 | { 210 | "name": "stdout", 211 | "output_type": "stream", 212 | "text": [ 213 | "\n", 215 | "\n" 217 | ] 218 | } 219 | ], 220 | "source": [ 221 | "# The `world_coordinates` method creates an \n", 222 | "# astropy.coordinates.SkyCoordinate object\n", 223 | "sky = imwcs.output_frame.world_coordinates(ra, dec)\n", 224 | "print(sky)\n", 225 | "print(sky.galactic)\n", 226 | " " 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": 43, 232 | "metadata": { 233 | "collapsed": false 234 | }, 235 | "outputs": [ 236 | { 237 | "name": "stdout", 238 | "output_type": "stream", 239 | "text": [ 240 | "(-0.5343708149195018, -6.35901904497471)\n" 241 | ] 242 | } 243 | ], 244 | "source": [ 245 | "# Retrieve a subtransform\n", 246 | "distortion = imwcs.get_transform(detector, focal)\n", 247 | "print(distortion(1, 2))\n" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 44, 253 | "metadata": { 254 | "collapsed": false 255 | }, 256 | "outputs": [], 257 | "source": [ 258 | "\n", 259 | "shift = models.Shift(0.01) & models.Shift(0.02)\n", 260 | "\n", 261 | "imwcs.insert_transform(frame='focal_plane', transform=shift, after=False)" 262 | ] 263 | }, 264 | { 265 | "cell_type": "code", 266 | "execution_count": 45, 267 | "metadata": { 268 | "collapsed": false 269 | }, 270 | "outputs": [ 271 | { 272 | "data": { 273 | "text/plain": [ 274 | "(-0.5243708149195018, -6.339019044974711)" 275 | ] 276 | }, 277 | "execution_count": 45, 278 | "metadata": {}, 279 | "output_type": "execute_result" 280 | } 281 | ], 282 | "source": [ 283 | "imwcs.get_transform(detector, focal)(1,2)\n" 284 | ] 285 | }, 286 | { 287 | "cell_type": "markdown", 288 | "metadata": {}, 289 | "source": [ 290 | "### IFU example" 291 | ] 292 | }, 293 | { 294 | "cell_type": "code", 295 | "execution_count": 46, 296 | "metadata": { 297 | "collapsed": false 298 | }, 299 | "outputs": [ 300 | { 301 | "name": "stdout", 302 | "output_type": "stream", 303 | "text": [ 304 | "\n", 305 | "Name: SelectorMask\n", 306 | "Inputs: (u'x', u'y')\n", 307 | "Outputs: z\n" 308 | ] 309 | } 310 | ], 311 | "source": [ 312 | "from gwcs import selector\n", 313 | "miri_mask = tools.miri_mask()\n", 314 | "detector_mask = selector.SelectorMask(miri_mask)\n", 315 | "print(detector_mask.__class__)" 316 | ] 317 | }, 318 | { 319 | "cell_type": "code", 320 | "execution_count": 47, 321 | "metadata": { 322 | "collapsed": false, 323 | "scrolled": false 324 | }, 325 | "outputs": [ 326 | { 327 | "data": { 328 | "image/png": "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\nVgAAAABJRU5ErkJggg==\n", 329 | "text/plain": [ 330 | "" 331 | ] 332 | }, 333 | "metadata": {}, 334 | "output_type": "display_data" 335 | } 336 | ], 337 | "source": [ 338 | "tools.show(detector_mask.mask, 28)" 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": 54, 344 | "metadata": { 345 | "collapsed": false 346 | }, 347 | "outputs": [], 348 | "source": [ 349 | "# miri_models is a dict {slice_# : transform}\n", 350 | "\n", 351 | "miri_models = tools.miri_models()\n", 352 | "\n", 353 | "miri_selector = selector.RegionsSelector(inputs=('x', 'y'),\n", 354 | " outputs=('alpha', 'beta', 'lam'), \n", 355 | " selector=miri_models,\n", 356 | " mask=detector_mask)" 357 | ] 358 | }, 359 | { 360 | "cell_type": "code", 361 | "execution_count": 49, 362 | "metadata": { 363 | "collapsed": false 364 | }, 365 | "outputs": [], 366 | "source": [ 367 | "from gwcs import spectral_builtin_frames\n", 368 | "\n", 369 | "sky = cf.CelestialFrame(coord.ICRS())\n", 370 | "spec = cf.SpectralFrame(spectral_builtin_frames.Wavelength())\n", 371 | "oframe = cf.CompositeFrame([sky, spec])\n", 372 | "\n", 373 | "ifuwcs = wcs.WCS(output_frame=oframe, forward_transform=miri_selector)\n", 374 | "\n", 375 | "x, y = np.mgrid[:1024, :1032]\n", 376 | "alpha, beta, lam = ifuwcs(x, y)\n" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 50, 382 | "metadata": { 383 | "collapsed": false 384 | }, 385 | "outputs": [ 386 | { 387 | "data": { 388 | "text/plain": [ 389 | "" 390 | ] 391 | }, 392 | "execution_count": 50, 393 | "metadata": {}, 394 | "output_type": "execute_result" 395 | }, 396 | { 397 | "data": { 398 | "image/png": "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\n", 399 | "text/plain": [ 400 | "" 401 | ] 402 | }, 403 | "metadata": {}, 404 | "output_type": "display_data" 405 | } 406 | ], 407 | "source": [ 408 | "from IPython.html import widgets\n", 409 | "\n", 410 | "plt.imshow(alpha, interpolation='nearest', aspect='auto')\n", 411 | "plt.colorbar()\n", 412 | "plt.xlabel('x, pixels')\n", 413 | "\n", 414 | "plt.ylabel('y, pixels')\n", 415 | "plt.title(\"alpha, arcsec\")\n" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": 51, 421 | "metadata": { 422 | "collapsed": false, 423 | "slideshow": { 424 | "slide_type": "skip" 425 | } 426 | }, 427 | "outputs": [ 428 | { 429 | "data": { 430 | "text/plain": [ 431 | "" 432 | ] 433 | }, 434 | "execution_count": 51, 435 | "metadata": {}, 436 | "output_type": "execute_result" 437 | }, 438 | { 439 | "data": { 440 | "image/png": "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\n", 441 | "text/plain": [ 442 | "" 443 | ] 444 | }, 445 | "metadata": {}, 446 | "output_type": "display_data" 447 | } 448 | ], 449 | "source": [ 450 | "plt.imshow(beta)\n", 451 | "plt.colorbar()" 452 | ] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": 52, 457 | "metadata": { 458 | "collapsed": false 459 | }, 460 | "outputs": [ 461 | { 462 | "data": { 463 | "text/plain": [ 464 | "" 465 | ] 466 | }, 467 | "execution_count": 52, 468 | "metadata": {}, 469 | "output_type": "execute_result" 470 | }, 471 | { 472 | "data": { 473 | "image/png": "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\n", 474 | "text/plain": [ 475 | "" 476 | ] 477 | }, 478 | "metadata": {}, 479 | "output_type": "display_data" 480 | } 481 | ], 482 | "source": [ 483 | "plt.imshow(lam, interpolation='nearest', aspect='auto')\n", 484 | "plt.colorbar()\n", 485 | "plt.title(\"lambda, microns\")\n", 486 | "plt.xlabel('x, pixels')\n", 487 | "plt.ylabel('y, pixels')\n" 488 | ] 489 | }, 490 | { 491 | "cell_type": "code", 492 | "execution_count": 53, 493 | "metadata": { 494 | "collapsed": false 495 | }, 496 | "outputs": [ 497 | { 498 | "name": "stdout", 499 | "output_type": "stream", 500 | "text": [ 501 | "(-76.29092761249231, -2.412684, 19.112697484628328)\n" 502 | ] 503 | } 504 | ], 505 | "source": [ 506 | "# Execute the forward transforms for slice # 22\n", 507 | "\n", 508 | "slice_22_transform = ifuwcs.forward_transform.set_input(2)\n", 509 | "print(slice_22_transform(10, 20))" 510 | ] 511 | }, 512 | { 513 | "cell_type": "code", 514 | "execution_count": null, 515 | "metadata": { 516 | "collapsed": true 517 | }, 518 | "outputs": [], 519 | "source": [] 520 | }, 521 | { 522 | "cell_type": "code", 523 | "execution_count": null, 524 | "metadata": { 525 | "collapsed": true 526 | }, 527 | "outputs": [], 528 | "source": [] 529 | } 530 | ], 531 | "metadata": { 532 | "celltoolbar": "Slideshow", 533 | "kernelspec": { 534 | "display_name": "Python 2", 535 | "language": "python", 536 | "name": "python2" 537 | }, 538 | "language_info": { 539 | "codemirror_mode": { 540 | "name": "ipython", 541 | "version": 2 542 | }, 543 | "file_extension": ".py", 544 | "mimetype": "text/x-python", 545 | "name": "python", 546 | "nbconvert_exporter": "python", 547 | "pygments_lexer": "ipython2", 548 | "version": "2.7.9" 549 | } 550 | }, 551 | "nbformat": 4, 552 | "nbformat_minor": 0 553 | } 554 | -------------------------------------------------------------------------------- /day4/Dencheva_gwcs/gwcs_slides.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "slideshow": { 7 | "slide_type": "subslide" 8 | } 9 | }, 10 | "source": [ 11 | "# Generalized World Coordinate System\n", 12 | "\n", 13 | "## Nadia Dencheva\n", 14 | "\n", 15 | "## Perry Greenfield, Mike Droettboom\n", 16 | "\n", 17 | "\n", 18 | "\n", 19 | "\n", 20 | "\n", 21 | "\n", 22 | "\n", 23 | "#####Python in Astronomy Workshop\n", 24 | "#####Leiden, 2015" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": { 30 | "slideshow": { 31 | "slide_type": "slide" 32 | } 33 | }, 34 | "source": [ 35 | "## Goals" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": { 41 | "slideshow": { 42 | "slide_type": "subslide" 43 | } 44 | }, 45 | "source": [ 46 | "- Provide a much more **flexible** WCS toolkit than is possible with the FITS standard\n", 47 | "\n", 48 | " - Include all transformations from detector to a standard coordinate system\n", 49 | " - Combine transforms in an efficient way such that resampling is done as little as possible\n", 50 | " - Allow the pipeline of coordinate transforms, as well as the individual transforms, to be easily manipulated\n", 51 | " - Handle cases involving discontinuous WCS models, e.g., IFU data\n", 52 | " - Allow quantities that affect transforms to be treated as input coordinates, e.g., spectral order, slit position, date, etc." 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": { 58 | "slideshow": { 59 | "slide_type": "subslide" 60 | } 61 | }, 62 | "source": [ 63 | "- Provide a framework which is easy to **extend**\n", 64 | "\n", 65 | " - A number of common coordinate transforms are implemented in astropy.modeling\n", 66 | " - Any other python executable (callable object or function) can be used \n", 67 | "\n", 68 | " - Coordinate frames use the astropy.coordinates framework" 69 | ] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "metadata": { 74 | "slideshow": { 75 | "slide_type": "slide" 76 | } 77 | }, 78 | "source": [ 79 | "## Combined models in astropy.modeling since v 1.0" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 16, 85 | "metadata": { 86 | "collapsed": true, 87 | "slideshow": { 88 | "slide_type": "subslide" 89 | } 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "from astropy.modeling.models import Shift, Scale, Polynomial1D, Polynomial2D\n", 94 | "\n", 95 | "shift = Shift(1)\n", 96 | "scale = Scale(2)\n", 97 | "poly = Polynomial1D(1, c0=1.2, c1=2.3)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": { 103 | "slideshow": { 104 | "slide_type": "subslide" 105 | } 106 | }, 107 | "source": [ 108 | "- Binary arithmetic operations with models" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 17, 114 | "metadata": { 115 | "collapsed": false, 116 | "slideshow": { 117 | "slide_type": "fragment" 118 | } 119 | }, 120 | "outputs": [ 121 | { 122 | "name": "stdout", 123 | "output_type": "stream", 124 | "text": [ 125 | "3.73333333333\n" 126 | ] 127 | } 128 | ], 129 | "source": [ 130 | " model = (shift + poly) * scale / poly\n", 131 | " print model(1.2)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": { 137 | "slideshow": { 138 | "slide_type": "subslide" 139 | } 140 | }, 141 | "source": [ 142 | "- model composition - the output of one model is passed as input to the next model" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 18, 148 | "metadata": { 149 | "collapsed": false, 150 | "slideshow": { 151 | "slide_type": "fragment" 152 | } 153 | }, 154 | "outputs": [ 155 | { 156 | "name": "stdout", 157 | "output_type": "stream", 158 | "text": [ 159 | "6.26\n" 160 | ] 161 | } 162 | ], 163 | "source": [ 164 | " model = shift | poly\n", 165 | " print model(1.2)" 166 | ] 167 | }, 168 | { 169 | "cell_type": "markdown", 170 | "metadata": { 171 | "slideshow": { 172 | "slide_type": "subslide" 173 | } 174 | }, 175 | "source": [ 176 | "- model concatenation, i.e. combine coordinate transforms on independent coordinates as a multi-coordinate transform\n" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 19, 182 | "metadata": { 183 | "collapsed": false, 184 | "slideshow": { 185 | "slide_type": "fragment" 186 | } 187 | }, 188 | "outputs": [ 189 | { 190 | "name": "stdout", 191 | "output_type": "stream", 192 | "text": [ 193 | "(2.0, 12.0)\n" 194 | ] 195 | } 196 | ], 197 | "source": [ 198 | " model = Shift(1) & Shift(2)\n", 199 | " print model(1, 10)" 200 | ] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": { 205 | "slideshow": { 206 | "slide_type": "subslide" 207 | } 208 | }, 209 | "source": [ 210 | "- axes management\n", 211 | "\n", 212 | " - modeling.models.Mapping\n", 213 | " - modeling.models.Identity\n", 214 | " " 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 24, 220 | "metadata": { 221 | "collapsed": false, 222 | "slideshow": { 223 | "slide_type": "subslide" 224 | } 225 | }, 226 | "outputs": [ 227 | { 228 | "name": "stdout", 229 | "output_type": "stream", 230 | "text": [ 231 | "('mapping.n_inputs:', 2)\n", 232 | "('mapping.n_ouputs:', 4)\n" 233 | ] 234 | } 235 | ], 236 | "source": [ 237 | " from astropy.modeling.models import Mapping, Identity \n", 238 | " \n", 239 | " x, y = (1, 10)\n", 240 | " poly_x = Polynomial2D(degree=1, c0_0=1, c0_1=2, c1_0=2.1)\n", 241 | " poly_y = Polynomial2D(degree=4, c0_0=5, c1_0=1.2, c0_1=2)\n", 242 | " poly = poly_x & poly_y\n", 243 | " \n", 244 | " mapping = Mapping((0, 1, 0, 1))\n", 245 | " print(\"mapping.n_inputs:\", mapping.n_inputs)\n", 246 | " print(\"mapping.n_ouputs:\", mapping.n_outputs)\n", 247 | " " 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 25, 253 | "metadata": { 254 | "collapsed": false, 255 | "slideshow": { 256 | "slide_type": "fragment" 257 | } 258 | }, 259 | "outputs": [ 260 | { 261 | "name": "stdout", 262 | "output_type": "stream", 263 | "text": [ 264 | "(23.1, 26.2)\n" 265 | ] 266 | } 267 | ], 268 | "source": [ 269 | " model = mapping | poly\n", 270 | " print(model(x, y))\n", 271 | " " 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 30, 277 | "metadata": { 278 | "collapsed": false, 279 | "slideshow": { 280 | "slide_type": "fragment" 281 | } 282 | }, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "(1.2, 3.0)\n" 289 | ] 290 | } 291 | ], 292 | "source": [ 293 | " mapping = Mapping((0, 2), n_inputs=3)\n", 294 | " print mapping(1.2, 2, 3)\n", 295 | " " 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 31, 301 | "metadata": { 302 | "collapsed": false, 303 | "slideshow": { 304 | "slide_type": "fragment" 305 | } 306 | }, 307 | "outputs": [ 308 | { 309 | "name": "stdout", 310 | "output_type": "stream", 311 | "text": [ 312 | "(2.2, 2.0)\n" 313 | ] 314 | } 315 | ], 316 | "source": [ 317 | " model = Shift(1.2) & Identity(1)\n", 318 | " print model(1, 2)" 319 | ] 320 | }, 321 | { 322 | "cell_type": "markdown", 323 | "metadata": { 324 | "collapsed": true, 325 | "slideshow": { 326 | "slide_type": "slide" 327 | } 328 | }, 329 | "source": [ 330 | "This is a work in progress\n", 331 | "\n", 332 | "- Create tools around the basic functionality\n", 333 | "- Fully develop the coordinate frames\n", 334 | "- Integrate it with regions\n", 335 | "\n", 336 | "Source : https://github.com/spacetelescope/gwcs\n", 337 | "\n", 338 | "Documentation: http://gwcs.readthedocs.org/en/latest/" 339 | ] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": null, 344 | "metadata": { 345 | "collapsed": true 346 | }, 347 | "outputs": [], 348 | "source": [] 349 | } 350 | ], 351 | "metadata": { 352 | "celltoolbar": "Slideshow", 353 | "kernelspec": { 354 | "display_name": "Python 2", 355 | "language": "python", 356 | "name": "python2" 357 | }, 358 | "language_info": { 359 | "codemirror_mode": { 360 | "name": "ipython", 361 | "version": 2 362 | }, 363 | "file_extension": ".py", 364 | "mimetype": "text/x-python", 365 | "name": "python", 366 | "nbconvert_exporter": "python", 367 | "pygments_lexer": "ipython2", 368 | "version": "2.7.9" 369 | } 370 | }, 371 | "nbformat": 4, 372 | "nbformat_minor": 0 373 | } 374 | -------------------------------------------------------------------------------- /day4/Dencheva_gwcs/pix2sky.asdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day4/Dencheva_gwcs/pix2sky.asdf -------------------------------------------------------------------------------- /day4/Dencheva_gwcs/tools.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | from pyasdf import AsdfFile 3 | from matplotlib import image as mplimage 4 | from matplotlib import pyplot as plt 5 | from astropy.io import fits 6 | from astropy.modeling import models, fitting 7 | from gwcs import wcs, selector 8 | import copy 9 | 10 | 11 | def read_model(filename): 12 | f = AsdfFile.read(filename) 13 | return f.tree['model'] 14 | 15 | 16 | def cmap_discretize(cmap, N): 17 | """Return a discrete colormap from the continuous colormap cmap. 18 | 19 | cmap: colormap instance, eg. cm.jet. 20 | N: number of colors. 21 | 22 | Example 23 | x = resize(arange(100), (5,100)) 24 | djet = cmap_discretize(cm.jet, 5) 25 | imshow(x, cmap=djet) 26 | """ 27 | import matplotlib 28 | from matplotlib import pyplot as plt 29 | if type(cmap) == str: 30 | cmap = plt.get_cmap(cmap) 31 | colors_i = np.concatenate((np.linspace(0, 1., N), (0.,0.,0.,0.))) 32 | colors_rgba = cmap(colors_i) 33 | indices = np.linspace(0, 1., N+1) 34 | cdict = {} 35 | for ki,key in enumerate(('red','green','blue')): 36 | cdict[key] = [ (indices[i], colors_rgba[i-1,ki], colors_rgba[i,ki]) for i in xrange(N+1) ] 37 | # Return colormap object. 38 | return matplotlib.colors.LinearSegmentedColormap(cmap.name + "_%d"%N, cdict, 1024) 39 | 40 | 41 | def show(mask, n_regions=3): 42 | from matplotlib import pyplot as plt 43 | c = cmap_discretize('jet', n_regions) 44 | labels=np.arange(n_regions) 45 | loc= labels 46 | f = plt.figure() 47 | #f.set_size_inches(12, 8, forward=True) 48 | plt.imshow(mask, interpolation='nearest', cmap=c, aspect='auto') 49 | cb = plt.colorbar() 50 | cb.set_ticks(loc) 51 | cb.set_ticklabels(labels) 52 | plt.show() 53 | 54 | 55 | def miri_mask(): 56 | f = fits.open('MIRI_FM_LW_A_D2C_01.00.00.fits') 57 | slices = f[3].data 58 | nslices = np.zeros((slices.shape)) 59 | nslices[:, :500] = slices[:, :500] 60 | sl1 = slices[:, 500:] 61 | sl2 = np.where(sl1> 0, sl1+12, sl1) 62 | #sl2 = np.where(sl1>100, sl1-100+21, sl1) 63 | nslices[:,500:] = sl2 64 | return nslices 65 | 66 | def make_channel_models(channel): 67 | f = fits.open('MIRI_FM_LW_A_D2C_01.00.00.fits') 68 | if channel == 3: 69 | slice_mask = f[3].data[:,:500] 70 | b1 = f[0].header['B_DEL3'] 71 | b0 = f[0].header['B_MIN3'] 72 | 73 | elif channel == 4: 74 | slice_mask = f[3].data[:, 500:] 75 | b1 = f[0].header['B_DEL4'] 76 | b0 = f[0].header['B_MIN4'] 77 | 78 | slices = np.unique(slice_mask) 79 | slices = np.asarray(slices, dtype=np.int16).tolist() 80 | slices.remove(0) 81 | 82 | #read alpha and lambda planes from pixel maps file 83 | lam = f[1].data 84 | alpha = f[2].data 85 | # create a model to fit to each slice in alpha plane 86 | amodel = models.Chebyshev2D(x_degree=2, y_degree=1) 87 | # a model to be fitted to each slice in lambda plane 88 | lmodel = models.Chebyshev2D(x_degree=1, y_degree=1) 89 | lmodel.c0_1.fixed = True 90 | lmodel.c1_1.fixed = True 91 | fitter = fitting.LinearLSQFitter() 92 | reg_models = {} 93 | for sl in slices: 94 | #print('sl', sl) 95 | ind = (slice_mask==sl).nonzero()#(slice_mask[:, :500] ==sl).nonzero() 96 | x0 = ind[0].min() 97 | x1 = ind[0].max() 98 | y0 = ind[1].min() 99 | y1 = ind[1].max() 100 | if channel ==4: 101 | y0 += 500 102 | y1 += 500 103 | x, y = np.mgrid[x0:x1, y0:y1] 104 | sllam = lam[x0:x1, y0:y1] 105 | slalpha = alpha[x0:x1, y0:y1] 106 | lfitted = fitter(lmodel, x, y, sllam) 107 | afitted = fitter(amodel, x, y, slalpha) 108 | 109 | if channel == 4: 110 | beta_model = models.Const1D(b0 + b1 * (sl+12)) 111 | reg_models[sl+12] = lfitted, afitted, beta_model, (x0, x1, y0, y1) 112 | else: 113 | beta_model = models.Const1D(b0 + b1*sl) 114 | reg_models[sl] = lfitted, afitted, beta_model, (x0, x1, y0, y1) 115 | 116 | return reg_models 117 | 118 | 119 | def miri_models(): 120 | # Use channels 3 and 4 for this example 121 | reg_models3 = make_channel_models(3) 122 | reg_models4 = make_channel_models(4) 123 | reg_models = {} 124 | 125 | for reg in reg_models3: 126 | lam_model, alpha_model, beta_model, _ = reg_models3[reg] 127 | model = models.Mapping((0, 1, 0, 0, 1)) | alpha_model & beta_model & lam_model 128 | reg_models[reg] = model 129 | for reg in reg_models4: 130 | lam_model, alpha_model, beta_model, _ = reg_models4[reg] 131 | model = models.Mapping((0, 1, 0, 0, 1)) | alpha_model & beta_model & lam_model 132 | reg_models[reg] = model 133 | return reg_models 134 | 135 | 136 | -------------------------------------------------------------------------------- /day4/archibald.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day4/archibald.pdf -------------------------------------------------------------------------------- /day4/crawford_data_reduction/data_pyastro15_slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day4/crawford_data_reduction/data_pyastro15_slides.pdf -------------------------------------------------------------------------------- /day4/index.md: -------------------------------------------------------------------------------- 1 | Day 4 talks from Python in Astronomy 2 | 3 | [R. Smethurst, starpy](https://speakerdeck.com/rjsmethurst/starpy) 4 | 5 | [S. Mumford, SunPy](http://stuartmumford.co.uk/talks/pia) 6 | -------------------------------------------------------------------------------- /day5/Greenfield_Python_at_STScI.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day5/Greenfield_Python_at_STScI.pdf -------------------------------------------------------------------------------- /day5/JoeZuntz-CosmoSIS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day5/JoeZuntz-CosmoSIS.pdf -------------------------------------------------------------------------------- /day5/craig-astropy-undergrads.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day5/craig-astropy-undergrads.pdf -------------------------------------------------------------------------------- /day5/index.md: -------------------------------------------------------------------------------- 1 | Edit this file to add your link here. 2 | -------------------------------------------------------------------------------- /day5/ishida_COIN.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python-in-astronomy/talk_slides/fd495e432e3709a930797c49c7e9e37987f1be5d/day5/ishida_COIN.pdf --------------------------------------------------------------------------------