{"action":"created","comment":{"url":"https://api.github.com/repos/lsst/meas_base/pulls/comments/43044566","id":43044566,"diff_hunk":"@@ -57,87 +59,153 @@ class FootprintBits : public afw::detection::FootprintFunctor<MaskedImageT> {\n private:\n     typename MaskedImageT::Mask::Pixel _bits;\n };\n-}  // end anonymous namespace\n+\n PixelFlagsAlgorithm::PixelFlagsAlgorithm(\n     Control const & ctrl,\n     std::string const & name,\n     afw::table::Schema & schema\n-) : _ctrl(ctrl),\n-    _centroidExtractor(schema, name)\n+) : _ctrl(ctrl)\n {\n-    static boost::array<FlagDefinition,N_FLAGS> const flagDefs = {{\n-        {\"flag\", \"general failure flag, set if anything went wrong\"},\n-        {\"flag_edge\", \"Source is outside usable exposure region (masked EDGE or NO_DATA)\"},\n-        {\"flag_interpolated\", \"Interpolated pixel in the source footprint\"},\n-        {\"flag_interpolatedCenter\", \"Interpolated pixel in the source center\"},\n-        {\"flag_saturated\", \"Saturated pixel in the source footprint\"},\n-        {\"flag_saturatedCenter\", \"Saturated pixel in the source center\"},\n-        {\"flag_cr\", \"Cosmic ray in the source footprint\"},\n-        {\"flag_crCenter\", \"Cosmic ray in the source center\"},\n-        {\"flag_bad\", \"Bad pixel in the source footprint\"}\n-    }};\n-    _flagHandler = FlagHandler::addFields(schema, name, flagDefs.begin(), flagDefs.end());\n+    // Add generic keys first, which don't correspond to specific mask planes\n+    _generalFailure = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname,\n+                                        \"general failure flag, set if anything went wring\");\n+    _offImageKey = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_offimage\", \n+                                        \"source center is off image\");\n+    // Set all the flags that correspond to mask planes anywhere in the footprint\n+    _predefinedAnyKeys[\"EDGE\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_edge\",\n+                                        \"Source is outside usable exposure region (masked EDGE or NO_DATA)\");\n+    _predefinedAnyKeys[\"INTRP\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_interpolated\",\n+                                        \"Interpolated pixel in the source footprint\");\n+    _predefinedAnyKeys[\"SAT\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_saturated\",\n+                                        \"Saturated pixel in the source footprint\");\n+    _predefinedAnyKeys[\"CR\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_cr\",\n+                                        \"Cosmic ray in the source footprint\");\n+    _predefinedAnyKeys[\"BAD\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_bad\",\n+                                        \"Bad pixel in the source footprint\");\n+    _predefinedAnyKeys[\"SUSPECT\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_suspect\",\n+                                        \"source's footprint includes suspect pixels\");\n+    // Flags that correspond to mask bits which occur in the center of the object\n+    _predefinedCenterKeys[\"INTRP\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_interpolatedCenter\",\n+                                        \"Interpolated pixel in the source center\");\n+    _predefinedCenterKeys[\"SAT\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_saturatedCenter\",\n+                                        \"Saturated pixel in the source center\");\n+    _predefinedCenterKeys[\"CR\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_crCenter\",\n+                                        \"Cosmic ray in the source center\");\n+    _predefinedCenterKeys[\"SUSPECT\"] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_suspectCenter\",\n+                                        \"source's center is close to suspect pixels\");\n+\n+    // Read in the flags passed from the configuration, and add them to the schema\n+    for (std::vector<std::string>::const_iterator i = _ctrl.center.begin(); i != _ctrl.center.end(); ++i){\n+        std::string tname(*i);\n+        std::transform(tname.begin(), tname.end(), tname.begin(), ::tolower);\n+        _centerKeys[*i] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname+\"_\"+tname+\"Center\",\n+                                        \"source center is close to \"+ *i + \" pixels\");\n+    }\n+    for (std::vector<std::string>::const_iterator i = _ctrl.any.begin(); i != _ctrl.any.end(); ++i){\n+        std::string tname(*i);\n+        std::transform(tname.begin(), tname.end(), tname.begin(), ::tolower);\n+        _anyKeys[*i] = schema.addField<afw::table::Flag>(name+\"_\"+_ctrl.fname + \"_\" + tname,\n+                                        \"source footprint includes \" + *i + \" pixels\");\n+    }\n }\n+void PixelFlagsAlgorithm::updateFlags(const KeyMap * maskFlagToPixelFlag, const FootprintBits<MaskedImageT> * func,\n+                                      afw::table::SourceRecord & measRecord) const{\n+        lsst::afw::image::MaskPixel bitmask = 0x0;\n+        for (KeyMap::const_iterator i = maskFlagToPixelFlag->begin(); i != maskFlagToPixelFlag->end(); ++i){\n+            try {\n+                bitmask = MaskedImageT::Mask::getPlaneBitMask(i->first);\n+            } catch (pex::exceptions::InvalidParameterError & err){\n+                throw LSST_EXCEPT(FatalAlgorithmError, err.what());\n+            }\n+            if (func->getBits() & MaskedImageT::Mask::getPlaneBitMask(i->first)){\n+                measRecord.set(i->second, true);\n+            }\n+        }\n+    }\n \n void PixelFlagsAlgorithm::measure(\n     afw::table::SourceRecord & measRecord,\n     afw::image::Exposure<float> const & exposure\n ) const {\n \n-    afw::geom::Point2D center = _centroidExtractor(measRecord, _flagHandler);\n-    typedef afw::image::MaskedImage<float> MaskedImageT;\n     MaskedImageT mimage = exposure.getMaskedImage();\n-\n     FootprintBits<MaskedImageT> func(mimage);\n-\n-//  Catch NAN in centroid estimate\n-    if (lsst::utils::isnan(center.getX()) || lsst::utils::isnan(center.getY())) {\n-        throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,\n-                          \"Center point passed to PixelFlagsALgorithm is NaN\");\n+    \n+    // Check if the measRecord has a valid centroid key, i.e. it was\n+    // centroided\n+    afw::geom::Point2D center;\n+    if (measRecord.getTable()->getCentroidKey().isValid()) {\n+        center = measRecord.getCentroid(); \n+        //  Catch NAN in centroid estimate\n+        if (lsst::utils::isnan(center.getX()) || lsst::utils::isnan(center.getY())) {\n+            throw LSST_EXCEPT(pex::exceptions::RuntimeError,\"Center point passed to PixelFlagsAlgorithm is Nan\");\n+        }\n+    }\n+    else {\n+        // Attempting to set pixel flags with no centroider, the center will\n+        // be determined though the peak pixel\n+        PTR(afw::detection::Footprint) footprint = measRecord.getFootprint();\n+        // If there is no footprint or the footprint contains no peaks, throw\n+        // a runtime error.\n+        if (!footprint || footprint->getPeaks().empty()){\n+            throw LSST_EXCEPT(pex::exceptions::RuntimeError,\"No footprint, or no footprint peaks detected\");\n+        }\n+        else {\n+            center.setX(footprint->getPeaks().front().getFx());\n+            center.setY(footprint->getPeaks().front().getFy());\n+        }\n     }\n-//  Catch centroids off the image\n+\n+    //  Initialize bitmask to use in try statments\n+    lsst::afw::image::MaskPixel bitmask = 0x0;\n+\n+    //  Catch centroids off the image\n     if (!mimage.getBBox().contains(afw::geom::Point2I(center))) {\n-       _flagHandler.setValue(measRecord, EDGE, true);\n+        measRecord.set(_offImageKey, true);\n+        auto iter = _predefinedAnyKeys.find(\"EDGE\");\n+        assert(iter != _predefinedAnyKeys.end());\n+        measRecord.set(iter->second, true);\n     }\n+\n     // Check for bits set in the source's Footprint\n     afw::detection::Footprint const & footprint(*measRecord.getFootprint());\n     func.apply(footprint);\n-    if (func.getBits() & (MaskedImageT::Mask::getPlaneBitMask(\"EDGE\") |\n-                          MaskedImageT::Mask::getPlaneBitMask(\"NO_DATA\"))) {\n-        _flagHandler.setValue(measRecord, EDGE, true);\n-    }\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"BAD\")) {\n-        _flagHandler.setValue(measRecord, BAD, true);\n-    }\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"INTRP\")) {\n-        _flagHandler.setValue(measRecord, INTERPOLATED, true);\n-    }\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"SAT\")) {\n-        _flagHandler.setValue(measRecord, SATURATED, true);\n+\n+    // Check to make sure the NO_DATA mask exists\n+    try {\n+        bitmask = MaskedImageT::Mask::getPlaneBitMask(\"NO_DATA\");\n+    } catch (pex::exceptions::InvalidParameterError & err){\n+        throw LSST_EXCEPT(FatalAlgorithmError, err.what());\n     }\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"CR\")) {\n-        _flagHandler.setValue(measRecord, CR, true);\n+\n+    // Set the EDGE flag if the bitmask has NO_DATA set\n+    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"NO_DATA\")){\n+        auto iter = _predefinedAnyKeys.find(\"EDGE\");\n+        assert(iter != _predefinedAnyKeys.end());\n+        measRecord.set(iter->second, true);\n     }\n \n+    // update the source record for the predefined any keys\n+    updateFlags(&_predefinedAnyKeys,&func,measRecord);\n+\n     // Check for bits set in the 3x3 box around the center\n-    afw::geom::Point2I llc(afw::image::positionToIndex(center.getX())-1, afw::image::positionToIndex(center.getY()) - 1);\n+    afw::geom::Point2I llc(afw::image::positionToIndex(center.getX())-1,\n+                           afw::image::positionToIndex(center.getY()) - 1);\n \n     afw::detection::Footprint const middle(afw::geom::BoxI(llc, afw::geom::ExtentI(3))); // central 3x3\n     func.apply(middle);\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"INTRP\")) {\n-        _flagHandler.setValue(measRecord, INTERPOLATED_CENTER, true);\n-    }\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"SAT\")) {\n-        _flagHandler.setValue(measRecord, SATURATED_CENTER, true);\n-    }\n-    if (func.getBits() & MaskedImageT::Mask::getPlaneBitMask(\"CR\")) {\n-        _flagHandler.setValue(measRecord, CR_CENTER, true);\n-    }\n-    _flagHandler.setValue(measRecord, FAILURE, false);\n+\n+    // Update the built in flags which have to do with the center of the footprint\n+    updateFlags(&_predefinedCenterKeys,&func,measRecord);\n+\n+    // update all the flags that are defined in the config\n+    updateFlags(&_anyKeys, &func, measRecord);\n+    updateFlags(&_centerKeys, &func, measRecord);\n }\n \n void PixelFlagsAlgorithm::fail(afw::table::SourceRecord & measRecord, MeasurementError * error) const {\n-    _flagHandler.handleFailure(measRecord, error);\n+    measRecord.set(_generalFailure,true);\n+    assert (error == NULL);","path":"src/PixelFlags.cc","position":217,"original_position":217,"commit_id":"1ce7a26565d71052df68ec6aa57c8fa7083e88d4","original_commit_id":"1ce7a26565d71052df68ec6aa57c8fa7083e88d4","user":{"login":"natelust","id":6371766,"avatar_url":"https://avatars.githubusercontent.com/u/6371766?v=3","gravatar_id":"","url":"https://api.github.com/users/natelust","html_url":"https://github.com/natelust","followers_url":"https://api.github.com/users/natelust/followers","following_url":"https://api.github.com/users/natelust/following{/other_user}","gists_url":"https://api.github.com/users/natelust/gists{/gist_id}","starred_url":"https://api.github.com/users/natelust/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/natelust/subscriptions","organizations_url":"https://api.github.com/users/natelust/orgs","repos_url":"https://api.github.com/users/natelust/repos","events_url":"https://api.github.com/users/natelust/events{/privacy}","received_events_url":"https://api.github.com/users/natelust/received_events","type":"User","site_admin":false},"body":"added explanatory comment","created_at":"2015-10-26T20:01:35Z","updated_at":"2015-10-26T20:01:35Z","html_url":"https://github.com/lsst/meas_base/pull/26#discussion_r43044566","pull_request_url":"https://api.github.com/repos/lsst/meas_base/pulls/26","_links":{"self":{"href":"https://api.github.com/repos/lsst/meas_base/pulls/comments/43044566"},"html":{"href":"https://github.com/lsst/meas_base/pull/26#discussion_r43044566"},"pull_request":{"href":"https://api.github.com/repos/lsst/meas_base/pulls/26"}}},"pull_request":{"url":"https://api.github.com/repos/lsst/meas_base/pulls/26","id":48339643,"html_url":"https://github.com/lsst/meas_base/pull/26","diff_url":"https://github.com/lsst/meas_base/pull/26.diff","patch_url":"https://github.com/lsst/meas_base/pull/26.patch","issue_url":"https://api.github.com/repos/lsst/meas_base/issues/26","number":26,"state":"open","locked":false,"title":"Review for DM-2195 (Port safe coadd clipping from HSC)","user":{"login":"jdswinbank","id":460854,"avatar_url":"https://avatars.githubusercontent.com/u/460854?v=3","gravatar_id":"","url":"https://api.github.com/users/jdswinbank","html_url":"https://github.com/jdswinbank","followers_url":"https://api.github.com/users/jdswinbank/followers","following_url":"https://api.github.com/users/jdswinbank/following{/other_user}","gists_url":"https://api.github.com/users/jdswinbank/gists{/gist_id}","starred_url":"https://api.github.com/users/jdswinbank/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdswinbank/subscriptions","organizations_url":"https://api.github.com/users/jdswinbank/orgs","repos_url":"https://api.github.com/users/jdswinbank/repos","events_url":"https://api.github.com/users/jdswinbank/events{/privacy}","received_events_url":"https://api.github.com/users/jdswinbank/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-10-21T14:35:19Z","updated_at":"2015-10-26T20:01:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8f4ccada1f073718cd214b522d3c801fcf9a0d07","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/lsst/meas_base/pulls/26/commits","review_comments_url":"https://api.github.com/repos/lsst/meas_base/pulls/26/comments","review_comment_url":"https://api.github.com/repos/lsst/meas_base/pulls/comments{/number}","comments_url":"https://api.github.com/repos/lsst/meas_base/issues/26/comments","statuses_url":"https://api.github.com/repos/lsst/meas_base/statuses/1ce7a26565d71052df68ec6aa57c8fa7083e88d4","head":{"label":"lsst:tickets/DM-2915","ref":"tickets/DM-2915","sha":"1ce7a26565d71052df68ec6aa57c8fa7083e88d4","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":23013356,"name":"meas_base","full_name":"lsst/meas_base","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/meas_base","description":"LSST Data Management: core astronomical measurement algorithms","fork":false,"url":"https://api.github.com/repos/lsst/meas_base","forks_url":"https://api.github.com/repos/lsst/meas_base/forks","keys_url":"https://api.github.com/repos/lsst/meas_base/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lsst/meas_base/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lsst/meas_base/teams","hooks_url":"https://api.github.com/repos/lsst/meas_base/hooks","issue_events_url":"https://api.github.com/repos/lsst/meas_base/issues/events{/number}","events_url":"https://api.github.com/repos/lsst/meas_base/events","assignees_url":"https://api.github.com/repos/lsst/meas_base/assignees{/user}","branches_url":"https://api.github.com/repos/lsst/meas_base/branches{/branch}","tags_url":"https://api.github.com/repos/lsst/meas_base/tags","blobs_url":"https://api.github.com/repos/lsst/meas_base/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lsst/meas_base/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lsst/meas_base/git/refs{/sha}","trees_url":"https://api.github.com/repos/lsst/meas_base/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lsst/meas_base/statuses/{sha}","languages_url":"https://api.github.com/repos/lsst/meas_base/languages","stargazers_url":"https://api.github.com/repos/lsst/meas_base/stargazers","contributors_url":"https://api.github.com/repos/lsst/meas_base/contributors","subscribers_url":"https://api.github.com/repos/lsst/meas_base/subscribers","subscription_url":"https://api.github.com/repos/lsst/meas_base/subscription","commits_url":"https://api.github.com/repos/lsst/meas_base/commits{/sha}","git_commits_url":"https://api.github.com/repos/lsst/meas_base/git/commits{/sha}","comments_url":"https://api.github.com/repos/lsst/meas_base/comments{/number}","issue_comment_url":"https://api.github.com/repos/lsst/meas_base/issues/comments{/number}","contents_url":"https://api.github.com/repos/lsst/meas_base/contents/{+path}","compare_url":"https://api.github.com/repos/lsst/meas_base/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lsst/meas_base/merges","archive_url":"https://api.github.com/repos/lsst/meas_base/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lsst/meas_base/downloads","issues_url":"https://api.github.com/repos/lsst/meas_base/issues{/number}","pulls_url":"https://api.github.com/repos/lsst/meas_base/pulls{/number}","milestones_url":"https://api.github.com/repos/lsst/meas_base/milestones{/number}","notifications_url":"https://api.github.com/repos/lsst/meas_base/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lsst/meas_base/labels{/name}","releases_url":"https://api.github.com/repos/lsst/meas_base/releases{/id}","created_at":"2014-08-16T07:45:37Z","updated_at":"2015-04-21T20:29:36Z","pushed_at":"2015-10-23T09:17:19Z","git_url":"git://github.com/lsst/meas_base.git","ssh_url":"git@github.com:lsst/meas_base.git","clone_url":"https://github.com/lsst/meas_base.git","svn_url":"https://github.com/lsst/meas_base","homepage":"http://dm.lsst.org/","size":4219,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"lsst:master","ref":"master","sha":"00e2fb62e05e1a433bcfae8a7023838c2089d079","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":23013356,"name":"meas_base","full_name":"lsst/meas_base","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/meas_base","description":"LSST Data Management: core astronomical measurement algorithms","fork":false,"url":"https://api.github.com/repos/lsst/meas_base","forks_url":"https://api.github.com/repos/lsst/meas_base/forks","keys_url":"https://api.github.com/repos/lsst/meas_base/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lsst/meas_base/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lsst/meas_base/teams","hooks_url":"https://api.github.com/repos/lsst/meas_base/hooks","issue_events_url":"https://api.github.com/repos/lsst/meas_base/issues/events{/number}","events_url":"https://api.github.com/repos/lsst/meas_base/events","assignees_url":"https://api.github.com/repos/lsst/meas_base/assignees{/user}","branches_url":"https://api.github.com/repos/lsst/meas_base/branches{/branch}","tags_url":"https://api.github.com/repos/lsst/meas_base/tags","blobs_url":"https://api.github.com/repos/lsst/meas_base/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lsst/meas_base/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lsst/meas_base/git/refs{/sha}","trees_url":"https://api.github.com/repos/lsst/meas_base/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lsst/meas_base/statuses/{sha}","languages_url":"https://api.github.com/repos/lsst/meas_base/languages","stargazers_url":"https://api.github.com/repos/lsst/meas_base/stargazers","contributors_url":"https://api.github.com/repos/lsst/meas_base/contributors","subscribers_url":"https://api.github.com/repos/lsst/meas_base/subscribers","subscription_url":"https://api.github.com/repos/lsst/meas_base/subscription","commits_url":"https://api.github.com/repos/lsst/meas_base/commits{/sha}","git_commits_url":"https://api.github.com/repos/lsst/meas_base/git/commits{/sha}","comments_url":"https://api.github.com/repos/lsst/meas_base/comments{/number}","issue_comment_url":"https://api.github.com/repos/lsst/meas_base/issues/comments{/number}","contents_url":"https://api.github.com/repos/lsst/meas_base/contents/{+path}","compare_url":"https://api.github.com/repos/lsst/meas_base/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lsst/meas_base/merges","archive_url":"https://api.github.com/repos/lsst/meas_base/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lsst/meas_base/downloads","issues_url":"https://api.github.com/repos/lsst/meas_base/issues{/number}","pulls_url":"https://api.github.com/repos/lsst/meas_base/pulls{/number}","milestones_url":"https://api.github.com/repos/lsst/meas_base/milestones{/number}","notifications_url":"https://api.github.com/repos/lsst/meas_base/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lsst/meas_base/labels{/name}","releases_url":"https://api.github.com/repos/lsst/meas_base/releases{/id}","created_at":"2014-08-16T07:45:37Z","updated_at":"2015-04-21T20:29:36Z","pushed_at":"2015-10-23T09:17:19Z","git_url":"git://github.com/lsst/meas_base.git","ssh_url":"git@github.com:lsst/meas_base.git","clone_url":"https://github.com/lsst/meas_base.git","svn_url":"https://github.com/lsst/meas_base","homepage":"http://dm.lsst.org/","size":4219,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":2,"forks":1,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/lsst/meas_base/pulls/26"},"html":{"href":"https://github.com/lsst/meas_base/pull/26"},"issue":{"href":"https://api.github.com/repos/lsst/meas_base/issues/26"},"comments":{"href":"https://api.github.com/repos/lsst/meas_base/issues/26/comments"},"review_comments":{"href":"https://api.github.com/repos/lsst/meas_base/pulls/26/comments"},"review_comment":{"href":"https://api.github.com/repos/lsst/meas_base/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/lsst/meas_base/pulls/26/commits"},"statuses":{"href":"https://api.github.com/repos/lsst/meas_base/statuses/1ce7a26565d71052df68ec6aa57c8fa7083e88d4"}}}}