{"action":"created","comment":{"url":"https://api.github.com/repos/nextic/IC/pulls/comments/172938752","pull_request_review_id":102040710,"id":172938752,"diff_hunk":"@@ -0,0 +1,316 @@\n+\n+import tables\n+import numpy as np\n+\n+from .. reco            import tbl_functions as tbl\n+from .. core            import system_of_units as units\n+from .. core.exceptions import SensorBinningNotFound\n+\n+from .. evm.event_model import MCParticle\n+from .. evm.event_model import MCHit\n+from .. evm.event_model import Waveform\n+\n+from .. evm.nh5 import MCExtentInfo\n+from .. evm.nh5 import MCHitInfo\n+from .. evm.nh5 import MCParticleInfo\n+\n+from typing import Mapping\n+\n+# use Mapping (duck type) rather than dict\n+\n+\n+class mc_info_writer:\n+    \"\"\"Write MC info to file.\"\"\"\n+    def __init__(self, h5file, compression = 'ZLIB4'):\n+\n+        self.h5file      = h5file\n+        self.compression = compression\n+        self._create_tables()\n+        # last visited row\n+        self.last_row              = 0\n+        self.last_written_hit      = 0\n+        self.last_written_particle = 0\n+        self.first_extent_row      = True\n+\n+    def _create_tables(self):\n+        \"\"\"Create tables in MC group in file h5file.\"\"\"\n+        if '/MC' in self.h5file:\n+            MC = self.h5file.root.MC\n+        else:\n+            MC = self.h5file.create_group(self.h5file.root, \"MC\")\n+\n+        self.extent_table = self.h5file.create_table(MC, \"extents\",\n+                                                     description = MCExtentInfo,\n+                                                     title       = \"extents\",\n+                                                     filters     = tbl.filters(self.compression))\n+\n+        # Mark column to index after populating table\n+        self.extent_table.set_attr('columns_to_index', ['evt_number'])\n+\n+        self.hit_table = self.h5file.create_table(MC, \"hits\",\n+                                                  description = MCHitInfo,\n+                                                  title       = \"hits\",\n+                                                  filters     = tbl.filters(self.compression))\n+\n+        self.particle_table = self.h5file.create_table(MC, \"particles\",\n+                                                       description = MCParticleInfo,\n+                                                       title       = \"particles\",\n+                                                       filters     = tbl.filters(self.compression))\n+\n+    def __call__(self, mctables: (tables.Table, tables.Table, tables.Table),\n+                 evt_number: int):\n+\n+        extents = mctables[0]\n+        for iext in range(self.last_row, len(extents)):\n+            this_row = extents[iext]\n+            if this_row['evt_number'] < evt_number: continue\n+            if this_row['evt_number'] > evt_number: break\n+            if iext == 0:\n+                modified_hit          = this_row['last_hit']\n+                modified_particle     = this_row['last_particle']\n+                self.first_extent_row = False\n+            elif self.first_extent_row:\n+                previous_row          = extents[iext-1]\n+                modified_hit          = this_row['last_hit'] - previous_row['last_hit'] + self.last_written_hit - 1\n+                modified_particle     = this_row['last_particle'] - previous_row['last_particle'] + self.last_written_particle - 1\n+                self.first_extent_row = False\n+            else:\n+                previous_row      = extents[iext-1]\n+                modified_hit      = this_row['last_hit'] - previous_row['last_hit'] + self.last_written_hit\n+                modified_particle = this_row['last_particle'] - previous_row['last_particle'] + self.last_written_particle\n+\n+            modified_row                  = self.extent_table.row\n+            modified_row['evt_number']    = evt_number\n+            modified_row['last_hit']      = modified_hit\n+            modified_row['last_particle'] = modified_particle\n+            modified_row.append()\n+\n+            self.last_written_hit      = modified_hit\n+            self.last_written_particle = modified_particle\n+        self.extent_table.flush()\n+\n+        hits, particles = read_mcinfo_evt(mctables, evt_number, self.last_row)\n+        self.last_row += 1\n+\n+        for h in hits:\n+            new_row = self.hit_table.row\n+            new_row['hit_position']  = h[0]\n+            new_row['hit_time']      = h[1]\n+            new_row['hit_energy']    = h[2]\n+            new_row['label']         = h[3]\n+            new_row['particle_indx'] = h[4]\n+            new_row['hit_indx']      = h[5]\n+            new_row.append()\n+        self.hit_table.flush()\n+\n+        for p in particles:\n+            new_row = self.particle_table.row\n+            new_row['particle_indx']  = p[0]\n+            new_row['particle_name']  = p[1]\n+            new_row['primary']        = p[2]\n+            new_row['mother_indx']    = p[3]\n+            new_row['initial_vertex'] = p[4]\n+            new_row['final_vertex']   = p[5]\n+            new_row['initial_volume'] = p[6]\n+            new_row['final_volume']   = p[7]\n+            new_row['momentum']       = p[8]\n+            new_row['kin_energy']     = p[9]\n+            new_row['creator_proc']   = p[10]\n+            new_row.append()\n+        self.particle_table.flush()\n+\n+\n+def load_mchits(file_name: str,\n+                event_range=(0, int(1e9))) -> Mapping[int, MCHit]:\n+\n+    with tables.open_file(file_name, mode='r') as h5in:\n+        mcevents    = read_mcinfo(h5in, event_range)\n+        mchits_dict = compute_mchits_dict(mcevents)\n+\n+    return mchits_dict\n+\n+\n+def load_mcparticles(file_name: str,\n+                     event_range=(0, int(1e9))) -> Mapping[int, MCParticle]:\n+\n+    with tables.open_file(file_name, mode='r') as h5in:\n+        return read_mcinfo(h5in, event_range)\n+\n+\n+def load_mcsensor_response(file_name: str,\n+                           event_range=(0, int(1e9))) -> Mapping[int, MCParticle]:\n+\n+    with tables.open_file(file_name, mode='r') as h5in:\n+        return read_mcsns_response(h5in, event_range)\n+\n+\n+def read_mcinfo_evt (mctables: (tables.Table, tables.Table, tables.Table),\n+                            event_number: int, last_row=0) -> ([tables.Table], [tables.Table]):\n+    h5extents   = mctables[0]\n+    h5hits      = mctables[1]\n+    h5particles = mctables[2]\n+\n+    particle_rows = []\n+    hit_rows      = []\n+\n+    event_range = (last_row, int(1e9))\n+    for iext in range(*event_range):\n+        this_row = h5extents[iext]\n+        if this_row['evt_number'] == event_number:\n+            # the indices of the first hit and particle are 0 unless the first event\n+            #  written is to be skipped: in this case they must be read from the extents\n+            ihit = ipart = 0\n+            if iext > 0:\n+                previous_row = h5extents[iext-1]\n+                ihit         = previous_row['last_hit'] + 1\n+                ipart        = previous_row['last_particle'] + 1\n+\n+            ihit_end  = this_row['last_hit']\n+            ipart_end = this_row['last_particle']\n+\n+            while ihit <= ihit_end:\n+                hit_rows.append(h5hits[ihit])\n+                ihit += 1\n+\n+            while ipart <= ipart_end:\n+                particle_rows.append(h5particles[ipart])\n+                ipart += 1\n+\n+            break\n+\n+    return hit_rows, particle_rows\n+\n+\n+def read_mcinfo(h5f, event_range=(0, int(1e9))) ->Mapping[int, Mapping[int, MCParticle]]:\n+    h5extents   = h5f.root.MC.extents\n+    h5hits      = h5f.root.MC.hits\n+    h5particles = h5f.root.MC.particles\n+\n+    mc_info        = (h5extents, h5hits, h5particles)\n+    events_in_file = len(h5extents)\n+\n+    all_events = {}\n+\n+    for iext in range(*event_range):\n+        if iext >= events_in_file:\n+            break\n+\n+        current_event           = {}\n+        evt_number              = h5extents[iext]['evt_number']\n+        hit_rows, particle_rows = read_mcinfo_evt(mc_info, evt_number, iext)\n+\n+        for h5particle in particle_rows:\n+            this_particle = h5particle['particle_indx']\n+            current_event[this_particle] = MCParticle(h5particle['particle_name'].decode('utf-8','ignore'),\n+                                                      h5particle['primary'],\n+                                                      h5particle['mother_indx'],\n+                                                      h5particle['initial_vertex'],\n+                                                      h5particle['final_vertex'],\n+                                                      h5particle['initial_volume'].decode('utf-8','ignore'),\n+                                                      h5particle['final_volume'].decode('utf-8','ignore'),\n+                                                      h5particle['momentum'],\n+                                                      h5particle['kin_energy'],\n+                                                      h5particle['creator_proc'].decode('utf-8','ignore'))\n+\n+        for h5hit in hit_rows:\n+            ipart            = h5hit['particle_indx']\n+            current_particle = current_event[ipart]\n+\n+            hit = MCHit(h5hit['hit_position'],\n+                        h5hit['hit_time'],\n+                        h5hit['hit_energy'],\n+                        h5hit['label'].decode('utf-8','ignore'))\n+\n+            current_particle.hits.append(hit)\n+\n+        evt_number             = h5extents[iext]['evt_number']\n+        all_events[evt_number] = current_event\n+\n+    return all_events\n+\n+\n+def compute_mchits_dict(mcevents:Mapping[int, Mapping[int, MCParticle]])->Mapping[int, MCHit]:\n+    \"\"\"Returns all hits in the event\"\"\"\n+    mchits_dict = {}\n+    for event_no, particle_dict in mcevents.items():\n+        hits = []\n+        for particle_no in particle_dict.keys():\n+            particle = particle_dict[particle_no]\n+            hits.extend(particle.hits)\n+        mchits_dict[event_no] = hits\n+    return mchits_dict\n+\n+\n+def read_mcsns_response(h5f, event_range=(0, 1e9)) ->Mapping[int, Mapping[int, Waveform]]:\n+\n+    h5config = h5f.root.MC.configuration\n+\n+    bin_width_PMT  = None\n+    bin_width_SiPM = None\n+    for row in h5config:\n+        param_name = row['param_key'].decode('utf-8','ignore')\n+        if param_name.find('time_binning') >= 0:\n+            param_value = row['param_value'].decode('utf-8','ignore')\n+            numb, unit = param_value.split()\n+            if param_name.find('Pmt') > 0:\n+                bin_width_PMT = float(numb)\n+            elif param_name.find('SiPM') >= 0:\n+                bin_width_SiPM = float(numb)\n+\n+\n+    if not  bin_width_PMT:\n+        raise SensorBinningNotFound\n+    if not  bin_width_PMT:","path":"invisible_cities/io/mcinfo_io.py","position":263,"original_position":263,"commit_id":"12dc4e46f1454ea8c2dd29b2a4b70532ef62e23d","original_commit_id":"12dc4e46f1454ea8c2dd29b2a4b70532ef62e23d","user":{"login":"gonzaponte","id":8233521,"avatar_url":"https://avatars1.githubusercontent.com/u/8233521?v=4","gravatar_id":"","url":"https://api.github.com/users/gonzaponte","html_url":"https://github.com/gonzaponte","followers_url":"https://api.github.com/users/gonzaponte/followers","following_url":"https://api.github.com/users/gonzaponte/following{/other_user}","gists_url":"https://api.github.com/users/gonzaponte/gists{/gist_id}","starred_url":"https://api.github.com/users/gonzaponte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gonzaponte/subscriptions","organizations_url":"https://api.github.com/users/gonzaponte/orgs","repos_url":"https://api.github.com/users/gonzaponte/repos","events_url":"https://api.github.com/users/gonzaponte/events{/privacy}","received_events_url":"https://api.github.com/users/gonzaponte/received_events","type":"User","site_admin":false},"body":"I guess you meant `bin_width_SiPM`","created_at":"2018-03-07T18:26:44Z","updated_at":"2018-03-07T18:34:36Z","html_url":"https://github.com/nextic/IC/pull/449#discussion_r172938752","pull_request_url":"https://api.github.com/repos/nextic/IC/pulls/449","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/nextic/IC/pulls/comments/172938752"},"html":{"href":"https://github.com/nextic/IC/pull/449#discussion_r172938752"},"pull_request":{"href":"https://api.github.com/repos/nextic/IC/pulls/449"}}},"pull_request":{"url":"https://api.github.com/repos/nextic/IC/pulls/449","id":171487869,"html_url":"https://github.com/nextic/IC/pull/449","diff_url":"https://github.com/nextic/IC/pull/449.diff","patch_url":"https://github.com/nextic/IC/pull/449.patch","issue_url":"https://api.github.com/repos/nextic/IC/issues/449","number":449,"state":"open","locked":false,"title":"Read and write MC true info","user":{"login":"paolafer","id":8114436,"avatar_url":"https://avatars0.githubusercontent.com/u/8114436?v=4","gravatar_id":"","url":"https://api.github.com/users/paolafer","html_url":"https://github.com/paolafer","followers_url":"https://api.github.com/users/paolafer/followers","following_url":"https://api.github.com/users/paolafer/following{/other_user}","gists_url":"https://api.github.com/users/paolafer/gists{/gist_id}","starred_url":"https://api.github.com/users/paolafer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paolafer/subscriptions","organizations_url":"https://api.github.com/users/paolafer/orgs","repos_url":"https://api.github.com/users/paolafer/repos","events_url":"https://api.github.com/users/paolafer/events{/privacy}","received_events_url":"https://api.github.com/users/paolafer/received_events","type":"User","site_admin":false},"body":"In this PR the writing and reading code of MC true information has been updated to the new hdf5 format generated by nexus.\r\n\r\nThree tables are now stored: one with the particle information, one with the hit information and a third one with the information needed to relate the first two tables to each event. These three tables are read and written again and the writing takes into account the possible filtering of some events.\r\n\r\nSome of the MC test files have been generated again, to have the new hdf5 format, and some of them have been deleted because not in use anymore.\r\n\r\nThe code does what it's meant to (at the best of my and tests' knowledge): I'd be happy to improve it in efficiency and to discuss specific parts of the data model classes that I have modified to add the complete true MC information, if needed. I've also left out the storage of true waveforms for now, since we don't need them usually, but maybe we want to add them in a future PR.\r\n\r\nCaveat: all the already generated MC files cannot be processed anymore with these changes. I couldn't find an easy way to keep the ability of reading and writing both formats.\r\n\r\nA couple of observations regarding tests:\r\n- **test_diomira_fee_table** has been marked as @mark_skip, because it needs to be updated to the latest code regarding FEE simulation. Can @gonzaponte or @jjgomezcadenas have a look at it at some point?\r\n- **test_compare_cwf_blr** was failing when I changed the input file with the new one. I compared the two files and I realized that in the old one the 40 keV electron events were generated very close to the EL region (2.5 cm) instead of at a distance of 25 cm, as I expected from the name of the file. A new file generated with primary vertices at 2.5 cm of distance in z solves the problem (just a slight tuning of the test parameter has been needed). This, however, makes me think that the whole deconvolution process has bigger errors for larger drifts and we should be aware of that.\r\n\r\n","created_at":"2018-02-26T20:50:48Z","updated_at":"2018-03-07T18:34:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"adf729b5e8b94c6e92ffb6f520024ac8cd3710cf","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/nextic/IC/pulls/449/commits","review_comments_url":"https://api.github.com/repos/nextic/IC/pulls/449/comments","review_comment_url":"https://api.github.com/repos/nextic/IC/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nextic/IC/issues/449/comments","statuses_url":"https://api.github.com/repos/nextic/IC/statuses/12dc4e46f1454ea8c2dd29b2a4b70532ef62e23d","head":{"label":"paolafer:read-nexus","ref":"read-nexus","sha":"12dc4e46f1454ea8c2dd29b2a4b70532ef62e23d","user":{"login":"paolafer","id":8114436,"avatar_url":"https://avatars0.githubusercontent.com/u/8114436?v=4","gravatar_id":"","url":"https://api.github.com/users/paolafer","html_url":"https://github.com/paolafer","followers_url":"https://api.github.com/users/paolafer/followers","following_url":"https://api.github.com/users/paolafer/following{/other_user}","gists_url":"https://api.github.com/users/paolafer/gists{/gist_id}","starred_url":"https://api.github.com/users/paolafer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paolafer/subscriptions","organizations_url":"https://api.github.com/users/paolafer/orgs","repos_url":"https://api.github.com/users/paolafer/repos","events_url":"https://api.github.com/users/paolafer/events{/privacy}","received_events_url":"https://api.github.com/users/paolafer/received_events","type":"User","site_admin":false},"repo":{"id":80422069,"name":"IC","full_name":"paolafer/IC","owner":{"login":"paolafer","id":8114436,"avatar_url":"https://avatars0.githubusercontent.com/u/8114436?v=4","gravatar_id":"","url":"https://api.github.com/users/paolafer","html_url":"https://github.com/paolafer","followers_url":"https://api.github.com/users/paolafer/followers","following_url":"https://api.github.com/users/paolafer/following{/other_user}","gists_url":"https://api.github.com/users/paolafer/gists{/gist_id}","starred_url":"https://api.github.com/users/paolafer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paolafer/subscriptions","organizations_url":"https://api.github.com/users/paolafer/orgs","repos_url":"https://api.github.com/users/paolafer/repos","events_url":"https://api.github.com/users/paolafer/events{/privacy}","received_events_url":"https://api.github.com/users/paolafer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/paolafer/IC","description":null,"fork":true,"url":"https://api.github.com/repos/paolafer/IC","forks_url":"https://api.github.com/repos/paolafer/IC/forks","keys_url":"https://api.github.com/repos/paolafer/IC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/paolafer/IC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/paolafer/IC/teams","hooks_url":"https://api.github.com/repos/paolafer/IC/hooks","issue_events_url":"https://api.github.com/repos/paolafer/IC/issues/events{/number}","events_url":"https://api.github.com/repos/paolafer/IC/events","assignees_url":"https://api.github.com/repos/paolafer/IC/assignees{/user}","branches_url":"https://api.github.com/repos/paolafer/IC/branches{/branch}","tags_url":"https://api.github.com/repos/paolafer/IC/tags","blobs_url":"https://api.github.com/repos/paolafer/IC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/paolafer/IC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/paolafer/IC/git/refs{/sha}","trees_url":"https://api.github.com/repos/paolafer/IC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/paolafer/IC/statuses/{sha}","languages_url":"https://api.github.com/repos/paolafer/IC/languages","stargazers_url":"https://api.github.com/repos/paolafer/IC/stargazers","contributors_url":"https://api.github.com/repos/paolafer/IC/contributors","subscribers_url":"https://api.github.com/repos/paolafer/IC/subscribers","subscription_url":"https://api.github.com/repos/paolafer/IC/subscription","commits_url":"https://api.github.com/repos/paolafer/IC/commits{/sha}","git_commits_url":"https://api.github.com/repos/paolafer/IC/git/commits{/sha}","comments_url":"https://api.github.com/repos/paolafer/IC/comments{/number}","issue_comment_url":"https://api.github.com/repos/paolafer/IC/issues/comments{/number}","contents_url":"https://api.github.com/repos/paolafer/IC/contents/{+path}","compare_url":"https://api.github.com/repos/paolafer/IC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/paolafer/IC/merges","archive_url":"https://api.github.com/repos/paolafer/IC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/paolafer/IC/downloads","issues_url":"https://api.github.com/repos/paolafer/IC/issues{/number}","pulls_url":"https://api.github.com/repos/paolafer/IC/pulls{/number}","milestones_url":"https://api.github.com/repos/paolafer/IC/milestones{/number}","notifications_url":"https://api.github.com/repos/paolafer/IC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/paolafer/IC/labels{/name}","releases_url":"https://api.github.com/repos/paolafer/IC/releases{/id}","deployments_url":"https://api.github.com/repos/paolafer/IC/deployments","created_at":"2017-01-30T13:05:26Z","updated_at":"2017-03-02T13:26:14Z","pushed_at":"2018-03-07T18:09:29Z","git_url":"git://github.com/paolafer/IC.git","ssh_url":"git@github.com:paolafer/IC.git","clone_url":"https://github.com/paolafer/IC.git","svn_url":"https://github.com/paolafer/IC","homepage":null,"size":76367,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"nextic:master","ref":"master","sha":"a4612fa548cf59a9154b4902dbbbcecdf3e73bb7","user":{"login":"nextic","id":23397670,"avatar_url":"https://avatars1.githubusercontent.com/u/23397670?v=4","gravatar_id":"","url":"https://api.github.com/users/nextic","html_url":"https://github.com/nextic","followers_url":"https://api.github.com/users/nextic/followers","following_url":"https://api.github.com/users/nextic/following{/other_user}","gists_url":"https://api.github.com/users/nextic/gists{/gist_id}","starred_url":"https://api.github.com/users/nextic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nextic/subscriptions","organizations_url":"https://api.github.com/users/nextic/orgs","repos_url":"https://api.github.com/users/nextic/repos","events_url":"https://api.github.com/users/nextic/events{/privacy}","received_events_url":"https://api.github.com/users/nextic/received_events","type":"Organization","site_admin":false},"repo":{"id":76445486,"name":"IC","full_name":"nextic/IC","owner":{"login":"nextic","id":23397670,"avatar_url":"https://avatars1.githubusercontent.com/u/23397670?v=4","gravatar_id":"","url":"https://api.github.com/users/nextic","html_url":"https://github.com/nextic","followers_url":"https://api.github.com/users/nextic/followers","following_url":"https://api.github.com/users/nextic/following{/other_user}","gists_url":"https://api.github.com/users/nextic/gists{/gist_id}","starred_url":"https://api.github.com/users/nextic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nextic/subscriptions","organizations_url":"https://api.github.com/users/nextic/orgs","repos_url":"https://api.github.com/users/nextic/repos","events_url":"https://api.github.com/users/nextic/events{/privacy}","received_events_url":"https://api.github.com/users/nextic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nextic/IC","description":null,"fork":false,"url":"https://api.github.com/repos/nextic/IC","forks_url":"https://api.github.com/repos/nextic/IC/forks","keys_url":"https://api.github.com/repos/nextic/IC/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nextic/IC/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nextic/IC/teams","hooks_url":"https://api.github.com/repos/nextic/IC/hooks","issue_events_url":"https://api.github.com/repos/nextic/IC/issues/events{/number}","events_url":"https://api.github.com/repos/nextic/IC/events","assignees_url":"https://api.github.com/repos/nextic/IC/assignees{/user}","branches_url":"https://api.github.com/repos/nextic/IC/branches{/branch}","tags_url":"https://api.github.com/repos/nextic/IC/tags","blobs_url":"https://api.github.com/repos/nextic/IC/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nextic/IC/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nextic/IC/git/refs{/sha}","trees_url":"https://api.github.com/repos/nextic/IC/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nextic/IC/statuses/{sha}","languages_url":"https://api.github.com/repos/nextic/IC/languages","stargazers_url":"https://api.github.com/repos/nextic/IC/stargazers","contributors_url":"https://api.github.com/repos/nextic/IC/contributors","subscribers_url":"https://api.github.com/repos/nextic/IC/subscribers","subscription_url":"https://api.github.com/repos/nextic/IC/subscription","commits_url":"https://api.github.com/repos/nextic/IC/commits{/sha}","git_commits_url":"https://api.github.com/repos/nextic/IC/git/commits{/sha}","comments_url":"https://api.github.com/repos/nextic/IC/comments{/number}","issue_comment_url":"https://api.github.com/repos/nextic/IC/issues/comments{/number}","contents_url":"https://api.github.com/repos/nextic/IC/contents/{+path}","compare_url":"https://api.github.com/repos/nextic/IC/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nextic/IC/merges","archive_url":"https://api.github.com/repos/nextic/IC/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nextic/IC/downloads","issues_url":"https://api.github.com/repos/nextic/IC/issues{/number}","pulls_url":"https://api.github.com/repos/nextic/IC/pulls{/number}","milestones_url":"https://api.github.com/repos/nextic/IC/milestones{/number}","notifications_url":"https://api.github.com/repos/nextic/IC/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nextic/IC/labels{/name}","releases_url":"https://api.github.com/repos/nextic/IC/releases{/id}","deployments_url":"https://api.github.com/repos/nextic/IC/deployments","created_at":"2016-12-14T09:37:40Z","updated_at":"2018-02-27T10:38:08Z","pushed_at":"2018-03-07T18:09:34Z","git_url":"git://github.com/nextic/IC.git","ssh_url":"git@github.com:nextic/IC.git","clone_url":"https://github.com/nextic/IC.git","svn_url":"https://github.com/nextic/IC","homepage":null,"size":32870,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":19,"mirror_url":null,"archived":false,"open_issues_count":47,"license":null,"forks":19,"open_issues":47,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nextic/IC/pulls/449"},"html":{"href":"https://github.com/nextic/IC/pull/449"},"issue":{"href":"https://api.github.com/repos/nextic/IC/issues/449"},"comments":{"href":"https://api.github.com/repos/nextic/IC/issues/449/comments"},"review_comments":{"href":"https://api.github.com/repos/nextic/IC/pulls/449/comments"},"review_comment":{"href":"https://api.github.com/repos/nextic/IC/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nextic/IC/pulls/449/commits"},"statuses":{"href":"https://api.github.com/repos/nextic/IC/statuses/12dc4e46f1454ea8c2dd29b2a4b70532ef62e23d"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"gonzaponte"}}