{"action":"created","comment":{"url":"https://api.github.com/repos/linetools/linetools/pulls/comments/33217650","id":33217650,"diff_hunk":"@@ -0,0 +1,370 @@\n+\"\"\"\n+#;+ \n+#; NAME:\n+#; spectralline\n+#;    Version 1.0\n+#;\n+#; PURPOSE:\n+#;    Module for SpectralLine class\n+#;   23-Jun-2015 by JXP\n+#;-\n+#;------------------------------------------------------------------------------\n+\"\"\"\n+from __future__ import print_function, absolute_import, division, unicode_literals\n+\n+import numpy as np\n+from abc import ABCMeta, abstractmethod\n+\n+from astropy import constants as const\n+from astropy import units as u\n+from astropy.units import Quantity\n+\n+from linetools.spectra import io as lsio\n+from linetools.lists.linelist import LineList\n+\n+#import xastropy.atomic as xatom\n+#from xastropy.stats import basic as xsb\n+#from xastropy.xutils import xdebug as xdb\n+\n+# class SpectralLine(object):\n+# class AbsLine(SpectralLine):\n+\n+# Class for Spectral line\n+class SpectralLine(object):\n+    \"\"\"Class for a spectral line.  Emission or absorption \n+\n+    Attributes:\n+        ltype: str\n+          type of line, e.g.  Abs, Emiss\n+        wrest: float\n+          Rest wavelength of the spectral feature\n+    \"\"\"\n+    __metaclass__ = ABCMeta\n+\n+    # Initialize with wavelength\n+    def __init__(self, ltype, wrest, linelist=None):\n+        \"\"\"  Initiator\n+\n+        Parameters\n+        ----------\n+        ltype : string\n+          Type of Spectral line, (Abs\n+        wrest : Quantity\n+          Rest wavelength\n+        linelist : LineList, optional\n+          Class of linelist or str setting LineList\n+        \"\"\"\n+\n+        # Required\n+        self.ltype = ltype\n+        if ltype not in ['Abs']:\n+            raise ValueError('spec/lines: Not ready for type {:s}'.format(ltype))\n+\n+        # Init\n+        if not isinstance(wrest,Quantity):\n+            raise ValueError('Rest wavelength must be a Quantity.')\n+        self.wrest = wrest\n+\n+        # Other\n+        self.data = {} # Atomic/Moleculare Data (e.g. f-value, A coefficient, Elow)\n+        self.analy = {'spec': None, # Analysis inputs (e.g. spectrum; from .clm file or AbsID)\n+            'WVMNX': [0., 0.], # Wavelength interval about the line (observed)\n+            'VLIM': [0., 0.]*u.km/u.s, # Velocity limit of line, relative to self.attrib['z']\n+            'FLG_ANLY': 1 # Analyze\n+            }\n+        self.attrib = {   # Properties (e.g. column, EW, centroid)\n+                       'RA': 0.*u.deg, 'DEC': 0.*u.deg,  #  Coords\n+                       'z': 0., 'zsig': 0.,  #  Redshift\n+                       'v': 0.*u.km/u.s, 'vsig': 0.*u.km/u.s,  #  Velocity relative to z\n+                       'EW': 0.*u.AA, 'EWsig': 0.*u.AA, 'flgEW': 0 # EW\n+                       }\n+\n+        # Fill data\n+        self.fill_data(linelist=linelist)\n+\n+    # Setup spectrum for analysis\n+    def cut_spec(self, normalize=False):\n+        '''Splice spectrum.  Normalize too (as desired)\n+\n+        Parameters:\n+        ----------\n+        normalize: bool, optional\n+          Normalize if true (and continuum exists)\n+\n+        Returns:\n+        ----------\n+        fx, sig, wave -- Arrays (numpy or Quantity) of flux, error, wavelength\n+        '''\n+        # Checks\n+        if np.sum(self.analy['WVMNX']) == 0.:\n+            raise ValueError('spectralline.cut_spec: Need to set WVMNX!') # Could use VMNX\n+        if self.analy['spec'] is None:\n+            raise ValueError('spectralline.cut_spec: Need to set spectrum!')\n+        if self.analy['spec'].wcs.unit == 1.:\n+            raise ValueError('Expecting a unit!')\n+\n+        # Pixels for evaluation\n+        pix = self.analy['spec'].pix_minmax(self.analy['WVMNX'])[0]\n+\n+        # Cut for analysis\n+        fx = self.analy['spec'].flux[pix]\n+        sig = self.analy['spec'].sig[pix]\n+        wave = self.analy['spec'].dispersion[pix]\n+\n+        # Normalize\n+        if normalize:\n+            try:\n+                fx = fx / self.analy['spec'].conti[pix]\n+            except AttributeError:\n+                pass\n+            else:\n+                sig = sig / self.analy['spec'].conti[pix]\n+\n+        # Return\n+        return fx, sig, wave\n+\n+\n+    # EW \n+    def box_ew(self):\n+        \"\"\"  EW calculation\n+        Default is simple boxcar integration\n+        Observer frame, not rest-frame\n+          WVMNX must be set!\n+          spec must be set!\n+\n+        Parameters\n+        ----------\n+\n+        Returns:\n+          EW, sigEW : EW and error in observer frame\n+        \"\"\"\n+        # Cut spectrum\n+        fx, sig, wv = self.cut_spec(normalize=True)\n+\n+        # dwv\n+        dwv = wv - np.roll(wv,1)\n+        dwv[0] = dwv[1]\n+\n+\n+        # Simple boxcar\n+        EW = np.sum( dwv * (1. - fx) ) \n+        varEW = np.sum( dwv**2 * sig**2 )\n+        sigEW = np.sqrt(varEW) \n+\n+\n+        # Fill\n+        self.attrib['EW'] = EW \n+        self.attrib['sigEW'] = sigEW \n+\n+        # Return\n+        return EW, sigEW\n+            \n+    # EW \n+    def restew(self):\n+        \"\"\"  Rest EW calculation\n+        Return rest-frame.  See \"box_ew\" above for details\n+        \"\"\"\n+        # Standard call\n+        EW,sigEW = self.box_ew()\n+        # Push to rest-frame\n+        self.attrib['EW'] = EW / (self.attrib['z']+1)\n+        self.attrib['sigEW'] = sigEW / (self.attrib['z']+1)\n+\n+        # Return\n+        return self.attrib['EW'], self.attrib['sigEW'] \n+\n+    # Output\n+    def __repr__(self):\n+        txt = '[{:s}:'.format(self.__class__.__name__)\n+        try:\n+            txt = txt+' {:s},'.format(self.data['name'])\n+        except KeyError:\n+            pass\n+        txt = txt + ' wrest={:g}'.format(self.wrest)\n+        txt = txt + ']'\n+        return (txt)\n+\n+# Class for Generic Absorption Line System\n+class AbsLine(SpectralLine):\n+    \"\"\"Spectral absorption line\n+    \"\"\"\n+    # Initialize with a .dat file\n+    def __init__(self, wrest, linelist=None): \n+        # Generate with type\n+        SpectralLine.__init__(self,'Abs', wrest, linelist=linelist)\n+\n+    def print_specline_type(self):\n+        \"\"\"\"Return a string representing the type of vehicle this is.\"\"\"\n+        return 'AbsLine'\n+\n+    def fill_data(self,linelist=None):\n+        ''' Fill atomic data and setup analy\n+        Parameters:\n+        -----------\n+        linelist : LineList, optional\n+          Class of linelist or str setting LineList\n+        '''\n+\n+        # Deal with LineList\n+        if linelist is None:\n+            self.llist = LineList('ISM')\n+        elif isinstance(linelist,basestring):\n+            self.llist = LineList(linelist)\n+        elif isinstance(linelist,LineList):\n+            self.llist = linelist\n+        else:\n+            raise ValueError('Bad input for linelist')\n+\n+        # Data\n+        self.data.update(self.llist[self.wrest])\n+\n+        #\n+        self.analy.update( {\n+            'FLG_EYE': 0,\n+            'FLG_LIMIT': 0, # No limit\n+            'DATFIL': '', \n+            'IONNM': self.data['name']\n+            })\n+\n+        # Additional attributes for Absorption Line\n+        self.attrib.update({'N': 0., 'Nsig': 0., 'flgN': 0, # Column\n+                       'b': 0., 'bsig': 0.  # Doppler\n+                       } )\n+\n+    # Perform AODM on the line\n+    def aodm(self, **kwargs): \n+        \"\"\"  AODM calculation\n+\n+        Parameters\n+        ----------\n+        spec : Spectrum1D (None)\n+          1D spectrum.  Required but often read in through the Class (self.spec)\n+        conti : np.array (None)\n+          Continuum array \n+\n+        Returns:\n+          N, sigN : Column and error in linear space\n+        \"\"\"\n+\n+        # Grab Spectrum\n+        spec = self.set_spec(**kwargs)\n+\n+        # Velocity array\n+        spec.velo = spec.relative_vel(self.wrest*(1+self.analy['z']))\n+\n+        # Pixels for evaluation\n+        pix = spec.pix_minmax(self.analy['z'], self.wrest,\n+                        self.analy['VLIM'].to('km/s'))[0]\n+                        #self.analy['VLIM'].to('km/s').value)[0]\n+\n+        # For convenience + normalize\n+        velo = spec.velo[pix]\n+        fx, sig = parse_spec(spec, **kwargs)\n+\n+        # dv\n+        delv = velo - np.roll(velo,1)\n+        delv[0] = delv[1]\n+\n+        # Atomic data\n+        cst = (10.**14.5761)/(self.data['fval']*self.wrest) / (u.km/u.s) / u.cm * (u.AA/u.cm)\n+\n+        # Mask\n+        mask = (pix == pix) # True = good\n+        nndt = Quantity(np.zeros(len(pix)), unit='s/(km cm cm)')\n+\n+        # Saturated?\n+        satp = np.where( (fx <= sig/5.) | (fx < 0.05) )[0]\n+        if len(satp) > 0:\n+            mask[satp] = False\n+            lim = np.where(sig[satp] > 0.)[0]\n+            if len(lim) > 0:\n+                sub = np.maximum(0.05, sig[satp[lim]]/5.)\n+                nndt[satp[lim]] = np.log(1./sub)*cst\n+                flg_sat = len(lim)\n+        # AODM\n+        nndt[mask] = np.log(1./fx[mask])*cst\n+\n+        # Sum it\n+        ntot = np.sum( nndt*delv )\n+        tvar = np.sum( (delv*cst*sig/fx)**2 )\n+\n+        # Fill\n+        self.attrib['N'] = ntot\n+        self.attrib['sigN'] = np.sqrt(tvar)\n+        logN, sig_logN = xsb.lin_to_log(self.attrib['N'].value, self.attrib['sigN'].value)\n+        self.attrib['logN'] = logN\n+        self.attrib['sig_logN'] = sig_logN\n+\n+        # Return\n+        return ntot, np.sqrt(tvar)\n+\n+\n+\n+\n+    # Output\n+    def __repr__(self):\n+        txt = '[{:s}:'.format(self.__class__.__name__)\n+        # Name\n+        try:\n+            txt = txt+' {:s},'.format(self.data['name'])\n+        except KeyError:\n+            pass\n+        # wrest\n+        txt = txt + ' wrest={:.4f}'.format(self.wrest)\n+        # fval\n+        try:\n+            txt = txt+', f={:g}'.format(self.data['fval'])\n+        except KeyError:\n+            pass\n+        txt = txt + ']'\n+        return (txt)\n+\n+\n+## #################################    \n+## #################################    \n+## TESTING\n+## #################################    \n+if __name__ == '__main__':\n+","path":"linetools/spectralline.py","position":328,"original_position":328,"commit_id":"c61311158bff6959965161c7e0d54280eb6baca4","original_commit_id":"c61311158bff6959965161c7e0d54280eb6baca4","user":{"login":"nhmc","id":174640,"avatar_url":"https://avatars.githubusercontent.com/u/174640?v=3","gravatar_id":"","url":"https://api.github.com/users/nhmc","html_url":"https://github.com/nhmc","followers_url":"https://api.github.com/users/nhmc/followers","following_url":"https://api.github.com/users/nhmc/following{/other_user}","gists_url":"https://api.github.com/users/nhmc/gists{/gist_id}","starred_url":"https://api.github.com/users/nhmc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nhmc/subscriptions","organizations_url":"https://api.github.com/users/nhmc/orgs","repos_url":"https://api.github.com/users/nhmc/repos","events_url":"https://api.github.com/users/nhmc/events{/privacy}","received_events_url":"https://api.github.com/users/nhmc/received_events","type":"User","site_admin":false},"body":"Need to move these tests to the tests/ directory, otherwise py.test won't run them.","created_at":"2015-06-25T02:40:45Z","updated_at":"2015-06-25T02:40:45Z","html_url":"https://github.com/linetools/linetools/pull/4#discussion_r33217650","pull_request_url":"https://api.github.com/repos/linetools/linetools/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/linetools/linetools/pulls/comments/33217650"},"html":{"href":"https://github.com/linetools/linetools/pull/4#discussion_r33217650"},"pull_request":{"href":"https://api.github.com/repos/linetools/linetools/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/linetools/linetools/pulls/4","id":38393133,"html_url":"https://github.com/linetools/linetools/pull/4","diff_url":"https://github.com/linetools/linetools/pull/4.diff","patch_url":"https://github.com/linetools/linetools/pull/4.patch","issue_url":"https://api.github.com/repos/linetools/linetools/issues/4","number":4,"state":"open","locked":false,"title":"SpectralLine Class","user":{"login":"profxj","id":3998093,"avatar_url":"https://avatars.githubusercontent.com/u/3998093?v=3","gravatar_id":"","url":"https://api.github.com/users/profxj","html_url":"https://github.com/profxj","followers_url":"https://api.github.com/users/profxj/followers","following_url":"https://api.github.com/users/profxj/following{/other_user}","gists_url":"https://api.github.com/users/profxj/gists{/gist_id}","starred_url":"https://api.github.com/users/profxj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/profxj/subscriptions","organizations_url":"https://api.github.com/users/profxj/orgs","repos_url":"https://api.github.com/users/profxj/repos","events_url":"https://api.github.com/users/profxj/events{/privacy}","received_events_url":"https://api.github.com/users/profxj/received_events","type":"User","site_admin":false},"body":"Here is a 3rd prong..\r\n\r\nI appreciate I am adding too much code a bit too fast.  Am somewhat\r\nmotivated to have enough in place to proceed with my research.  \r\n\r\nAnyways, inspect and suggestion changes.   This is a *major*\r\naspect of the package so we need to come to agreement on how\r\nbest to setup this Class. \r\n\r\nAs is, I have 3 aspects to it:\r\n\r\n1.  data -- rest wavelength, oscilator strength, species, etc.\r\n2.  analy -- info to perform analysis on the line, e.g. spectrum, wavelength integration range\r\n3.  attrib -- attributes of the line, e.g. redshift, RA/DEC, N, EW, etc.\r\n\r\nEach is a dict for now.\r\n\r\nGive a look and see what you think.","created_at":"2015-06-23T23:13:40Z","updated_at":"2015-06-25T02:40:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"63a76ec3789f606dc764d9356697674c75b69f5d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/linetools/linetools/pulls/4/commits","review_comments_url":"https://api.github.com/repos/linetools/linetools/pulls/4/comments","review_comment_url":"https://api.github.com/repos/linetools/linetools/pulls/comments{/number}","comments_url":"https://api.github.com/repos/linetools/linetools/issues/4/comments","statuses_url":"https://api.github.com/repos/linetools/linetools/statuses/c61311158bff6959965161c7e0d54280eb6baca4","head":{"label":"profxj:spectral_line","ref":"spectral_line","sha":"c61311158bff6959965161c7e0d54280eb6baca4","user":{"login":"profxj","id":3998093,"avatar_url":"https://avatars.githubusercontent.com/u/3998093?v=3","gravatar_id":"","url":"https://api.github.com/users/profxj","html_url":"https://github.com/profxj","followers_url":"https://api.github.com/users/profxj/followers","following_url":"https://api.github.com/users/profxj/following{/other_user}","gists_url":"https://api.github.com/users/profxj/gists{/gist_id}","starred_url":"https://api.github.com/users/profxj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/profxj/subscriptions","organizations_url":"https://api.github.com/users/profxj/orgs","repos_url":"https://api.github.com/users/profxj/repos","events_url":"https://api.github.com/users/profxj/events{/privacy}","received_events_url":"https://api.github.com/users/profxj/received_events","type":"User","site_admin":false},"repo":{"id":36232893,"name":"linetools","full_name":"profxj/linetools","owner":{"login":"profxj","id":3998093,"avatar_url":"https://avatars.githubusercontent.com/u/3998093?v=3","gravatar_id":"","url":"https://api.github.com/users/profxj","html_url":"https://github.com/profxj","followers_url":"https://api.github.com/users/profxj/followers","following_url":"https://api.github.com/users/profxj/following{/other_user}","gists_url":"https://api.github.com/users/profxj/gists{/gist_id}","starred_url":"https://api.github.com/users/profxj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/profxj/subscriptions","organizations_url":"https://api.github.com/users/profxj/orgs","repos_url":"https://api.github.com/users/profxj/repos","events_url":"https://api.github.com/users/profxj/events{/privacy}","received_events_url":"https://api.github.com/users/profxj/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/profxj/linetools","description":"","fork":true,"url":"https://api.github.com/repos/profxj/linetools","forks_url":"https://api.github.com/repos/profxj/linetools/forks","keys_url":"https://api.github.com/repos/profxj/linetools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/profxj/linetools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/profxj/linetools/teams","hooks_url":"https://api.github.com/repos/profxj/linetools/hooks","issue_events_url":"https://api.github.com/repos/profxj/linetools/issues/events{/number}","events_url":"https://api.github.com/repos/profxj/linetools/events","assignees_url":"https://api.github.com/repos/profxj/linetools/assignees{/user}","branches_url":"https://api.github.com/repos/profxj/linetools/branches{/branch}","tags_url":"https://api.github.com/repos/profxj/linetools/tags","blobs_url":"https://api.github.com/repos/profxj/linetools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/profxj/linetools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/profxj/linetools/git/refs{/sha}","trees_url":"https://api.github.com/repos/profxj/linetools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/profxj/linetools/statuses/{sha}","languages_url":"https://api.github.com/repos/profxj/linetools/languages","stargazers_url":"https://api.github.com/repos/profxj/linetools/stargazers","contributors_url":"https://api.github.com/repos/profxj/linetools/contributors","subscribers_url":"https://api.github.com/repos/profxj/linetools/subscribers","subscription_url":"https://api.github.com/repos/profxj/linetools/subscription","commits_url":"https://api.github.com/repos/profxj/linetools/commits{/sha}","git_commits_url":"https://api.github.com/repos/profxj/linetools/git/commits{/sha}","comments_url":"https://api.github.com/repos/profxj/linetools/comments{/number}","issue_comment_url":"https://api.github.com/repos/profxj/linetools/issues/comments{/number}","contents_url":"https://api.github.com/repos/profxj/linetools/contents/{+path}","compare_url":"https://api.github.com/repos/profxj/linetools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/profxj/linetools/merges","archive_url":"https://api.github.com/repos/profxj/linetools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/profxj/linetools/downloads","issues_url":"https://api.github.com/repos/profxj/linetools/issues{/number}","pulls_url":"https://api.github.com/repos/profxj/linetools/pulls{/number}","milestones_url":"https://api.github.com/repos/profxj/linetools/milestones{/number}","notifications_url":"https://api.github.com/repos/profxj/linetools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/profxj/linetools/labels{/name}","releases_url":"https://api.github.com/repos/profxj/linetools/releases{/id}","created_at":"2015-05-25T13:29:45Z","updated_at":"2015-05-25T13:29:45Z","pushed_at":"2015-06-24T22:12:30Z","git_url":"git://github.com/profxj/linetools.git","ssh_url":"git@github.com:profxj/linetools.git","clone_url":"https://github.com/profxj/linetools.git","svn_url":"https://github.com/profxj/linetools","homepage":null,"size":682,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"linetools:master","ref":"master","sha":"c0180aaea6efa571c05e345220656fe720035575","user":{"login":"linetools","id":12589255,"avatar_url":"https://avatars.githubusercontent.com/u/12589255?v=3","gravatar_id":"","url":"https://api.github.com/users/linetools","html_url":"https://github.com/linetools","followers_url":"https://api.github.com/users/linetools/followers","following_url":"https://api.github.com/users/linetools/following{/other_user}","gists_url":"https://api.github.com/users/linetools/gists{/gist_id}","starred_url":"https://api.github.com/users/linetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linetools/subscriptions","organizations_url":"https://api.github.com/users/linetools/orgs","repos_url":"https://api.github.com/users/linetools/repos","events_url":"https://api.github.com/users/linetools/events{/privacy}","received_events_url":"https://api.github.com/users/linetools/received_events","type":"User","site_admin":false},"repo":{"id":36200517,"name":"linetools","full_name":"linetools/linetools","owner":{"login":"linetools","id":12589255,"avatar_url":"https://avatars.githubusercontent.com/u/12589255?v=3","gravatar_id":"","url":"https://api.github.com/users/linetools","html_url":"https://github.com/linetools","followers_url":"https://api.github.com/users/linetools/followers","following_url":"https://api.github.com/users/linetools/following{/other_user}","gists_url":"https://api.github.com/users/linetools/gists{/gist_id}","starred_url":"https://api.github.com/users/linetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linetools/subscriptions","organizations_url":"https://api.github.com/users/linetools/orgs","repos_url":"https://api.github.com/users/linetools/repos","events_url":"https://api.github.com/users/linetools/events{/privacy}","received_events_url":"https://api.github.com/users/linetools/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/linetools/linetools","description":"","fork":false,"url":"https://api.github.com/repos/linetools/linetools","forks_url":"https://api.github.com/repos/linetools/linetools/forks","keys_url":"https://api.github.com/repos/linetools/linetools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/linetools/linetools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/linetools/linetools/teams","hooks_url":"https://api.github.com/repos/linetools/linetools/hooks","issue_events_url":"https://api.github.com/repos/linetools/linetools/issues/events{/number}","events_url":"https://api.github.com/repos/linetools/linetools/events","assignees_url":"https://api.github.com/repos/linetools/linetools/assignees{/user}","branches_url":"https://api.github.com/repos/linetools/linetools/branches{/branch}","tags_url":"https://api.github.com/repos/linetools/linetools/tags","blobs_url":"https://api.github.com/repos/linetools/linetools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/linetools/linetools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/linetools/linetools/git/refs{/sha}","trees_url":"https://api.github.com/repos/linetools/linetools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/linetools/linetools/statuses/{sha}","languages_url":"https://api.github.com/repos/linetools/linetools/languages","stargazers_url":"https://api.github.com/repos/linetools/linetools/stargazers","contributors_url":"https://api.github.com/repos/linetools/linetools/contributors","subscribers_url":"https://api.github.com/repos/linetools/linetools/subscribers","subscription_url":"https://api.github.com/repos/linetools/linetools/subscription","commits_url":"https://api.github.com/repos/linetools/linetools/commits{/sha}","git_commits_url":"https://api.github.com/repos/linetools/linetools/git/commits{/sha}","comments_url":"https://api.github.com/repos/linetools/linetools/comments{/number}","issue_comment_url":"https://api.github.com/repos/linetools/linetools/issues/comments{/number}","contents_url":"https://api.github.com/repos/linetools/linetools/contents/{+path}","compare_url":"https://api.github.com/repos/linetools/linetools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/linetools/linetools/merges","archive_url":"https://api.github.com/repos/linetools/linetools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/linetools/linetools/downloads","issues_url":"https://api.github.com/repos/linetools/linetools/issues{/number}","pulls_url":"https://api.github.com/repos/linetools/linetools/pulls{/number}","milestones_url":"https://api.github.com/repos/linetools/linetools/milestones{/number}","notifications_url":"https://api.github.com/repos/linetools/linetools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/linetools/linetools/labels{/name}","releases_url":"https://api.github.com/repos/linetools/linetools/releases{/id}","created_at":"2015-05-25T00:15:17Z","updated_at":"2015-05-25T00:17:11Z","pushed_at":"2015-06-23T23:13:41Z","git_url":"git://github.com/linetools/linetools.git","ssh_url":"git@github.com:linetools/linetools.git","clone_url":"https://github.com/linetools/linetools.git","svn_url":"https://github.com/linetools/linetools","homepage":null,"size":425,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":1,"forks":3,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/linetools/linetools/pulls/4"},"html":{"href":"https://github.com/linetools/linetools/pull/4"},"issue":{"href":"https://api.github.com/repos/linetools/linetools/issues/4"},"comments":{"href":"https://api.github.com/repos/linetools/linetools/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/linetools/linetools/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/linetools/linetools/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/linetools/linetools/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/linetools/linetools/statuses/c61311158bff6959965161c7e0d54280eb6baca4"}}}}