{"action":"created","comment":{"url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/comments/190067700","pull_request_review_id":122370418,"id":190067700,"diff_hunk":"@@ -1,80 +1,201 @@\n-pupe-pat\n-========\n+[//]: # (The name of the repository with a brief, high-level description of the\n+project)\n+# Pupil Plate Ellipticity (PUPE)- Photometric Analysis Tool (PAT)\n \n-Pupil Plate Ellipticity (PUPE)- Photometric Analysis Tool (PAT)\n----------------------------------------------------------------\n+[//]: # (A description of how to install the project on a local machine for\n+development)\n+\n+## Purpose\n+The purpose of this tool is to facilitate processing pupil plate\n+images collected during the collimation of a telescope. A \"pupil plate\"\n+is a defocused star that is defocused so much that it appears as a donut.\n+The shape of that donut can be used to characterize\n+(and hopefully be able to eliminate) optical distortion.\n \n-### Purpose\n-The purpose of this tool is to facilitate processing of pupil plate\n-images collected during the collimation of a Telescope.\n The goal of this software tool is to help the user isolate which\n pupil plate image is the best out of a pre-exposed set of images by\n-identifying a set of quantitative characteristics processed through\n-photometric analysis tools.\n-\n-At the end of this development the team should have a tool that they\n-can use to process many fits file images, quantify the best image to\n-move forward with, and visualize how the various tip/tilts of the M2\n-mechanism affect various photometric quantities.\n-This software should be readily available at 1m sites and should\n-process images quickly enough to not burden the team \n-(100 images in 5 minutes).\n-\n-### Problem\n-During collimation engineers use a script to take a number of out\n+identifying the best position for the tip and tilt of the M2 mechanism.\n+\n+## Installation\n+The code is meant to be run in a docker file. You can pull the docker image by typing \n+the following in the terminal: \n+```\n+docker pull docker.lco.global/pupe-pat:0.1.0\n+```\n+You can also install the code directly \n+(after installing the dependencies, hopefully in an environment)\n+by running\n+```\n+git clone https://github.com/lcogt/pupe-pat\n+cd pupe-pat\n+python setup.py install\n+```\n+\n+### Prerequisites\n+Docker needs to be installed on your system and you need to be a docker user.\n+`eng` is probably the best option. `optics-support` is probably the best \n+machine to run this code on at the moment. \n+\n+### Dependencies\n+- sphinx\n+\n+- numpy\n+\n+- astropy\n+\n+- lcogt_logging\n+\n+- sep\n+\n+- matplotlib\n+\n+- watchdog\n+\n+- scipy\n+\n+- emcee (only needed for manual analysis)\n+\n+- corner (only needed if emcee is installed)\n+\n+- pypdf2\n+\n+\n+[//]: # (Describe how to run tests in the project)\n+## Tests\n+Currently the tests are run manually. Our test data set was taken on\n+kb05 at bpl on 20180409. We use the whole raw directory of images.\n+To reduce the test data run the following on the `optics-support` machine\n+as the `eng` user:\n+```\n+docker pull docker.lco.global/pupe-pat:{0.1.0}\n+docker run --rm -it -v /home/eng/pupe-pat-test-data:/input -v /home/eng/pupe-pat-tests-{0.1.0}:/output docker.lco.global/pupe-pat:{0.1.0} run_pupepat --output-dir /output --input-dir /input\n+```\n+Replace `{0.1.0}` with the current version.\n+The tests pass if all of the blue circles should align with the donuts\n+in the PDF files produced in the output directory.\n+\n+Eventually this procedure will be replaced with automatic testing in Jenkins.\n+\n+[//]: # (Details on how to deploy the project; if the project is deployed using\n+CD, just put a link to the job in this section)\n+## Deployment\n+Currently new versions are built manually. You can run\n+```\n+docker build -t docker.lco.global/pupe-pat:{0.0.1} .\n+docker push docker.lco.global/pupe-pat:{0.0.1}\n+```\n+replacing `{0.0.1}` with the current version. Eventually we will replace\n+this procedure with continuous deployment in Jenkins.\n+\n+[//]: # (A description of how the software in the project is used)\n+## Usage\n+During collimation, engineers use a script to take a number of out\n of focus images at various tips and tilts of the M2 mechanism. \n-The engineer has to quickly view all images and identify the “best”\n-image to move forward in the collimation process.\n-The best image is difficult to identify and will vary from person\n-to person, therefore, we need a tool that repeatedly calculates\n-various quantities that are pre-determined to identify the “best”\n-image.\n-\n-For example, the below two images are at two discrete combinations of\n-tip and tilt; however, they appear similar in quality. \n-Which one is better?\n-\n-### Description\n-The following procedure is a summary of the existing code and does \n-not need to be followed precisely, but is a proposed approach.\n-##### Read in Fits\n-The software should be able to read in a set of fits files (anywhere from around 150 to 400 images) taken from the local core machine and process through them.  They will probably be compressed, but I am open to how to best handle compression.\n-##### Obtain Sources\n-Source extraction libraries exist and can be used to identify \n-the sources in the image.  The images are processed in the \n-following manner:\n-1. Read into a 2d numpy array\n-2. Background is measured and subtracted from the image\n-3. Detect the object sources.  This includes the outside of\n-each source.  The inside of each source will also need to be calculated, \n-This is done using Source Extractor, SEP, https://sep.readthedocs.io/en/v1.0.x/\n-4. Various photometric calculations are made including:\n-* Ellipticity\n-* x, y, positions\n-* Centroids\n-* FWHM\n-* Others\n-\n-### Present Results\n-Once the results have been calculated the optimal pupil plate \n-needs to be identified.  This can be done various ways but one \n-approach which may be helpful is to create: \n-* 3D surface plot showing the M2 tip and tilt on the x, y and the ratio of ellipticity between the outside pupil plate and the inside pupil plate with the ability to click or identify the local minima\n-* 3D surface plot showing the M2 tip and tilt on the x, y and the location of the outer pupil vs. inner pupil location to see if the circles are concentric\n-* 3D surface plot showing the M2 tip and tilt on the x, y and FWHM\n-\n-#### References\n-A pre-existing tool has been created to expedite the process of \n-photometric analysis.  This tool is very similar to libraries used\n-in the pipeline and has been extracted from the pipeline as a stand\n-alone script. The script is titled eng-photometry.py and should be\n-revision controlled appropriately as the software package develops.\n-\n-## Appendices\n+Previously, the best image was previously identified by eye.\n+This code is meant to quantify this process. We currently only support\n+the LCO 1-m class of telescopes due to scaling the initial guess of the\n+donut size, but this should be straightforward to extend.\n+\n+Images to be analyzed should be taken significantly defocused.\n+The stars should look like a donut with a hole in center. Currently,\n+we require that the inner hole have a radius of at least 5 pixels. \n+The outer edge of the donuts should have a radius of at least 50 pixels\n+at the moment. This corresponds roughly to a defocus of +-12 mm for the \n+Sinistro cameras. There are plans underway to shrink this requirement to a \n+25 pixel radius which would allow defocus parameters down to +-6 mm.\n+This is currently a requirement in pixels rather than on defocus, so for the\n+sbigs in 1x1 binning we can currently get down to +-7.5 mm. \n+\n+The pupil plate images need to be taken on a bright, isolated star. A cut of \n+V~4 seems to work well. This produces images that are high signal-to-noise\n+(half the saturation value) in about 1 second exposures. Fainter stars can be\n+used if they are isolated (the donuts do not overlap) and the exposure times\n+are long enough to get ~20,000 counts in the images.\n+\n+The code automatically detects sources using Source Extractor in Python,\n+SEP, https://sep.readthedocs.io/en/v1.0.x. The code then makes a cutout\n+around the donut and fits a model using astropy.modeling that has one \n+value in the \"hole\" of the  donut, one value for the value in the \n+pupil plate and a background level. The centers and radii of the circles \n+that form the boundaries of the pupil plate are also allowed to vary. \n+There is code in this repo to fit ellipses instead of circles, and to fit\n+brightness gradient across the donut, but they are currently disabled.\n+\n+The results are saved in the output directory specified by the user at runtime.\n+Each star in each image that is fit as a pupil plate produces a pdf file\n+with the filename of the image followed by a source id. At the end of the\n+analysis the pdfs are merged by defocus position into\n+pupe-pat-{focdmd}-donut.pdf (default) where {focdmd} is replaced \n+with the requested focus of the images. The code also produces a \"quiver\"\n+plot (replacing donut with quiver in the name above). This shows the magnitude\n+and direction of the offset of the centers of the inner and outer edges of\n+the pupil plate. The \"best\" M2 tip and tilt are marked with a red X.\n+\n+The code can be run in two modes (see below): real-time and offline modes.\n+The offline mode will analyze all images in a given directory that are \n+taken by the LCOEngineering proposal (default), that are EXPOSE or EXPERIMENTAL\n+obstypes, and are defocused (FOCDMD != 0.0). To ensure that the proposal\n+is correctly included in the header, the Sequencer should be set to manual\n+when taking the images.\n+\n+The real-time mode has the same criteria for which images to analyze, but\n+watches the input directory for new files. Right before an M2 tip/tilt run,\n+this watcher should be started on the directory where the files will appear. \n+For the sbig cameras, this can be the `raw` directory for the given DAY-OBS.\n+The Sinistro frames need the amplifiers to be stitched together before they\n+can be analyzed, so the watcher should be directed to the `preview` directory\n+instead.\n+\n+[//]: # (Code examples of the usage)\n+## Examples\n+The standard offline analysis can be run using the following command.\n+```\n+docker pull docker.lco.global/pupe-pat:{0.1.0}\n+docker run --rm -it -v /home/eng/pupe-pat-test-data:/input -v /home/eng/pupe-pat-tests-{0.1.0}:/output docker.lco.global/pupe-pat:{0.1.0} run_pupepat --output-dir /output --input-dir /input\n+```\n+Again replace `{0.1.0}` with the current version. This gets the most \n+recent version and starts up a docker container\n+(which is kind of like a virtual machine).\n+The `--rm` flag removes the container when it is finished to keep the system\n+cleaned up. The `-it` runs the container in interactive mode. This should \n+not be strictly necessary. The `-v` maps a directory on the current machine\n+into a directory in the docker container. The path on the left should be wherever","path":"README.md","position":230,"original_position":230,"commit_id":"6656a85eba3494e8c6f164b6fbb4e1e8ef70a621","original_commit_id":"6656a85eba3494e8c6f164b6fbb4e1e8ef70a621","user":{"login":"cmccully","id":5331996,"avatar_url":"https://avatars2.githubusercontent.com/u/5331996?v=4","gravatar_id":"","url":"https://api.github.com/users/cmccully","html_url":"https://github.com/cmccully","followers_url":"https://api.github.com/users/cmccully/followers","following_url":"https://api.github.com/users/cmccully/following{/other_user}","gists_url":"https://api.github.com/users/cmccully/gists{/gist_id}","starred_url":"https://api.github.com/users/cmccully/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cmccully/subscriptions","organizations_url":"https://api.github.com/users/cmccully/orgs","repos_url":"https://api.github.com/users/cmccully/repos","events_url":"https://api.github.com/users/cmccully/events{/privacy}","received_events_url":"https://api.github.com/users/cmccully/received_events","type":"User","site_admin":false},"body":"superseded by having a bash script in puppet.","created_at":"2018-05-22T22:04:02Z","updated_at":"2018-05-22T22:04:02Z","html_url":"https://github.com/LCOGT/pupe-pat/pull/3#discussion_r190067700","pull_request_url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/comments/190067700"},"html":{"href":"https://github.com/LCOGT/pupe-pat/pull/3#discussion_r190067700"},"pull_request":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3"}},"in_reply_to_id":190055725},"pull_request":{"url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3","id":189763572,"html_url":"https://github.com/LCOGT/pupe-pat/pull/3","diff_url":"https://github.com/LCOGT/pupe-pat/pull/3.diff","patch_url":"https://github.com/LCOGT/pupe-pat/pull/3.patch","issue_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues/3","number":3,"state":"open","locked":false,"title":"Feature/readme","user":{"login":"cmccully","id":5331996,"avatar_url":"https://avatars2.githubusercontent.com/u/5331996?v=4","gravatar_id":"","url":"https://api.github.com/users/cmccully","html_url":"https://github.com/cmccully","followers_url":"https://api.github.com/users/cmccully/followers","following_url":"https://api.github.com/users/cmccully/following{/other_user}","gists_url":"https://api.github.com/users/cmccully/gists{/gist_id}","starred_url":"https://api.github.com/users/cmccully/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cmccully/subscriptions","organizations_url":"https://api.github.com/users/cmccully/orgs","repos_url":"https://api.github.com/users/cmccully/repos","events_url":"https://api.github.com/users/cmccully/events{/privacy}","received_events_url":"https://api.github.com/users/cmccully/received_events","type":"User","site_admin":false},"body":"Added a readme that uses the new documentation project template and includes usage examples.","created_at":"2018-05-22T19:11:04Z","updated_at":"2018-05-22T22:04:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"77d372e16e5bb541410b1a049828fc64fcf555b1","assignee":null,"assignees":[],"requested_reviewers":[{"login":"irasnyd","id":11426176,"avatar_url":"https://avatars0.githubusercontent.com/u/11426176?v=4","gravatar_id":"","url":"https://api.github.com/users/irasnyd","html_url":"https://github.com/irasnyd","followers_url":"https://api.github.com/users/irasnyd/followers","following_url":"https://api.github.com/users/irasnyd/following{/other_user}","gists_url":"https://api.github.com/users/irasnyd/gists{/gist_id}","starred_url":"https://api.github.com/users/irasnyd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/irasnyd/subscriptions","organizations_url":"https://api.github.com/users/irasnyd/orgs","repos_url":"https://api.github.com/users/irasnyd/repos","events_url":"https://api.github.com/users/irasnyd/events{/privacy}","received_events_url":"https://api.github.com/users/irasnyd/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3/commits","review_comments_url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3/comments","review_comment_url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/comments{/number}","comments_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues/3/comments","statuses_url":"https://api.github.com/repos/LCOGT/pupe-pat/statuses/6656a85eba3494e8c6f164b6fbb4e1e8ef70a621","head":{"label":"LCOGT:feature/readme","ref":"feature/readme","sha":"6656a85eba3494e8c6f164b6fbb4e1e8ef70a621","user":{"login":"LCOGT","id":3358238,"avatar_url":"https://avatars1.githubusercontent.com/u/3358238?v=4","gravatar_id":"","url":"https://api.github.com/users/LCOGT","html_url":"https://github.com/LCOGT","followers_url":"https://api.github.com/users/LCOGT/followers","following_url":"https://api.github.com/users/LCOGT/following{/other_user}","gists_url":"https://api.github.com/users/LCOGT/gists{/gist_id}","starred_url":"https://api.github.com/users/LCOGT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LCOGT/subscriptions","organizations_url":"https://api.github.com/users/LCOGT/orgs","repos_url":"https://api.github.com/users/LCOGT/repos","events_url":"https://api.github.com/users/LCOGT/events{/privacy}","received_events_url":"https://api.github.com/users/LCOGT/received_events","type":"Organization","site_admin":false},"repo":{"id":123046032,"name":"pupe-pat","full_name":"LCOGT/pupe-pat","owner":{"login":"LCOGT","id":3358238,"avatar_url":"https://avatars1.githubusercontent.com/u/3358238?v=4","gravatar_id":"","url":"https://api.github.com/users/LCOGT","html_url":"https://github.com/LCOGT","followers_url":"https://api.github.com/users/LCOGT/followers","following_url":"https://api.github.com/users/LCOGT/following{/other_user}","gists_url":"https://api.github.com/users/LCOGT/gists{/gist_id}","starred_url":"https://api.github.com/users/LCOGT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LCOGT/subscriptions","organizations_url":"https://api.github.com/users/LCOGT/orgs","repos_url":"https://api.github.com/users/LCOGT/repos","events_url":"https://api.github.com/users/LCOGT/events{/privacy}","received_events_url":"https://api.github.com/users/LCOGT/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/LCOGT/pupe-pat","description":"Pupil Plate Ellipticity (PUPE)- Photometric Analysis Tool (PAT)","fork":false,"url":"https://api.github.com/repos/LCOGT/pupe-pat","forks_url":"https://api.github.com/repos/LCOGT/pupe-pat/forks","keys_url":"https://api.github.com/repos/LCOGT/pupe-pat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LCOGT/pupe-pat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LCOGT/pupe-pat/teams","hooks_url":"https://api.github.com/repos/LCOGT/pupe-pat/hooks","issue_events_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues/events{/number}","events_url":"https://api.github.com/repos/LCOGT/pupe-pat/events","assignees_url":"https://api.github.com/repos/LCOGT/pupe-pat/assignees{/user}","branches_url":"https://api.github.com/repos/LCOGT/pupe-pat/branches{/branch}","tags_url":"https://api.github.com/repos/LCOGT/pupe-pat/tags","blobs_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/refs{/sha}","trees_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LCOGT/pupe-pat/statuses/{sha}","languages_url":"https://api.github.com/repos/LCOGT/pupe-pat/languages","stargazers_url":"https://api.github.com/repos/LCOGT/pupe-pat/stargazers","contributors_url":"https://api.github.com/repos/LCOGT/pupe-pat/contributors","subscribers_url":"https://api.github.com/repos/LCOGT/pupe-pat/subscribers","subscription_url":"https://api.github.com/repos/LCOGT/pupe-pat/subscription","commits_url":"https://api.github.com/repos/LCOGT/pupe-pat/commits{/sha}","git_commits_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/commits{/sha}","comments_url":"https://api.github.com/repos/LCOGT/pupe-pat/comments{/number}","issue_comment_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues/comments{/number}","contents_url":"https://api.github.com/repos/LCOGT/pupe-pat/contents/{+path}","compare_url":"https://api.github.com/repos/LCOGT/pupe-pat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LCOGT/pupe-pat/merges","archive_url":"https://api.github.com/repos/LCOGT/pupe-pat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LCOGT/pupe-pat/downloads","issues_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues{/number}","pulls_url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls{/number}","milestones_url":"https://api.github.com/repos/LCOGT/pupe-pat/milestones{/number}","notifications_url":"https://api.github.com/repos/LCOGT/pupe-pat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LCOGT/pupe-pat/labels{/name}","releases_url":"https://api.github.com/repos/LCOGT/pupe-pat/releases{/id}","deployments_url":"https://api.github.com/repos/LCOGT/pupe-pat/deployments","created_at":"2018-02-26T23:47:39Z","updated_at":"2018-05-22T18:33:40Z","pushed_at":"2018-05-22T19:11:05Z","git_url":"git://github.com/LCOGT/pupe-pat.git","ssh_url":"git@github.com:LCOGT/pupe-pat.git","clone_url":"https://github.com/LCOGT/pupe-pat.git","svn_url":"https://github.com/LCOGT/pupe-pat","homepage":null,"size":54,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"LCOGT:master","ref":"master","sha":"a3bc329f2edaa6f7049c4de30b9ef81aa903f67f","user":{"login":"LCOGT","id":3358238,"avatar_url":"https://avatars1.githubusercontent.com/u/3358238?v=4","gravatar_id":"","url":"https://api.github.com/users/LCOGT","html_url":"https://github.com/LCOGT","followers_url":"https://api.github.com/users/LCOGT/followers","following_url":"https://api.github.com/users/LCOGT/following{/other_user}","gists_url":"https://api.github.com/users/LCOGT/gists{/gist_id}","starred_url":"https://api.github.com/users/LCOGT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LCOGT/subscriptions","organizations_url":"https://api.github.com/users/LCOGT/orgs","repos_url":"https://api.github.com/users/LCOGT/repos","events_url":"https://api.github.com/users/LCOGT/events{/privacy}","received_events_url":"https://api.github.com/users/LCOGT/received_events","type":"Organization","site_admin":false},"repo":{"id":123046032,"name":"pupe-pat","full_name":"LCOGT/pupe-pat","owner":{"login":"LCOGT","id":3358238,"avatar_url":"https://avatars1.githubusercontent.com/u/3358238?v=4","gravatar_id":"","url":"https://api.github.com/users/LCOGT","html_url":"https://github.com/LCOGT","followers_url":"https://api.github.com/users/LCOGT/followers","following_url":"https://api.github.com/users/LCOGT/following{/other_user}","gists_url":"https://api.github.com/users/LCOGT/gists{/gist_id}","starred_url":"https://api.github.com/users/LCOGT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LCOGT/subscriptions","organizations_url":"https://api.github.com/users/LCOGT/orgs","repos_url":"https://api.github.com/users/LCOGT/repos","events_url":"https://api.github.com/users/LCOGT/events{/privacy}","received_events_url":"https://api.github.com/users/LCOGT/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/LCOGT/pupe-pat","description":"Pupil Plate Ellipticity (PUPE)- Photometric Analysis Tool (PAT)","fork":false,"url":"https://api.github.com/repos/LCOGT/pupe-pat","forks_url":"https://api.github.com/repos/LCOGT/pupe-pat/forks","keys_url":"https://api.github.com/repos/LCOGT/pupe-pat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LCOGT/pupe-pat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LCOGT/pupe-pat/teams","hooks_url":"https://api.github.com/repos/LCOGT/pupe-pat/hooks","issue_events_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues/events{/number}","events_url":"https://api.github.com/repos/LCOGT/pupe-pat/events","assignees_url":"https://api.github.com/repos/LCOGT/pupe-pat/assignees{/user}","branches_url":"https://api.github.com/repos/LCOGT/pupe-pat/branches{/branch}","tags_url":"https://api.github.com/repos/LCOGT/pupe-pat/tags","blobs_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/refs{/sha}","trees_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LCOGT/pupe-pat/statuses/{sha}","languages_url":"https://api.github.com/repos/LCOGT/pupe-pat/languages","stargazers_url":"https://api.github.com/repos/LCOGT/pupe-pat/stargazers","contributors_url":"https://api.github.com/repos/LCOGT/pupe-pat/contributors","subscribers_url":"https://api.github.com/repos/LCOGT/pupe-pat/subscribers","subscription_url":"https://api.github.com/repos/LCOGT/pupe-pat/subscription","commits_url":"https://api.github.com/repos/LCOGT/pupe-pat/commits{/sha}","git_commits_url":"https://api.github.com/repos/LCOGT/pupe-pat/git/commits{/sha}","comments_url":"https://api.github.com/repos/LCOGT/pupe-pat/comments{/number}","issue_comment_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues/comments{/number}","contents_url":"https://api.github.com/repos/LCOGT/pupe-pat/contents/{+path}","compare_url":"https://api.github.com/repos/LCOGT/pupe-pat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LCOGT/pupe-pat/merges","archive_url":"https://api.github.com/repos/LCOGT/pupe-pat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LCOGT/pupe-pat/downloads","issues_url":"https://api.github.com/repos/LCOGT/pupe-pat/issues{/number}","pulls_url":"https://api.github.com/repos/LCOGT/pupe-pat/pulls{/number}","milestones_url":"https://api.github.com/repos/LCOGT/pupe-pat/milestones{/number}","notifications_url":"https://api.github.com/repos/LCOGT/pupe-pat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LCOGT/pupe-pat/labels{/name}","releases_url":"https://api.github.com/repos/LCOGT/pupe-pat/releases{/id}","deployments_url":"https://api.github.com/repos/LCOGT/pupe-pat/deployments","created_at":"2018-02-26T23:47:39Z","updated_at":"2018-05-22T18:33:40Z","pushed_at":"2018-05-22T19:11:05Z","git_url":"git://github.com/LCOGT/pupe-pat.git","ssh_url":"git@github.com:LCOGT/pupe-pat.git","clone_url":"https://github.com/LCOGT/pupe-pat.git","svn_url":"https://github.com/LCOGT/pupe-pat","homepage":null,"size":54,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3"},"html":{"href":"https://github.com/LCOGT/pupe-pat/pull/3"},"issue":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/issues/3"},"comments":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/LCOGT/pupe-pat/statuses/6656a85eba3494e8c6f164b6fbb4e1e8ef70a621"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"cmccully"}}