{"action":"created","comment":{"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments/33605353","id":33605353,"diff_hunk":"@@ -0,0 +1,521 @@\n+:author: Matthew Craig\n+:email: mcraig@mnstate.edu\n+:institution: Department of Physics and Astronomy, Minnesota State University Moorhead\n+\n+--------------------------------------------------------------------------\n+Widgets and Astropy: Accomplishing Productive Research with Undergraduates\n+--------------------------------------------------------------------------\n+\n+.. class:: abstract\n+\n+    This paper describes a tool for astronomical research implemented as an\n+    IPython notebook with a widget interface. The notebook uses Astropy, a\n+    community-developed package of fundamental tools for astronomy, and\n+    Astropy affiliated packages, as the back end. The widget interface makes\n+    Astropy a much more useful tool to undergraduates or other non-experts\n+    doing research in astronomy, filling a niche for software that connects\n+    beginners to research-grade code.\n+\n+.. class:: keywords\n+\n+   astronomy\n+\n+Introduction\n+------------\n+\n+Incoming students interested in majoring in Physics at Minnesota State\n+University Moorhead are often interested in doing astronomical research. The\n+department encourages students to become involved in research as early as\n+possible to foster their interest in science and because research\n+experiences are correlated with successful completion of a degree\n+[Lopatto2004]_.\n+\n+The students typically have no programming experience, but even the smallest\n+project requires calibrating and taking measurements from a couple of hundred\n+images. To the extent possible, analysis needs to be automated. Roughly half\n+of the students use Windows, the rest Mac OSX.\n+\n+The problem, described in more detail below, is that the GUI-based software\n+most accessible to these students is expensive, often available only on\n+Windows, not clearly documented and does not leave a record of the choices\n+made in calibrating the images so that future researchers can use the images\n+with confidence. The free options largely require programming.\n+\n+The proposed solution is a widget-based IPython notebook [Pérez2007]_ for\n+calibrating astronomical images, called ``reducer``. A widget-based interface\n+was chosen because students at this level are more comfortable with a GUI than\n+with programming. An IPython notebook was chosen because of its rich display\n+format, the ability to save both code and text, and the persistence of output\n+in the notebook, which provides a record of the work done.\n+\n+The back end of ``reducer`` is built on the Astropy project [Astropy2013]_, a\n+community-driven effort to develop high-quality, open source tools for Python\n+in astronomy, and on Astropy affiliated projects. [#]_ Astropy was chosen because it has a large developer community of professional astronomers.\n+\n+Section *Background: Image analysis in optical stellar astronomy* provides\n+background on the science of image calibration. In the following section the\n+problem is discussed more completely, including a review of some of the\n+available options for astronomical image processing. The section *``reducer\n+package and notebook* discusses the use of ``reducer``, while *``reducer``\n+widget structure* presents its implementation. The widget classes in\n+``reducer`` are potentially useful in other applications.\n+\n+.. [#] http://www.astropy.org/affiliated/\n+\n+Background: Image analysis in optical stellar astronomy\n+-------------------------------------------------------\n+\n+While a detailed description of astronomical data analysis is beyond the scope\n+of this paper, some appreciation of the steps involved is useful for\n+understanding its motivation.\n+\n+An image from a CCD camera on a telescope is simply an array of pixel values.\n+Several sources contribute to the brightness of an individual pixel in a raw\n+image:\n+\n++ Light from stars and other astronomical objects.\n++ Light from the nighttime sky; even a “dark” sky is not perfectly black.\n++ Noise that is related to the temperature of the camera and to the\n+  electronics that transfer the image from the detector chip in the camera\n+  to a computer.\n++ A DC offset to prevent negative pixel values.\n+\n+The first stage of calibration is to remove the noise and offset from each\n+image. The second stage is to correct for imperfections in the optical system\n+that affect how much light gets to each pixel in the camera. An example of\n+this sort of imperfection is dust on the camera itself.\n+\n+A series of images is taken and then combined to perform each type of\n+calibration. *Bias* images correct for the DC offset, *dark* images correct\n+for thermal noise and *flats* correct for non-uniform illumination. One\n+combines several frames of each type to reduce the electronic read noise\n+present in the calibration images.\n+\n+After calibration, the brightness of a pixel in the image is directly\n+proportional to the amount of light that arrived at that pixel through the\n+telescope. Note that light includes both starlight and light from the\n+atmosphere.\n+\n+Extraction of the brightness of individual stars is called photometry. There\n+are several techniques for performing photometry, all of which estimate and\n+eliminate the sky background.\n+\n+The problem\n+-----------\n+\n+Several software packages can calibrate astronomical images and perform\n+photometry, so why write another one?\n+\n+Ideally, such software would:\n+\n+1. Be easily usable by an undergraduate with limited or no programming\n+   experience.\n+2. Work on Windows and Mac.\n+3. Have its operation well tested in published articles and/or be open\n+   source so that the details of its implementation can be examined.\n+4. Leave behind a record of the settings used by the software in\n+   calibrating the images and measuring star brightness.\n+5. Be maintained by a large, thriving community of developers.\n+\n+Commercial software, like *MaxIm DL* [#]_, typically meets the first criteria.\n+Past MSUM students were able to learn the software quickly. However, it leaves\n+behind almost no record of how calibration was done: a fully calibrated image\n+has one keyword added to its metadata: ``CALSTAT='BDF'``. While this does\n+indicate which corrections have been made [#]_, it omits important information\n+like whether cosmic rays were removed from the calibration images and how the\n+individual calibration images were combined.\n+\n+The most extensively-tested and widely-used professional-grade package for\n+calibration and photometry is IRAF [IRAF1993]_. IRAF is both a scripting\n+language and a set of pre-defined scripts for carrying out common operations.\n+It is certainly widely used, with approximately 450 citations of the paper,\n+and, because IRAF scripts store settings in text files, there is a record of\n+what was done.\n+\n+However, there are several challenges to using IRAF. It is easiest to install\n+in Linux, though distributions exist for Mac and it is possible to use on\n+Windows with Cygwin [#]_. The IRAF command language (CL) is difficult to\n+learn; undergraduates who have worked with it in summer REU programs report\n+spending 3-4 weeks learning IRAF. That makes it infeasible to use as part of a\n+one-semester research project. It is also no longer maintained [#]_.\n+\n+One option that comes close to meeting all of the criteria is AstroImageJ\n+[#]_, a set of astronomy plug-ins for the Java-based ImageJ [ImageJ2012]_. It\n+has a nice graphical interface that students in both an introductory astronomy\n+course for non-majors and an upper-level course for majors found easy to use,\n+is open source,  free, and available on all platforms.  It has a rich set of\n+features, including both image calibrating and aperture photometry, and very\n+flexible configuration. Its two weaknesses are that it leaves an incomplete\n+record of the settings used in calibrating data and measuring brightness and\n+it does not have an extensive support community.\n+\n+\n+\n+.. [#] http://www.cyanogen.com/\n+.. [#] The bias offset and dark current were subtracted and the result\n+       divided by a flat frame to correct for non-uniform illumination.\n+.. [#] http://www.cygwin.com/\n+.. [#] The last update was in 2012 according to the IRAF web site,\n+       http://iraf.noao.edu\n+.. [#] http://www.astro.louisville.edu/software/astroimagej/\n+\n+The solution, broadly\n+---------------------\n+\n+Two relatively recent developments suggest the broad outlines of a solution that is sustainable in the long run:\n+\n++ Initiation of the Astropy project in 2011, which unified what had previously\n+  been several independent effort to develop python software for astronomy. In\n+  addition to developing the core Astropy package, the Astropy organization\n+  gives affiliate status to packages that request it and meet its documentation,\n+  testing and coding standards [#]_\n++ Addition of widgets to IPython notebooks in IPython, version 2. From the\n+  developer perspective, widgets are helpful because the Python API for widgets\n+  is rich enough to allow construction of complicated interfaces. There is no need\n+  to learn JavaScript to use the widgets effectively.\n+\n+It is the combination of high-quality python packages for both the back-end\n+and front-end that made development of ``reducer`` relatively straightforward.\n+\n+A notebook-based solution offers a couple of other advantages over even the\n+strongest of the GUI tools discussed in the previous section. The first is\n+that exposure to programming broadly is useful to both the few students who\n+become professional astronomers and the ones who do not. Though no programming\n+is required to use ``reducer``, there is code in several of the notebook\n+cells. It represents something intermediate between a fully GUI application\n+and script-only interface. Another is that exposure to Python programming is\n+useful to both students who work immediately after graduation and those who go\n+on to become scientists.\n+\n+.. [#] See http://www.astropy.org/affiliated for a list of affiliated packages\n+       and criteria.\n+\n+The ``reducer`` package and notebook\n+------------------------------------\n+\n+``reducer`` is a pure Python package available on PyPI and as a conda  package\n+[#]_. The user-facing part of the package is a single script, also called\n+``reducer``. When invoked, it creates an IPython notebook,\n+called ``reduction.ipynb``, in the directory in which it is invoked.\n+\n+The notebook will not overwrite images. The intent is that the raw,\n+uncalibrated images are stored in a  directory separate than the one\n+containing the notebook. The calibrated images are saved, by default, in the\n+same directory as the notebook, leaving a *human-readable* record with the\n+images describing the choices made in calibration.\n+\n+\n+The notebook also does not provide an easy way to re- run the calibration\n+short of deleting any calibrated files in the directory with the notebook and\n+starting fresh. In discussions with students while developing ``reducer`` it\n+became clear that it would be difficult or  impossible to ensure that the\n+state of the notebook reflected the state of the calibrated files, since it is\n+possible for some notebook cells to be re-executed without all cells being re-\n+executed.\n+\n+That design decision simplified the package, allowed the notebook to refuse to\n+overwrite files in the directory in which it is stored, and led to a focus on\n+making sure a human could read the record of what was done. The package itself\n+makes it easy to re-run the calibration with different settings should a later\n+researcher choose to do so.\n+\n+.. [#] Use channel ``mwcraig`` to get the conda package.\n+\n+Image calibration\n++++++++++++++++++\n+\n+All of the calibration steps in reducer are performed by ``ccdproc``, an\n+Astropy affiliated package for astronomical image reduction [ccdproc]_. Some\n+of the  ``reducer`` widgets contain some logic for automatically grouping and\n+selecting images based on metadata in the image headers, described in more\n+detail below.\n+\n+This section begins with examples of the individual widgets that appear and\n+the notebook, followed by an outline of the structure of the notebook as a\n+whole.\n+\n+Most of the widgets in ``reduction.ipynb`` are geared towards image\n+calibration. There are two broad types, one for applying calibrations to a set\n+of images, the other for combining calibration images.\n+\n+Each widget has four states:\n+\n++ Unselected; the widget is a simple button.\n++ Activated, but with incorrect or incomplete settings, shown in Fig.\n+  :ref:`reducer-combiner-before-correct-setting` for a ``CombinerWidget``.\n++ Activated and ready for action, with settings that enable the action to be\n+  completed, shown in Fig. :ref:`reducer-combiner-after-correct-setting`.\n++ Locked, after execution of calibration step in the widget, shown in\n+  Fig. :ref:`reducer-combiner-after-running`. *Note that the IPython notebook\n+  does not store the widget state in the notebook.* [#]_ When a ``reducer``\n+  notebook is re-opened the only record guaranteed to be preserved is the\n+  printed text below the widget.\n+\n+\n+.. figure:: reducer-combiner-before-correct-setting.png\n+    :figclass: htb\n+\n+    Example widget for combining images before settings have been set in a\n+    self-consistent way. Compare to\n+    Fig. :ref:`reducer-combiner-after-correct-setting`\n+    :label:`reducer-combiner-before-correct-setting`\n+\n+.. figure:: reducer-combiner-after-correct-setting.png\n+    :figclass: htb\n+\n+    Same widget as Fig. :ref:`reducer-combiner-before-correct-setting` after\n+    consistent settings have been chosen. Note that the style of the top\n+    button changes and a \"Go\" button appears when settings are sensible; in\n+    this case the user needs to at least select a combination method. The\n+    additional options under \"Combine images\" are presented when the checkbox\n+    is selected. :label:`reducer-combiner-after-correct-setting`\n+\n+.. figure:: reducer-combiner-after-running.png\n+    :figclass: htb\n+\n+    Same widget as Fig. :ref:`reducer-combiner-after-correct-setting`, after\n+    executing the calibration step. Note that a record of the settings is\n+    printed into the notebook cell below the widget to ensure a record remains\n+    in the notebook after reopening it.\n+    :label:`reducer-combiner-after-running`\n+\n+A few features of the ``CombinerWidget`` illustrate the logic used in\n+``reducer`` to semi-automatically select the images on which it should act. An\n+``apply_to`` argument to the initializer controls which calibrated images the\n+widget will act on; in this case its value is ``{'imagetyp': 'flat'}``, which\n+selects the calibration images used to correct non-uniform illumination. A\n+``group_by`` argument to the widget initializer controls controls how the\n+images selected by ``apply_to`` are combined. In the example shown, all images\n+with the same filter and exposure time will be combined by averaging, after\n+each image has been scaled to the same median value.\n+\n+Each image, including the images used in the calibration itself, is processed\n+by a ``ReductionWidget``, like that shown in Fig. :ref:`light-settings`. That\n+examples is for a \"light\" image, an image that contains the objects of\n+interest. Each of the calibration images has some of these steps applied also,\n+though some of the calibration steps are not displayed for some of the\n+calibration images.\n+\n+As with the ``CombinerWidget``, an ``apply_to`` argument to the widget\n+constructor determines which images are processed by the widget.\n+\n+The calibration part of the notebook is composed of four pairs of widgets, one\n+pair for calibrating and combining bias images, and additional pairs for\n+darks, flats, and science images.  One of the strengths of widget-based\n+notebooks is that they are user- editable applications. If there is a\n+particular calibration step that is not needed, the cells that create those\n+widgets can simply be deleted.\n+\n+.. figure:: reducer-light-with-settings-borders.png\n+    :align: center\n+\n+    Widget that applies calibrations to a set of images. Display of some of the\n+    individual steps (e.g. subtracting bias) can be suppressed with optional\n+    arguments when the widget object is created. Red borders are drawn around each\n+    instance of the base widget class described in the section \"``reducer`` widget\n+    structure\".\n+    :label:`light-settings`\n+\n+.. [#] In IPython 2.x it is impossible to easily save the widget state, and the\n+       widget is not part of the DOM, so it is not stored when the notebook is\n+       saved. In 3.x the widget is preserved, but saving the state takes\n+       additional developer work.\n+\n+Image browser\n+-------------\n+\n+Reducer also contains a basic image browser, which organizes the images based\n+on a table of metadata, and displays, when an image is selected, the image and\n+all of the metadata in that image in separate tabs in the widget. An example\n+is shown in Fig. :ref:`image-display-example`.\n+\n+.. figure:: image-display-example.png\n+\n+    The image display widget arranges images nested by image metadata values. In\n+    this case the two keywords used for grouping the images were ``imagetyp`` and\n+    ``exposure``. When an file name is selected, either the image or its metadata\n+    can be displayed.\n+    :label:`image-display-example`\n+\n+``reducer`` widget structure\n+----------------------------\n+\n+\n+At the base of the reducer widget structure is an extension of a container\n+widget from IPython. This class, ``ToggleContainerWidget``, adds a toggle to\n+control display the contents of the container, and a list of child widgets\n+displayed in the container. [#]_  Since a ``ToggleContainerWidget`` can have\n+another ``ToggleContainerWidget`` as a child, this immediately provides an\n+interface for presenting a user with a nested list of options. Fig. `light-\n+settings` has a thin red border drawn around each element that is a subclass","path":"papers/matthew_craig/matthew_craig.rst","position":350,"original_position":350,"commit_id":"1e6fad1d5de7042839e8046bee95d6e944578c40","original_commit_id":"1e6fad1d5de7042839e8046bee95d6e944578c40","user":{"login":"jeanconn","id":791508,"avatar_url":"https://avatars.githubusercontent.com/u/791508?v=3","gravatar_id":"","url":"https://api.github.com/users/jeanconn","html_url":"https://github.com/jeanconn","followers_url":"https://api.github.com/users/jeanconn/followers","following_url":"https://api.github.com/users/jeanconn/following{/other_user}","gists_url":"https://api.github.com/users/jeanconn/gists{/gist_id}","starred_url":"https://api.github.com/users/jeanconn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeanconn/subscriptions","organizations_url":"https://api.github.com/users/jeanconn/orgs","repos_url":"https://api.github.com/users/jeanconn/repos","events_url":"https://api.github.com/users/jeanconn/events{/privacy}","received_events_url":"https://api.github.com/users/jeanconn/received_events","type":"User","site_admin":false},"body":"I think you need the ':ref:' bit here to have light-settings resolve to figure 4.","created_at":"2015-06-30T18:17:41Z","updated_at":"2015-06-30T18:17:41Z","html_url":"https://github.com/scipy-conference/scipy_proceedings/pull/150#discussion_r33605353","pull_request_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150","_links":{"self":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments/33605353"},"html":{"href":"https://github.com/scipy-conference/scipy_proceedings/pull/150#discussion_r33605353"},"pull_request":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150"}}},"pull_request":{"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150","id":37757312,"html_url":"https://github.com/scipy-conference/scipy_proceedings/pull/150","diff_url":"https://github.com/scipy-conference/scipy_proceedings/pull/150.diff","patch_url":"https://github.com/scipy-conference/scipy_proceedings/pull/150.patch","issue_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/150","number":150,"state":"open","locked":false,"title":"Paper: Widgets and Astropy: Accomplishing Productive Research with Undergraduates (Craig)","user":{"login":"mwcraig","id":1147167,"avatar_url":"https://avatars.githubusercontent.com/u/1147167?v=3","gravatar_id":"","url":"https://api.github.com/users/mwcraig","html_url":"https://github.com/mwcraig","followers_url":"https://api.github.com/users/mwcraig/followers","following_url":"https://api.github.com/users/mwcraig/following{/other_user}","gists_url":"https://api.github.com/users/mwcraig/gists{/gist_id}","starred_url":"https://api.github.com/users/mwcraig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mwcraig/subscriptions","organizations_url":"https://api.github.com/users/mwcraig/orgs","repos_url":"https://api.github.com/users/mwcraig/repos","events_url":"https://api.github.com/users/mwcraig/events{/privacy}","received_events_url":"https://api.github.com/users/mwcraig/received_events","type":"User","site_admin":false},"body":"I apologize in advance for the incomplete state of this draft...more is coming over the next couple of days.\r\n\r\n[Edit by jaberg] http://nipy.bic.berkeley.edu:5000/download/9","created_at":"2015-06-16T03:43:49Z","updated_at":"2015-06-30T18:17:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"be8883481480cfdce06618d8e491417e2fdc2d70","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150/commits","review_comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150/comments","review_comment_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/150/comments","statuses_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/1e6fad1d5de7042839e8046bee95d6e944578c40","head":{"label":"mwcraig:2015","ref":"2015","sha":"1e6fad1d5de7042839e8046bee95d6e944578c40","user":{"login":"mwcraig","id":1147167,"avatar_url":"https://avatars.githubusercontent.com/u/1147167?v=3","gravatar_id":"","url":"https://api.github.com/users/mwcraig","html_url":"https://github.com/mwcraig","followers_url":"https://api.github.com/users/mwcraig/followers","following_url":"https://api.github.com/users/mwcraig/following{/other_user}","gists_url":"https://api.github.com/users/mwcraig/gists{/gist_id}","starred_url":"https://api.github.com/users/mwcraig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mwcraig/subscriptions","organizations_url":"https://api.github.com/users/mwcraig/orgs","repos_url":"https://api.github.com/users/mwcraig/repos","events_url":"https://api.github.com/users/mwcraig/events{/privacy}","received_events_url":"https://api.github.com/users/mwcraig/received_events","type":"User","site_admin":false},"repo":{"id":37017563,"name":"scipy_proceedings","full_name":"mwcraig/scipy_proceedings","owner":{"login":"mwcraig","id":1147167,"avatar_url":"https://avatars.githubusercontent.com/u/1147167?v=3","gravatar_id":"","url":"https://api.github.com/users/mwcraig","html_url":"https://github.com/mwcraig","followers_url":"https://api.github.com/users/mwcraig/followers","following_url":"https://api.github.com/users/mwcraig/following{/other_user}","gists_url":"https://api.github.com/users/mwcraig/gists{/gist_id}","starred_url":"https://api.github.com/users/mwcraig/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mwcraig/subscriptions","organizations_url":"https://api.github.com/users/mwcraig/orgs","repos_url":"https://api.github.com/users/mwcraig/repos","events_url":"https://api.github.com/users/mwcraig/events{/privacy}","received_events_url":"https://api.github.com/users/mwcraig/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mwcraig/scipy_proceedings","description":"Tools used to generate the SciPy conference proceedings","fork":true,"url":"https://api.github.com/repos/mwcraig/scipy_proceedings","forks_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/forks","keys_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/teams","hooks_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/hooks","issue_events_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/issues/events{/number}","events_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/events","assignees_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/assignees{/user}","branches_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/branches{/branch}","tags_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/tags","blobs_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/git/refs{/sha}","trees_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/statuses/{sha}","languages_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/languages","stargazers_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/stargazers","contributors_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/contributors","subscribers_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/subscribers","subscription_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/subscription","commits_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/commits{/sha}","git_commits_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/git/commits{/sha}","comments_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/comments{/number}","issue_comment_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/issues/comments{/number}","contents_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/contents/{+path}","compare_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/merges","archive_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/downloads","issues_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/issues{/number}","pulls_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/pulls{/number}","milestones_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/milestones{/number}","notifications_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/labels{/name}","releases_url":"https://api.github.com/repos/mwcraig/scipy_proceedings/releases{/id}","created_at":"2015-06-07T13:28:14Z","updated_at":"2015-06-07T13:28:15Z","pushed_at":"2015-06-30T18:05:17Z","git_url":"git://github.com/mwcraig/scipy_proceedings.git","ssh_url":"git@github.com:mwcraig/scipy_proceedings.git","clone_url":"https://github.com/mwcraig/scipy_proceedings.git","svn_url":"https://github.com/mwcraig/scipy_proceedings","homepage":"","size":1501,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"scipy-conference:2015","ref":"2015","sha":"e3df71a5659ce32396b7c520b89109716a3210fa","user":{"login":"scipy-conference","id":4884274,"avatar_url":"https://avatars.githubusercontent.com/u/4884274?v=3","gravatar_id":"","url":"https://api.github.com/users/scipy-conference","html_url":"https://github.com/scipy-conference","followers_url":"https://api.github.com/users/scipy-conference/followers","following_url":"https://api.github.com/users/scipy-conference/following{/other_user}","gists_url":"https://api.github.com/users/scipy-conference/gists{/gist_id}","starred_url":"https://api.github.com/users/scipy-conference/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scipy-conference/subscriptions","organizations_url":"https://api.github.com/users/scipy-conference/orgs","repos_url":"https://api.github.com/users/scipy-conference/repos","events_url":"https://api.github.com/users/scipy-conference/events{/privacy}","received_events_url":"https://api.github.com/users/scipy-conference/received_events","type":"Organization","site_admin":false},"repo":{"id":1825629,"name":"scipy_proceedings","full_name":"scipy-conference/scipy_proceedings","owner":{"login":"scipy-conference","id":4884274,"avatar_url":"https://avatars.githubusercontent.com/u/4884274?v=3","gravatar_id":"","url":"https://api.github.com/users/scipy-conference","html_url":"https://github.com/scipy-conference","followers_url":"https://api.github.com/users/scipy-conference/followers","following_url":"https://api.github.com/users/scipy-conference/following{/other_user}","gists_url":"https://api.github.com/users/scipy-conference/gists{/gist_id}","starred_url":"https://api.github.com/users/scipy-conference/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scipy-conference/subscriptions","organizations_url":"https://api.github.com/users/scipy-conference/orgs","repos_url":"https://api.github.com/users/scipy-conference/repos","events_url":"https://api.github.com/users/scipy-conference/events{/privacy}","received_events_url":"https://api.github.com/users/scipy-conference/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scipy-conference/scipy_proceedings","description":"Tools used to generate the SciPy conference proceedings","fork":false,"url":"https://api.github.com/repos/scipy-conference/scipy_proceedings","forks_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/forks","keys_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/teams","hooks_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/hooks","issue_events_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/events{/number}","events_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/events","assignees_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/assignees{/user}","branches_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/branches{/branch}","tags_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/tags","blobs_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/refs{/sha}","trees_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/{sha}","languages_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/languages","stargazers_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/stargazers","contributors_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/contributors","subscribers_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/subscribers","subscription_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/subscription","commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/commits{/sha}","git_commits_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/git/commits{/sha}","comments_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/comments{/number}","issue_comment_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/comments{/number}","contents_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/contents/{+path}","compare_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/merges","archive_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/downloads","issues_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues{/number}","pulls_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls{/number}","milestones_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/milestones{/number}","notifications_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/labels{/name}","releases_url":"https://api.github.com/repos/scipy-conference/scipy_proceedings/releases{/id}","created_at":"2011-05-31T10:26:48Z","updated_at":"2015-06-22T07:22:47Z","pushed_at":"2015-06-30T18:12:43Z","git_url":"git://github.com/scipy-conference/scipy_proceedings.git","ssh_url":"git@github.com:scipy-conference/scipy_proceedings.git","clone_url":"https://github.com/scipy-conference/scipy_proceedings.git","svn_url":"https://github.com/scipy-conference/scipy_proceedings","homepage":"","size":155374,"stargazers_count":76,"watchers_count":76,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":142,"mirror_url":null,"open_issues_count":38,"forks":142,"open_issues":38,"watchers":76,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150"},"html":{"href":"https://github.com/scipy-conference/scipy_proceedings/pull/150"},"issue":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/150"},"comments":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/issues/150/comments"},"review_comments":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150/comments"},"review_comment":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/pulls/150/commits"},"statuses":{"href":"https://api.github.com/repos/scipy-conference/scipy_proceedings/statuses/1e6fad1d5de7042839e8046bee95d6e944578c40"}}}}