GitHub PullRequestReviewCommentEvent at 2014-08-26 21:03:53
Repository: mdtraj
Actor: kyleabeauchamp
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/comments/16742413","id":16742413,"diff_hunk":"@@ -0,0 +1,398 @@\n+/**\n+ * DSSP secondary structure assignment\n+ * Copyright [2014] Stanford University and the Authors\n+ * Authors: Robert T. McGibbon, Maarten L. Hekkelman\n+ *\n+ * This code is adapted from DSSP-2.2.0, written by Maarten L. Hekkelman,\n+ * and ported to MDTraj by Robert T. McGibbon. DSSP-2.2.0 is distributed\n+ * under the Boost Software License, Version 1.0. This code, as part of\n+ * MDTraj, is distributed under the GNU LGPL.\n+ */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <vector>\n+#include <deque>\n+#include <set>\n+#include <map>\n+#include <algorithm>\n+#include \"geometry.h\"\n+\n+#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))\n+#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))\n+#define CLIP(X, X_min, X_max) (MIN(MAX(X, X_min), X_max))\n+\n+#ifndef __SSE4_1__\n+#error\n+#else\n+#include <pmmintrin.h>\n+#include <smmintrin.h>\n+#include \"ssetools.h\"\n+#include \"msvccompat.h\"\n+#include <math.h>\n+\n+enum helix_flag_t {HELIX_NONE, HELIX_START, HELIX_END, HELIX_START_AND_END, HELIX_MIDDLE};\n+enum bridge_t {BRIDGE_NONE, BRIDGE_PARALLEL, BRIDGE_ANTIPARALLEL};\n+enum ss_t {SS_LOOP, SS_ALPHAHELIX, SS_BETABRIDGE, SS_STRAND, SS_HELIX_3, SS_HELIX_5,\n+          SS_TURN, SS_BEND};\n+\n+struct MBridge {\n+    bridge_t type;\n+    std::deque<int> i, j;\n+    int chain_i, chain_j;\n+\n+    MBridge(bridge_t type, int chain_i, int chain_j, int first_i, int first_j):\n+        type(type),\n+        chain_i(chain_i),\n+        chain_j(chain_j)\n+    {\n+        i.push_back(first_i);\n+        j.push_back(first_j);\n+    };\n+\n+    bool operator<(const MBridge& b) const {\n+        return chain_i < b.chain_i || (chain_i == b.chain_i && i.front() < b.i.front());\n+    }\n+};\n+\n+\n+/**\n+ * Is there an h-bond from donor to acceptor\n+ */\n+static bool _test_bond(int donor, int acceptor, const int* hbonds)\n+{\n+    return (hbonds[donor*2 + 0] == acceptor) || (hbonds[donor*2+1] == acceptor);\n+}\n+\n+\n+/**\n+ * Test whether two residues are engaged in a beta-bridge\n+ *\n+ * Equivalent to MBridgeType MResidue::TestBridge(MResidue* test)\n+ * from dssp-2.2.0/strucrure.cpp:687\n+ */\n+static bridge_t _residue_test_bridge(int i, int j, int n_residues,\n+    const int* chain_ids, const int* hbonds)\n+{\n+    // printf(\"testing bridge %d, %d\\n\", i, j);\n+    const int a=i-1, b=i, c=i+1;\n+    const int d=j-1, e=j, f=j+1;\n+    // printf(\"e=%d, b=%d: %d\\n\", e, b, _test_bond(e, b, hbonds));\n+\n+    if (a >= 0 && c < n_residues && chain_ids[a] == chain_ids[c] &&\n+        d >= 0 && f < n_residues && chain_ids[d] == chain_ids[f]) {\n+\n+        if ((_test_bond(c, e, hbonds) && _test_bond(e, a, hbonds)) ||\n+            (_test_bond(f, b, hbonds) && _test_bond(b, d, hbonds)))\n+                return BRIDGE_PARALLEL;\n+        if ((_test_bond(c, d, hbonds) && _test_bond(f, a, hbonds)) ||\n+            (_test_bond(e, b, hbonds) && _test_bond(b, e, hbonds)))\n+                return BRIDGE_ANTIPARALLEL;\n+    }\n+\n+    return BRIDGE_NONE;\n+}\n+\n+\n+/**\n+ * Identify the beta secondary structure elements. This modifies the\n+ * vector `secondary` in place.\n+ *\n+ * Equivalent to MProtein::CalculateBetaSheets(const vector<MResidue*>& inResidues)\n+ * from dssp-2.2.0/structure.cpp:1793\n+ */\n+static void calculate_beta_sheets(const int* chain_ids, const int* hbonds,\n+    const std::vector<int>& skip, const int n_residues, std::vector<ss_t>& secondary)\n+{\n+    std::vector<MBridge> bridges;\n+\n+    // Calculate bridges\n+    for (int i = 1; i < n_residues - 4; i++) {\n+        for (int j = i+3; j < n_residues - 1; j++) {\n+            bridge_t type = _residue_test_bridge(j, i, n_residues, chain_ids, hbonds);\n+            if (type == BRIDGE_NONE || skip[i] || skip[j]) {\n+                continue;\n+            }\n+\n+            // printf(\"Initial bridge between %d and %d\\n\", i, j);\n+            bool found = false;\n+            for (std::vector<MBridge>::iterator bridge = bridges.begin();\n+                 bridge != bridges.end(); ++bridge) {\n+\n+                if (type != bridge->type || i != bridge->i.back() + 1)\n+                    continue;\n+\n+                if (type == BRIDGE_PARALLEL && bridge->j.back() + 1 == j) {\n+                    bridge->i.push_back(i);\n+                    bridge->j.push_back(j);\n+                    found = true;\n+                    break;\n+                }\n+\n+                if (type == BRIDGE_ANTIPARALLEL && bridge->j.front() - 1 == j) {\n+                    bridge->i.push_back(i);\n+                    bridge->j.push_front(j);\n+                    found = true;\n+                    break;\n+                }\n+            }\n+            if (!found) {\n+                MBridge bridge(type, chain_ids[i], chain_ids[j], i, j);\n+                bridges.push_back(bridge);\n+            }\n+        }\n+    }\n+\n+    // Extend ladders\n+    sort(bridges.begin(), bridges.end());\n+    for (unsigned int i = 0; i < bridges.size(); ++i) {\n+        for (unsigned int j = i + 1; j < bridges.size(); ++j) {\n+            unsigned int ibi = bridges[i].i.front();\n+            unsigned int iei = bridges[i].i.back();\n+            unsigned int jbi = bridges[i].j.front();\n+            unsigned int jei = bridges[i].j.back();\n+            unsigned int ibj = bridges[j].i.front();\n+            unsigned int iej = bridges[j].i.back();\n+            unsigned int jbj = bridges[j].j.front();\n+            unsigned int jej = bridges[j].j.back();\n+\n+            if ((bridges[i].type != bridges[j].type) ||\n+                chain_ids[std::min(ibi, ibj)] != chain_ids[std::max(iei, iej)] ||\n+                chain_ids[std::min(jbi, jbj)] != chain_ids[std::max(jei, jej)] ||\n+                ibj - iei >= 6 || (iei >= ibj && ibi <= iej)) {\n+                    continue;\n+            }\n+\n+            bool bulge;\n+            if (bridges[i].type == BRIDGE_PARALLEL)\n+                bulge = ((jbj - jei < 6 && ibj - iei < 3) || (jbj - jei < 3));\n+            else\n+                bulge = ((jbi - jej < 6 && ibj - iei < 3) || (jbi - jej < 3));\n+\n+            if (bulge) {\n+                bridges[i].i.insert(bridges[i].i.end(), bridges[j].i.begin(), bridges[j].i.end());\n+                if (bridges[i].type == BRIDGE_PARALLEL)\n+                    bridges[i].j.insert(bridges[i].j.end(), bridges[j].j.begin(), bridges[j].j.end());\n+                else\n+                    bridges[i].j.insert(bridges[i].j.begin(), bridges[j].j.begin(), bridges[j].j.end());\n+                bridges.erase(bridges.begin() + j);\n+                --j;\n+            }\n+        }\n+    }\n+\n+    for (std::vector<MBridge>::iterator bridge = bridges.begin();\n+         bridge != bridges.end(); ++bridge) {\n+         // printf(\"Bridge from i in (%d, %d)    j in (%d, %d)\\n\", bridge->i.front(), bridge->i.back(), bridge->j.front(), bridge->j.back());\n+\n+        ss_t ss = SS_BETABRIDGE;\n+        if (bridge->i.size() > 1)\n+            ss = SS_STRAND;\n+\n+        for (int i = bridge->i.front(); i <= bridge->i.back(); ++i) {\n+            if (secondary[i] != SS_STRAND)\n+                secondary[i] = ss;\n+         }\n+\n+        for (int i = bridge->j.front(); i <= bridge->j.back(); ++i) {\n+            if (secondary[i] != SS_STRAND)\n+                secondary[i] = ss;\n+        }\n+    }\n+}\n+\n+\n+/**\n+ * Identify bends in the chain, where the kappa angle (virtual bond angle from\n+ * c-alpha i-2, to i, to i+2) is greater than 70 degrees\n+ * dssp-2.2.0/structure.cpp:1729\n+ */\n+static std::vector<int> calculate_bends(const float* xyz, const int* ca_indices,\n+    const int* chain_ids, const int n_residues, std::vector<int>& skip)\n+{\n+    __m128 prev_ca, this_ca, next_ca, u_prime, v_prime, u, v;\n+    float kappa;\n+    std::vector<int> is_bend(n_residues, 0);\n+    for (int i = 2; i < n_residues-2; i++) {\n+        if (chain_ids[i-2] == chain_ids[i+2] && !skip[i-2] && !skip[i] && !skip[i+2]) {\n+            prev_ca = load_float3(xyz + 3*ca_indices[i-2]);\n+            this_ca = load_float3(xyz + 3*ca_indices[i]);\n+            next_ca = load_float3(xyz + 3*ca_indices[i+2]);\n+            u_prime = _mm_sub_ps(prev_ca, this_ca);\n+            v_prime = _mm_sub_ps(this_ca, next_ca);\n+            /* normalize the vectors u_prime and v_prime */\n+            u = _mm_div_ps(u_prime, _mm_sqrt_ps(_mm_dp_ps(u_prime, u_prime, 0x7F)));\n+            v = _mm_div_ps(v_prime, _mm_sqrt_ps(_mm_dp_ps(v_prime, v_prime, 0x7F)));\n+            /* compute the arccos of the dot product. this gives the angle */\n+            kappa = (float) acos(CLIP(_mm_cvtss_f32(_mm_dp_ps(u, v, 0x71)), -1, 1));\n+            is_bend[i] = kappa > (70 * (M_PI / 180.0));\n+        }\n+    }\n+    return is_bend;\n+}\n+\n+\n+/**\n+ * Identify the helical secondary structure elements. This modifies the `secondary`\n+ * vector inplace.\n+ *\n+ * Corresponds to MProtein::CalculateAlphaHelices(const vector<MResidue*>& inResidues, bool inPreferPiHelices)\n+ * dssp-2.2.0/structure.cpp:1693. Note that `inPreferHelices` is set to true, in this code.\n+ */\n+static void calculate_alpha_helicies(const float* xyz,","path":"MDTraj/geometry/src/dssp.cpp","position":241,"original_position":241,"commit_id":"e59bb840af41fbe1db67396ebe8a5a89f9fd17c8","original_commit_id":"e59bb840af41fbe1db67396ebe8a5a89f9fd17c8","user":{"login":"kyleabeauchamp","id":1900459,"avatar_url":"https://avatars.githubusercontent.com/u/1900459?v=2","gravatar_id":"f66641fcd957422142ff3585ff773d71","url":"https://api.github.com/users/kyleabeauchamp","html_url":"https://github.com/kyleabeauchamp","followers_url":"https://api.github.com/users/kyleabeauchamp/followers","following_url":"https://api.github.com/users/kyleabeauchamp/following{/other_user}","gists_url":"https://api.github.com/users/kyleabeauchamp/gists{/gist_id}","starred_url":"https://api.github.com/users/kyleabeauchamp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kyleabeauchamp/subscriptions","organizations_url":"https://api.github.com/users/kyleabeauchamp/orgs","repos_url":"https://api.github.com/users/kyleabeauchamp/repos","events_url":"https://api.github.com/users/kyleabeauchamp/events{/privacy}","received_events_url":"https://api.github.com/users/kyleabeauchamp/received_events","type":"User","site_admin":false},"body":"maybe change name from `helicies` to `helices`?","created_at":"2014-08-26T21:03:53Z","updated_at":"2014-08-26T21:03:53Z","html_url":"https://github.com/rmcgibbo/mdtraj/pull/540#discussion_r16742413","pull_request_url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540","_links":{"self":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/comments/16742413"},"html":{"href":"https://github.com/rmcgibbo/mdtraj/pull/540#discussion_r16742413"},"pull_request":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540"}}},"pull_request":{"url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540","id":20229238,"html_url":"https://github.com/rmcgibbo/mdtraj/pull/540","diff_url":"https://github.com/rmcgibbo/mdtraj/pull/540.diff","patch_url":"https://github.com/rmcgibbo/mdtraj/pull/540.patch","issue_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/540","number":540,"state":"open","locked":false,"title":"[WIP] DSSP secondary structure assignments","user":{"login":"rmcgibbo","id":641278,"avatar_url":"https://avatars.githubusercontent.com/u/641278?v=2","gravatar_id":"9cf3859e4f8d4e422f242a842a6e301c","url":"https://api.github.com/users/rmcgibbo","html_url":"https://github.com/rmcgibbo","followers_url":"https://api.github.com/users/rmcgibbo/followers","following_url":"https://api.github.com/users/rmcgibbo/following{/other_user}","gists_url":"https://api.github.com/users/rmcgibbo/gists{/gist_id}","starred_url":"https://api.github.com/users/rmcgibbo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmcgibbo/subscriptions","organizations_url":"https://api.github.com/users/rmcgibbo/orgs","repos_url":"https://api.github.com/users/rmcgibbo/repos","events_url":"https://api.github.com/users/rmcgibbo/events{/privacy}","received_events_url":"https://api.github.com/users/rmcgibbo/received_events","type":"User","site_admin":false},"body":"cc #447 and #399\r\n\r\n(1) change kabsch_sander to not overload the semantics of the ca_indices array with -1s in the place of prolines.\r\n(2) don't use _mm_rsqrt_ps. it wasn't accurate enough to pass the tests for DRID, so it's probably not a good choice here.\r\n(3) small fix in proline handing in kabsch_sander.\r\n\r\ntodo:\r\n- [x] deal with residues which don't contain the required atoms (ca/n/c/o). this includes solvent, and chain termi\r\n- [x] lots more tests. particularly multi-chain and weird residues (i.e. above)\r\n- [x] add comments\r\n- [x] add license info, and references to Maarten's work\r\n- [x] figue out msvc compilation issues","created_at":"2014-08-25T04:48:03Z","updated_at":"2014-08-26T21:03:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c01fef5a5263fac7a98f9438b5c7b0be59c90037","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540/commits","review_comments_url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540/comments","review_comment_url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/comments/{number}","comments_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/540/comments","statuses_url":"https://api.github.com/repos/rmcgibbo/mdtraj/statuses/e59bb840af41fbe1db67396ebe8a5a89f9fd17c8","head":{"label":"rmcgibbo:dssp","ref":"dssp","sha":"e59bb840af41fbe1db67396ebe8a5a89f9fd17c8","user":{"login":"rmcgibbo","id":641278,"avatar_url":"https://avatars.githubusercontent.com/u/641278?v=2","gravatar_id":"9cf3859e4f8d4e422f242a842a6e301c","url":"https://api.github.com/users/rmcgibbo","html_url":"https://github.com/rmcgibbo","followers_url":"https://api.github.com/users/rmcgibbo/followers","following_url":"https://api.github.com/users/rmcgibbo/following{/other_user}","gists_url":"https://api.github.com/users/rmcgibbo/gists{/gist_id}","starred_url":"https://api.github.com/users/rmcgibbo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmcgibbo/subscriptions","organizations_url":"https://api.github.com/users/rmcgibbo/orgs","repos_url":"https://api.github.com/users/rmcgibbo/repos","events_url":"https://api.github.com/users/rmcgibbo/events{/privacy}","received_events_url":"https://api.github.com/users/rmcgibbo/received_events","type":"User","site_admin":false},"repo":{"id":6604361,"name":"mdtraj","full_name":"rmcgibbo/mdtraj","owner":{"login":"rmcgibbo","id":641278,"avatar_url":"https://avatars.githubusercontent.com/u/641278?v=2","gravatar_id":"9cf3859e4f8d4e422f242a842a6e301c","url":"https://api.github.com/users/rmcgibbo","html_url":"https://github.com/rmcgibbo","followers_url":"https://api.github.com/users/rmcgibbo/followers","following_url":"https://api.github.com/users/rmcgibbo/following{/other_user}","gists_url":"https://api.github.com/users/rmcgibbo/gists{/gist_id}","starred_url":"https://api.github.com/users/rmcgibbo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmcgibbo/subscriptions","organizations_url":"https://api.github.com/users/rmcgibbo/orgs","repos_url":"https://api.github.com/users/rmcgibbo/repos","events_url":"https://api.github.com/users/rmcgibbo/events{/privacy}","received_events_url":"https://api.github.com/users/rmcgibbo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rmcgibbo/mdtraj","description":"Read, write, and analyze MD trajectories with only a few lines of Python code.","fork":false,"url":"https://api.github.com/repos/rmcgibbo/mdtraj","forks_url":"https://api.github.com/repos/rmcgibbo/mdtraj/forks","keys_url":"https://api.github.com/repos/rmcgibbo/mdtraj/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rmcgibbo/mdtraj/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rmcgibbo/mdtraj/teams","hooks_url":"https://api.github.com/repos/rmcgibbo/mdtraj/hooks","issue_events_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/events{/number}","events_url":"https://api.github.com/repos/rmcgibbo/mdtraj/events","assignees_url":"https://api.github.com/repos/rmcgibbo/mdtraj/assignees{/user}","branches_url":"https://api.github.com/repos/rmcgibbo/mdtraj/branches{/branch}","tags_url":"https://api.github.com/repos/rmcgibbo/mdtraj/tags","blobs_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/refs{/sha}","trees_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rmcgibbo/mdtraj/statuses/{sha}","languages_url":"https://api.github.com/repos/rmcgibbo/mdtraj/languages","stargazers_url":"https://api.github.com/repos/rmcgibbo/mdtraj/stargazers","contributors_url":"https://api.github.com/repos/rmcgibbo/mdtraj/contributors","subscribers_url":"https://api.github.com/repos/rmcgibbo/mdtraj/subscribers","subscription_url":"https://api.github.com/repos/rmcgibbo/mdtraj/subscription","commits_url":"https://api.github.com/repos/rmcgibbo/mdtraj/commits{/sha}","git_commits_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/commits{/sha}","comments_url":"https://api.github.com/repos/rmcgibbo/mdtraj/comments{/number}","issue_comment_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/comments/{number}","contents_url":"https://api.github.com/repos/rmcgibbo/mdtraj/contents/{+path}","compare_url":"https://api.github.com/repos/rmcgibbo/mdtraj/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rmcgibbo/mdtraj/merges","archive_url":"https://api.github.com/repos/rmcgibbo/mdtraj/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rmcgibbo/mdtraj/downloads","issues_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues{/number}","pulls_url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls{/number}","milestones_url":"https://api.github.com/repos/rmcgibbo/mdtraj/milestones{/number}","notifications_url":"https://api.github.com/repos/rmcgibbo/mdtraj/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rmcgibbo/mdtraj/labels{/name}","releases_url":"https://api.github.com/repos/rmcgibbo/mdtraj/releases{/id}","created_at":"2012-11-08T22:01:24Z","updated_at":"2014-08-26T20:19:04Z","pushed_at":"2014-08-26T20:24:01Z","git_url":"git://github.com/rmcgibbo/mdtraj.git","ssh_url":"git@github.com:rmcgibbo/mdtraj.git","clone_url":"https://github.com/rmcgibbo/mdtraj.git","svn_url":"https://github.com/rmcgibbo/mdtraj","homepage":"www.mdtraj.org","size":31325,"stargazers_count":22,"watchers_count":22,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":15,"mirror_url":null,"open_issues_count":44,"forks":15,"open_issues":44,"watchers":22,"default_branch":"master"}},"base":{"label":"rmcgibbo:master","ref":"master","sha":"3100baf5676ab16b25b07c035d342e0da29cb779","user":{"login":"rmcgibbo","id":641278,"avatar_url":"https://avatars.githubusercontent.com/u/641278?v=2","gravatar_id":"9cf3859e4f8d4e422f242a842a6e301c","url":"https://api.github.com/users/rmcgibbo","html_url":"https://github.com/rmcgibbo","followers_url":"https://api.github.com/users/rmcgibbo/followers","following_url":"https://api.github.com/users/rmcgibbo/following{/other_user}","gists_url":"https://api.github.com/users/rmcgibbo/gists{/gist_id}","starred_url":"https://api.github.com/users/rmcgibbo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmcgibbo/subscriptions","organizations_url":"https://api.github.com/users/rmcgibbo/orgs","repos_url":"https://api.github.com/users/rmcgibbo/repos","events_url":"https://api.github.com/users/rmcgibbo/events{/privacy}","received_events_url":"https://api.github.com/users/rmcgibbo/received_events","type":"User","site_admin":false},"repo":{"id":6604361,"name":"mdtraj","full_name":"rmcgibbo/mdtraj","owner":{"login":"rmcgibbo","id":641278,"avatar_url":"https://avatars.githubusercontent.com/u/641278?v=2","gravatar_id":"9cf3859e4f8d4e422f242a842a6e301c","url":"https://api.github.com/users/rmcgibbo","html_url":"https://github.com/rmcgibbo","followers_url":"https://api.github.com/users/rmcgibbo/followers","following_url":"https://api.github.com/users/rmcgibbo/following{/other_user}","gists_url":"https://api.github.com/users/rmcgibbo/gists{/gist_id}","starred_url":"https://api.github.com/users/rmcgibbo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rmcgibbo/subscriptions","organizations_url":"https://api.github.com/users/rmcgibbo/orgs","repos_url":"https://api.github.com/users/rmcgibbo/repos","events_url":"https://api.github.com/users/rmcgibbo/events{/privacy}","received_events_url":"https://api.github.com/users/rmcgibbo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rmcgibbo/mdtraj","description":"Read, write, and analyze MD trajectories with only a few lines of Python code.","fork":false,"url":"https://api.github.com/repos/rmcgibbo/mdtraj","forks_url":"https://api.github.com/repos/rmcgibbo/mdtraj/forks","keys_url":"https://api.github.com/repos/rmcgibbo/mdtraj/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rmcgibbo/mdtraj/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rmcgibbo/mdtraj/teams","hooks_url":"https://api.github.com/repos/rmcgibbo/mdtraj/hooks","issue_events_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/events{/number}","events_url":"https://api.github.com/repos/rmcgibbo/mdtraj/events","assignees_url":"https://api.github.com/repos/rmcgibbo/mdtraj/assignees{/user}","branches_url":"https://api.github.com/repos/rmcgibbo/mdtraj/branches{/branch}","tags_url":"https://api.github.com/repos/rmcgibbo/mdtraj/tags","blobs_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/refs{/sha}","trees_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rmcgibbo/mdtraj/statuses/{sha}","languages_url":"https://api.github.com/repos/rmcgibbo/mdtraj/languages","stargazers_url":"https://api.github.com/repos/rmcgibbo/mdtraj/stargazers","contributors_url":"https://api.github.com/repos/rmcgibbo/mdtraj/contributors","subscribers_url":"https://api.github.com/repos/rmcgibbo/mdtraj/subscribers","subscription_url":"https://api.github.com/repos/rmcgibbo/mdtraj/subscription","commits_url":"https://api.github.com/repos/rmcgibbo/mdtraj/commits{/sha}","git_commits_url":"https://api.github.com/repos/rmcgibbo/mdtraj/git/commits{/sha}","comments_url":"https://api.github.com/repos/rmcgibbo/mdtraj/comments{/number}","issue_comment_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/comments/{number}","contents_url":"https://api.github.com/repos/rmcgibbo/mdtraj/contents/{+path}","compare_url":"https://api.github.com/repos/rmcgibbo/mdtraj/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rmcgibbo/mdtraj/merges","archive_url":"https://api.github.com/repos/rmcgibbo/mdtraj/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rmcgibbo/mdtraj/downloads","issues_url":"https://api.github.com/repos/rmcgibbo/mdtraj/issues{/number}","pulls_url":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls{/number}","milestones_url":"https://api.github.com/repos/rmcgibbo/mdtraj/milestones{/number}","notifications_url":"https://api.github.com/repos/rmcgibbo/mdtraj/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rmcgibbo/mdtraj/labels{/name}","releases_url":"https://api.github.com/repos/rmcgibbo/mdtraj/releases{/id}","created_at":"2012-11-08T22:01:24Z","updated_at":"2014-08-26T20:19:04Z","pushed_at":"2014-08-26T20:24:01Z","git_url":"git://github.com/rmcgibbo/mdtraj.git","ssh_url":"git@github.com:rmcgibbo/mdtraj.git","clone_url":"https://github.com/rmcgibbo/mdtraj.git","svn_url":"https://github.com/rmcgibbo/mdtraj","homepage":"www.mdtraj.org","size":31325,"stargazers_count":22,"watchers_count":22,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":15,"mirror_url":null,"open_issues_count":44,"forks":15,"open_issues":44,"watchers":22,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540"},"html":{"href":"https://github.com/rmcgibbo/mdtraj/pull/540"},"issue":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/540"},"comments":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/issues/540/comments"},"review_comments":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540/comments"},"review_comment":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/pulls/540/commits"},"statuses":{"href":"https://api.github.com/repos/rmcgibbo/mdtraj/statuses/e59bb840af41fbe1db67396ebe8a5a89f9fd17c8"}}}}