{"action":"created","comment":{"url":"https://api.github.com/repos/lsst/sims_photUtils/pulls/comments/40391706","id":40391706,"diff_hunk":"@@ -0,0 +1,331 @@\n+import copy\n+import numpy\n+from collections import OrderedDict\n+from lsst.sims.photUtils import Bandpass, Sed\n+\n+__all__ = [\"BandpassDict\"]\n+\n+class BandpassDict(object):\n+    \"\"\"\n+    This class will wrap an OrderedDict of Bandpass instantiations.\n+\n+    Upon instantiation, this class's constructor will resample\n+    the input Bandpasses to be on the same wavelength grid (defined\n+    by the first input Bandpass).  The constructor will then calculate\n+    the 2-D phiArray for quick calculation of magnitudes in all\n+    Bandpasses simultaneously (see the member method calcMagListFromSed).\n+    \"\"\"\n+\n+    def __init__(self, bandpassList, bandpassNameList):\n+        \"\"\"\n+        @param [in] bandpassList is a list of Bandpass instantiations\n+\n+        @param [in] bandpassNameList is a list of tags to be associated\n+        with those Bandpasses\n+        \"\"\"\n+        self._bandpassDict = OrderedDict()\n+        for bandpassName, bandpass in zip(bandpassNameList, bandpassList):\n+\n+            if bandpassName in self._bandpassDict:\n+                raise RuntimeError(\"The bandpass %s occurs twice in your input \" % bandpassName \\\n+                                   + \"to BandpassDict\")\n+\n+            self._bandpassDict[bandpassName] = copy.deepcopy(bandpass)\n+\n+        dummySed = Sed()\n+        self._phiArray, self._wavelenStep = dummySed.setupPhiArray(self._bandpassDict.values())\n+        self._wavelen_match = self._bandpassDict.values()[0].wavelen\n+        self._nBandpasses = len(self._bandpassDict)\n+\n+\n+    def __getitem__(self, bandpass):\n+        return self._bandpassDict[bandpass]\n+\n+\n+    def __len__(self):\n+        return len(self._bandpassDict)\n+\n+\n+    def __iter__(self):\n+        for val in self._bandpassDict:\n+            yield val\n+\n+\n+    def values(self):\n+        return self._bandpassDict.values()\n+\n+\n+    def keys(self):\n+        return self._bandpassDict.keys()\n+\n+\n+    def calcMagListFromSed(self, sedobj, indices=None):\n+        \"\"\"\n+        Return a list of magnitudes for a single Sed object.\n+\n+        @param [in] sedobj is an Sed object\n+\n+        @param [in] indices is an optional list of indices indicating which bandpasses to actually\n+        calculate magnitudes for.  Other magnitudes will be listed as 'None' (i.e. this method will\n+        return as many magnitudes as were loaded with the loadBandpassesFromFiles methods; it will\n+        just return nonsense for magnitudes you did not actually ask for)\n+\n+        @param [out] magList is a list of magnitudes in the bandpasses stored in self.bandpassDict\n+        \"\"\"\n+\n+        if sedobj.wavelen is not None:\n+\n+            # If the Sed's wavelength grid agrees with self._wavelen_match to one part in\n+            # 10^6, just use the Sed as-is.  Otherwise, copy it and resample it onto\n+            # self._wavelen_match\n+            if len(sedobj.wavelen)!=len(self._wavelen_match) or \\\n+            not numpy.allclose(sedobj.wavelen, self._wavelen_match, atol=0.0, rtol=1.0e-6):\n+                dummySed = Sed(wavelen=sedobj.wavelen, flambda=sedobj.flambda)\n+                dummySed.resampleSED(wavelen_match=self._bandpassDict.values()[0].wavelen)\n+            else:\n+                dummySed = sedobj\n+\n+\n+            #for some reason, moving this call to flambdaTofnu()\n+            #to a point earlier in the\n+            #process results in some SEDs having 'None' for fnu.\n+            #\n+            #I looked more carefully at the documentation in Sed.py\n+            #Any time you update flambda in any way, fnu gets set to 'None'\n+            #This is to prevent the two arrays from getting out synch\n+            #(e.g. renormalizing flambda but forgettint to renormalize fnu)\n+            #\n+            dummySed.flambdaTofnu()\n+\n+            if indices is not None:\n+                magList = [numpy.NaN]*self._nBandpasses\n+\n+                magArray = dummySed.manyMagCalc(self._phiArray, self._wavelenStep, observedBandpassInd=indices)\n+                for i,ix in enumerate(indices):\n+                    magList[ix] = magArray[i]\n+            else:\n+                magList = dummySed.manyMagCalc(self._phiArray, self._wavelenStep)\n+\n+            return numpy.array(magList)\n+\n+        else:\n+            return numpy.array([numpy.NaN]*self._nBandpasses)\n+\n+\n+\n+    def calcMagListFromSedList(self, sedList, indices=None):\n+        \"\"\"\n+        Return a 2-D array of magnitudes from a SedList.\n+        Each row will correspond to a different Sed, each column\n+        will correspond to a different bandpass.\n+\n+        @param [in] sedList is a SedList containing the Seds\n+        whose magnitudes are desired.\n+\n+        @param [in] indices is an optional list of indices indicating which bandpasses to actually\n+        calculate magnitudes for.  Other magnitudes will be listed as 'None' (i.e. this method will\n+        return as many magnitudes as were loaded with the loadBandpassesFromFiles methods; it will\n+        just return nonsense for magnitudes you did not actually ask for)\n+\n+        @param [out] output_list is a 2-D numpy array containing the magnitudes\n+        of each Sed (the rows) in each bandpass contained in this BandpassDict\n+        (the columns)\n+        \"\"\"\n+","path":"python/lsst/sims/photUtils/BandpassDict.py","position":134,"original_position":134,"commit_id":"31e3199342ea7077c0b11cdfab67a5ed93ee3bd0","original_commit_id":"31e3199342ea7077c0b11cdfab67a5ed93ee3bd0","user":{"login":"rbiswas4","id":2281358,"avatar_url":"https://avatars.githubusercontent.com/u/2281358?v=3","gravatar_id":"","url":"https://api.github.com/users/rbiswas4","html_url":"https://github.com/rbiswas4","followers_url":"https://api.github.com/users/rbiswas4/followers","following_url":"https://api.github.com/users/rbiswas4/following{/other_user}","gists_url":"https://api.github.com/users/rbiswas4/gists{/gist_id}","starred_url":"https://api.github.com/users/rbiswas4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rbiswas4/subscriptions","organizations_url":"https://api.github.com/users/rbiswas4/orgs","repos_url":"https://api.github.com/users/rbiswas4/repos","events_url":"https://api.github.com/users/rbiswas4/events{/privacy}","received_events_url":"https://api.github.com/users/rbiswas4/received_events","type":"User","site_admin":false},"body":"- Would be nice to have comments in English on the cases\r\n- How would the user know whether they should resample the Seds to a common wavelength grid or let this routine handle it for better performance?\r\n- Is there a handle on the tolerance values at all. They seem to be chosen consistently across the photUtils modules, and is there a case for making this clear and accessible ? ","created_at":"2015-09-25T01:02:33Z","updated_at":"2015-09-25T01:02:33Z","html_url":"https://github.com/lsst/sims_photUtils/pull/18#discussion_r40391706","pull_request_url":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18","_links":{"self":{"href":"https://api.github.com/repos/lsst/sims_photUtils/pulls/comments/40391706"},"html":{"href":"https://github.com/lsst/sims_photUtils/pull/18#discussion_r40391706"},"pull_request":{"href":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18"}}},"pull_request":{"url":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18","id":44689345,"html_url":"https://github.com/lsst/sims_photUtils/pull/18","diff_url":"https://github.com/lsst/sims_photUtils/pull/18.diff","patch_url":"https://github.com/lsst/sims_photUtils/pull/18.patch","issue_url":"https://api.github.com/repos/lsst/sims_photUtils/issues/18","number":18,"state":"open","locked":false,"title":"Feature/sim 1372/photometry redesign","user":{"login":"danielsf","id":1682854,"avatar_url":"https://avatars.githubusercontent.com/u/1682854?v=3","gravatar_id":"","url":"https://api.github.com/users/danielsf","html_url":"https://github.com/danielsf","followers_url":"https://api.github.com/users/danielsf/followers","following_url":"https://api.github.com/users/danielsf/following{/other_user}","gists_url":"https://api.github.com/users/danielsf/gists{/gist_id}","starred_url":"https://api.github.com/users/danielsf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danielsf/subscriptions","organizations_url":"https://api.github.com/users/danielsf/orgs","repos_url":"https://api.github.com/users/danielsf/repos","events_url":"https://api.github.com/users/danielsf/events{/privacy}","received_events_url":"https://api.github.com/users/danielsf/received_events","type":"User","site_admin":false},"body":"This is a massive overhaul of sims_photUtils\r\n\r\nAll of the mixin-like classes are gone.  PhotometryBase was moved to sims_catUtils.  PhotometryHardware no longer exists.\r\n\r\nTwo new classes have been introduced:\r\n\r\nBandpassDict is effectively a wrapper for OrderedDict meant to hold multiply bandpasses.  You initialize it with a list of Bandpass objects.  It automatically resamples them to the same wavelength grid and calculates the 2-D phi array for all of them.  BandpassDict contains methods calcMagListFromSed and calcMagListFromSedList to calculate the magnitudes of Seds in all of the stored bandpasses, using the facts that the bandpasses have all been sampled to the same wavelength grid and that phi has been pre-computed to speed up the process.  loadTotalBandpassesFromFiles and loadBandpassesFromFiles are now utility functions that return BandpassDicts.\r\n\r\nSedList is a class meant to contain a list of Seds.  It can be fed into BandpassDict's calcMagListFromSedList to get a 2-D numpy array of magnitudes in which each row is a different Sed and each column is a different bandpass.  When you initialize SedList, in addition to giving it a list of Sed filenames and their magnorms, you can give it a list of redshifts, galacticAv, and internalAv to apply redshift and dust extinction to the Seds.  The SedList keeps track of all of the unique Sed files in reads in and reuses them every time you ask it to load the same file (but apply a different normalization, extinction, etc.).  The Seds in SedList can all be sampled to the same wavelength grid by the constructor or not, depending on your choice.\r\n\r\n@jbkalmbach -- I can only assign one reviewer, but I would appreciate your comments on this design, as well.","created_at":"2015-09-10T16:28:28Z","updated_at":"2015-09-25T01:02:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bb92ecf6437d57352928af1d7984606c7ae52049","assignee":{"login":"rbiswas4","id":2281358,"avatar_url":"https://avatars.githubusercontent.com/u/2281358?v=3","gravatar_id":"","url":"https://api.github.com/users/rbiswas4","html_url":"https://github.com/rbiswas4","followers_url":"https://api.github.com/users/rbiswas4/followers","following_url":"https://api.github.com/users/rbiswas4/following{/other_user}","gists_url":"https://api.github.com/users/rbiswas4/gists{/gist_id}","starred_url":"https://api.github.com/users/rbiswas4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rbiswas4/subscriptions","organizations_url":"https://api.github.com/users/rbiswas4/orgs","repos_url":"https://api.github.com/users/rbiswas4/repos","events_url":"https://api.github.com/users/rbiswas4/events{/privacy}","received_events_url":"https://api.github.com/users/rbiswas4/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18/commits","review_comments_url":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18/comments","review_comment_url":"https://api.github.com/repos/lsst/sims_photUtils/pulls/comments{/number}","comments_url":"https://api.github.com/repos/lsst/sims_photUtils/issues/18/comments","statuses_url":"https://api.github.com/repos/lsst/sims_photUtils/statuses/31e3199342ea7077c0b11cdfab67a5ed93ee3bd0","head":{"label":"lsst:feature/SIM-1372/photometryRedesign","ref":"feature/SIM-1372/photometryRedesign","sha":"31e3199342ea7077c0b11cdfab67a5ed93ee3bd0","user":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"repo":{"id":34668465,"name":"sims_photUtils","full_name":"lsst/sims_photUtils","owner":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lsst/sims_photUtils","description":"LSST Simulations package for photometric utility functions","fork":false,"url":"https://api.github.com/repos/lsst/sims_photUtils","forks_url":"https://api.github.com/repos/lsst/sims_photUtils/forks","keys_url":"https://api.github.com/repos/lsst/sims_photUtils/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lsst/sims_photUtils/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lsst/sims_photUtils/teams","hooks_url":"https://api.github.com/repos/lsst/sims_photUtils/hooks","issue_events_url":"https://api.github.com/repos/lsst/sims_photUtils/issues/events{/number}","events_url":"https://api.github.com/repos/lsst/sims_photUtils/events","assignees_url":"https://api.github.com/repos/lsst/sims_photUtils/assignees{/user}","branches_url":"https://api.github.com/repos/lsst/sims_photUtils/branches{/branch}","tags_url":"https://api.github.com/repos/lsst/sims_photUtils/tags","blobs_url":"https://api.github.com/repos/lsst/sims_photUtils/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lsst/sims_photUtils/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lsst/sims_photUtils/git/refs{/sha}","trees_url":"https://api.github.com/repos/lsst/sims_photUtils/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lsst/sims_photUtils/statuses/{sha}","languages_url":"https://api.github.com/repos/lsst/sims_photUtils/languages","stargazers_url":"https://api.github.com/repos/lsst/sims_photUtils/stargazers","contributors_url":"https://api.github.com/repos/lsst/sims_photUtils/contributors","subscribers_url":"https://api.github.com/repos/lsst/sims_photUtils/subscribers","subscription_url":"https://api.github.com/repos/lsst/sims_photUtils/subscription","commits_url":"https://api.github.com/repos/lsst/sims_photUtils/commits{/sha}","git_commits_url":"https://api.github.com/repos/lsst/sims_photUtils/git/commits{/sha}","comments_url":"https://api.github.com/repos/lsst/sims_photUtils/comments{/number}","issue_comment_url":"https://api.github.com/repos/lsst/sims_photUtils/issues/comments{/number}","contents_url":"https://api.github.com/repos/lsst/sims_photUtils/contents/{+path}","compare_url":"https://api.github.com/repos/lsst/sims_photUtils/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lsst/sims_photUtils/merges","archive_url":"https://api.github.com/repos/lsst/sims_photUtils/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lsst/sims_photUtils/downloads","issues_url":"https://api.github.com/repos/lsst/sims_photUtils/issues{/number}","pulls_url":"https://api.github.com/repos/lsst/sims_photUtils/pulls{/number}","milestones_url":"https://api.github.com/repos/lsst/sims_photUtils/milestones{/number}","notifications_url":"https://api.github.com/repos/lsst/sims_photUtils/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lsst/sims_photUtils/labels{/name}","releases_url":"https://api.github.com/repos/lsst/sims_photUtils/releases{/id}","created_at":"2015-04-27T13:31:12Z","updated_at":"2015-05-08T20:31:48Z","pushed_at":"2015-09-18T18:52:47Z","git_url":"git://github.com/lsst/sims_photUtils.git","ssh_url":"git@github.com:lsst/sims_photUtils.git","clone_url":"https://github.com/lsst/sims_photUtils.git","svn_url":"https://github.com/lsst/sims_photUtils","homepage":null,"size":4252,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"lsst:master","ref":"master","sha":"aef155bcf80bde5b20c6b8fa457daa110cdcda10","user":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"repo":{"id":34668465,"name":"sims_photUtils","full_name":"lsst/sims_photUtils","owner":{"login":"lsst","id":1134504,"avatar_url":"https://avatars.githubusercontent.com/u/1134504?v=3","gravatar_id":"","url":"https://api.github.com/users/lsst","html_url":"https://github.com/lsst","followers_url":"https://api.github.com/users/lsst/followers","following_url":"https://api.github.com/users/lsst/following{/other_user}","gists_url":"https://api.github.com/users/lsst/gists{/gist_id}","starred_url":"https://api.github.com/users/lsst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lsst/subscriptions","organizations_url":"https://api.github.com/users/lsst/orgs","repos_url":"https://api.github.com/users/lsst/repos","events_url":"https://api.github.com/users/lsst/events{/privacy}","received_events_url":"https://api.github.com/users/lsst/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/lsst/sims_photUtils","description":"LSST Simulations package for photometric utility functions","fork":false,"url":"https://api.github.com/repos/lsst/sims_photUtils","forks_url":"https://api.github.com/repos/lsst/sims_photUtils/forks","keys_url":"https://api.github.com/repos/lsst/sims_photUtils/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lsst/sims_photUtils/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lsst/sims_photUtils/teams","hooks_url":"https://api.github.com/repos/lsst/sims_photUtils/hooks","issue_events_url":"https://api.github.com/repos/lsst/sims_photUtils/issues/events{/number}","events_url":"https://api.github.com/repos/lsst/sims_photUtils/events","assignees_url":"https://api.github.com/repos/lsst/sims_photUtils/assignees{/user}","branches_url":"https://api.github.com/repos/lsst/sims_photUtils/branches{/branch}","tags_url":"https://api.github.com/repos/lsst/sims_photUtils/tags","blobs_url":"https://api.github.com/repos/lsst/sims_photUtils/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lsst/sims_photUtils/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lsst/sims_photUtils/git/refs{/sha}","trees_url":"https://api.github.com/repos/lsst/sims_photUtils/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lsst/sims_photUtils/statuses/{sha}","languages_url":"https://api.github.com/repos/lsst/sims_photUtils/languages","stargazers_url":"https://api.github.com/repos/lsst/sims_photUtils/stargazers","contributors_url":"https://api.github.com/repos/lsst/sims_photUtils/contributors","subscribers_url":"https://api.github.com/repos/lsst/sims_photUtils/subscribers","subscription_url":"https://api.github.com/repos/lsst/sims_photUtils/subscription","commits_url":"https://api.github.com/repos/lsst/sims_photUtils/commits{/sha}","git_commits_url":"https://api.github.com/repos/lsst/sims_photUtils/git/commits{/sha}","comments_url":"https://api.github.com/repos/lsst/sims_photUtils/comments{/number}","issue_comment_url":"https://api.github.com/repos/lsst/sims_photUtils/issues/comments{/number}","contents_url":"https://api.github.com/repos/lsst/sims_photUtils/contents/{+path}","compare_url":"https://api.github.com/repos/lsst/sims_photUtils/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lsst/sims_photUtils/merges","archive_url":"https://api.github.com/repos/lsst/sims_photUtils/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lsst/sims_photUtils/downloads","issues_url":"https://api.github.com/repos/lsst/sims_photUtils/issues{/number}","pulls_url":"https://api.github.com/repos/lsst/sims_photUtils/pulls{/number}","milestones_url":"https://api.github.com/repos/lsst/sims_photUtils/milestones{/number}","notifications_url":"https://api.github.com/repos/lsst/sims_photUtils/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lsst/sims_photUtils/labels{/name}","releases_url":"https://api.github.com/repos/lsst/sims_photUtils/releases{/id}","created_at":"2015-04-27T13:31:12Z","updated_at":"2015-05-08T20:31:48Z","pushed_at":"2015-09-18T18:52:47Z","git_url":"git://github.com/lsst/sims_photUtils.git","ssh_url":"git@github.com:lsst/sims_photUtils.git","clone_url":"https://github.com/lsst/sims_photUtils.git","svn_url":"https://github.com/lsst/sims_photUtils","homepage":null,"size":4252,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":2,"forks":2,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18"},"html":{"href":"https://github.com/lsst/sims_photUtils/pull/18"},"issue":{"href":"https://api.github.com/repos/lsst/sims_photUtils/issues/18"},"comments":{"href":"https://api.github.com/repos/lsst/sims_photUtils/issues/18/comments"},"review_comments":{"href":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18/comments"},"review_comment":{"href":"https://api.github.com/repos/lsst/sims_photUtils/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/lsst/sims_photUtils/pulls/18/commits"},"statuses":{"href":"https://api.github.com/repos/lsst/sims_photUtils/statuses/31e3199342ea7077c0b11cdfab67a5ed93ee3bd0"}}}}