{"action":"created","comment":{"url":"https://api.github.com/repos/psi4/psi4/pulls/comments/179957451","pull_request_review_id":110296638,"id":179957451,"diff_hunk":"@@ -575,6 +613,22 @@ def extract_fragments(self, reals, ghosts=[]):\n         subset.update_geometry()\n         return subset\n \n+    def get_fragments(self):\n+        \"\"\"The list of atom ranges defining each fragment from parent molecule\"\"\"\n+        return self.fragments\n+\n+    def get_fragment_types(self):\n+        \"\"\"A list describing how to handle each fragment\"\"\"\n+        return self.fragment_types\n+\n+    def get_fragment_charges(self):\n+        \"\"\"The charge of each fragment\"\"\"\n+        return self.fragment_charges\n+\n+    def get_fragment_multiplicities(self):\n+        \"\"\"The multiplicity of each fragment\"\"\"\n+        return self.fragment_multiplicities","path":"psi4/driver/qcdb/libmintsmolecule.py","position":235,"original_position":235,"commit_id":"582899c275c4bb7de61054960b1da4e777c6eae5","original_commit_id":"582899c275c4bb7de61054960b1da4e777c6eae5","user":{"login":"loriab","id":2314730,"avatar_url":"https://avatars0.githubusercontent.com/u/2314730?v=4","gravatar_id":"","url":"https://api.github.com/users/loriab","html_url":"https://github.com/loriab","followers_url":"https://api.github.com/users/loriab/followers","following_url":"https://api.github.com/users/loriab/following{/other_user}","gists_url":"https://api.github.com/users/loriab/gists{/gist_id}","starred_url":"https://api.github.com/users/loriab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loriab/subscriptions","organizations_url":"https://api.github.com/users/loriab/orgs","repos_url":"https://api.github.com/users/loriab/repos","events_url":"https://api.github.com/users/loriab/events{/privacy}","received_events_url":"https://api.github.com/users/loriab/received_events","type":"User","site_admin":false},"body":"Good point. I want to keep it returning the data b/c that mirrors what `psi4.core.Mol` does. But (1) ppl should be warned that these are expert fns that wouldn't be visible if not for the needs of qcdb/psi4.core.Molecule handoff. And (2) I have already been bitten by this and need to backport the bugfix.","created_at":"2018-04-08T18:55:47Z","updated_at":"2018-04-08T18:55:48Z","html_url":"https://github.com/psi4/psi4/pull/834#discussion_r179957451","pull_request_url":"https://api.github.com/repos/psi4/psi4/pulls/834","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/psi4/psi4/pulls/comments/179957451"},"html":{"href":"https://github.com/psi4/psi4/pull/834#discussion_r179957451"},"pull_request":{"href":"https://api.github.com/repos/psi4/psi4/pulls/834"}},"in_reply_to_id":179950026},"pull_request":{"url":"https://api.github.com/repos/psi4/psi4/pulls/834","id":149718300,"html_url":"https://github.com/psi4/psi4/pull/834","diff_url":"https://github.com/psi4/psi4/pull/834.diff","patch_url":"https://github.com/psi4/psi4/pull/834.patch","issue_url":"https://api.github.com/repos/psi4/psi4/issues/834","number":834,"state":"open","locked":false,"title":"py-side Hessian analysis","user":{"login":"loriab","id":2314730,"avatar_url":"https://avatars0.githubusercontent.com/u/2314730?v=4","gravatar_id":"","url":"https://api.github.com/users/loriab","html_url":"https://github.com/loriab","followers_url":"https://api.github.com/users/loriab/followers","following_url":"https://api.github.com/users/loriab/following{/other_user}","gists_url":"https://api.github.com/users/loriab/gists{/gist_id}","starred_url":"https://api.github.com/users/loriab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loriab/subscriptions","organizations_url":"https://api.github.com/users/loriab/orgs","repos_url":"https://api.github.com/users/loriab/repos","events_url":"https://api.github.com/users/loriab/events{/privacy}","received_events_url":"https://api.github.com/users/loriab/received_events","type":"User","site_admin":false},"body":"## Description\r\nIncludes Joe's psi4/psi4#772, since the original point of this was to do properly the hacks needed to get the normco into the Wfn. This includes py-side vibrational analysis, thermo, and small-system reordering. Also fixes Hessian symmetrization (py-side; haven't moved it back c-side).\r\n\r\n~This isn't a final product. I only re-hooked-back-up one conventional freq test case. There's plenty of organizational, naming, storage (want both freq and normco in Wfn? and if so, only vibs, not RT? and how ID imag freq if we're float and don't want `-`?) choices yet. What this does have is a substantial py test case with 6 Hessian readouts from Cfour and 6 matching p4 findif-by-grad vibrational analyses to help debug some analytic Hessian errors at wwdc.~\r\n\r\n~And watch out – any change to `findif.h` recompiles most of psi.~\r\n\r\nIn the end, this added a py-side vib analysis, identified two Hessian bugs, upgraded the two Molecule classes, added Molecule serialization everywhere except initial string input parsing, added alignment and BFS tools, and lots more – see below.\r\n\r\n## Todos\r\nNotable points that this PR has either accomplished or will accomplish.\r\n* **Developer Interest**\r\n  - This PR includes Joe's psi4/psi4#772\r\n     - adds an optional history object to the optimize output. This object contains energies, gradients, and coordinates for the molecule at each step of the optimization. Hooked up to MDT.\r\n     - ~adds normalmode displacement export to the api and optional saving of normal modes to the wavefunction.~\r\n     - Adds handling of several one-electron properties to the API and saves them to the wavefunction.\r\n  - `qcdb.Molecule`\r\n     - Fix some bugs, including C3/D3 symmetry detection w/o verbose and printing for Q-Chem when dummy (or ghost?, don't remember which) present\r\n     - Simplify rotational_constants, add rotational_symmetry_number, add axis_representation (probably should double-check this with a spectroscopy book)\r\n     - Optimize instantiation (really, update_geometry) of large systems by a couple orders of magnitude (now ~1 min for 6000 atoms, w/symmetry)\r\n     - Hook up Trent Parker's linear-scaling BFS algorithm to qcdb.Molecule or through just np arrays. Has \"seed\" argument so you can forcibly split intramolecularly or close-bound intermol.\r\n     - Selected steps (for performance) are now in numpy, as a result, `geometry(np_out=True)` and `xyz(np_out=True)` are avail to skip the cast-back-to-list step. Also, `to_arrays` returns geom, mass, elez, etc. as numpy arrays, rather than needing to iterate over natom.\r\n  - `psi4.core.Molecule`\r\n     - add rotational_symmetry_number\r\n     - export rotor_type\r\n     - faster BFS algorithm hooked up to psi4.Mol, too. Depending on Mol type, returns numpy split arrays, single large Mol with atoms rearranged and fragmentation embedded, and/or list of indiv Mols, one for each fragment. Radically pare down auto_fragments/old BFS code.\r\n     - `units` no longer exported as a property. has getter/setter, and the getter returns strings, not `Molecule::GeometryUnits` objects.\r\n   - _Both_ psi4.core.Molecule && qcdb.Molecule\r\n     - Enhanced `add_atom` to take label (in add'n to symbol) and mass number, so is a full fledged CoordEntry entry point\r\n     - Add `mass_number` storage and accessor. In Psi, this is just a pass-through – nothing done with it. Stores isotope mass number if mass corresponds to valid nuclide, -1 otherwise or unknown.\r\n     - Fragmentation member data public access. Rename fragments --> get_fragments; similar for fragment_types, fragment_charges, fragment_multiplicities. Only fisapt code was using this. For setters, added `set_fragmentation_pattern` that sets them all at once.\r\n     - Added `input_units_to_au` getter/setter; checks physical reasonableness.\r\n     - Sets input_units_to_au whenever set_units called, rather than as extra step.\r\n     - Finally add a `com_fixed` fn to mirror `orientation_fixed`. In qcdb.Mol, also a `fix_com`.\r\n     - `create_molecule_from_string` was doing all kinds of contortions with fr_types and efp_chg/mult to the extend that fragment* arrays were not the same length. Function to be retired shortly, so papered over.\r\n     - Psi has long had the problem that set_multiplicity/set_molecular_charge values might not stick upon reinterpret_coordentries b/c recomputed from fragments (which the user can't change) and by high-spin-sum. Adds logic to retain set_mult value if all fragments real (still no guarantee of physical reasonableness wrt frags) b/c otherwise I couldn't do isapt. See `validate_and_fill_chgmult` for general solution at the boundaries of Mol class, but no good internally to psi4.Mol b/c in python.\r\n     - `to_arrays`, `to_dict`, `BFS`, `B787`, `scramble` fns shared btwn psi4 & qcdb Mol classes. When drop py27, can attach qcdb fns directly to psi4 and drop the @static raw_ intermed fns.\r\n   - Molecule serialization\r\n     - New `from_arrays` constructor that takes minimal (geom & Z) to full geom spec as arrays (homogeneous natom-length, not heterogeneous per-atom) and thoroughly validates them and fills in defaults, emitting a standardized (to become MolSSI JSON) molrec dict. Plain fn produces dict. `psi4.core.Molecule.from_arrays` and `qcdb.Molecule.from_arrays` go a step further and return a Mol.\r\n       - Function `validate_and_fill_chgmult` addresses current problems (1) create_mol_from_string's problem of not allowing overall chgmult to be set, defaulting all frag to `0 1`, and defaulting overall to fragA, (2) physical reasonableness (chg/mult/#elec compatible) not being tested for fragments at all and for overall not until the SCF code, (3) problems like psi4/psi4#114, and (4) overall and frag chgmult getting out of whack upon set_chg/mult, extract_subsets, not having frag chgmult editable, scf singlet/doublet defaulting. Taking given tot/frag chg/mult info and reasoning out the missing info would have been massive logic for chg/mult/#elec simultaneously, so this just codes up the rules and the defaults and throw `itertools.product` at it. Slows down a bit by 10 frag, but there's room for performance optimization. Ideally we'd call this at every reinterpret_coordentry, but that's not feasible for psi4 Mol. A good newdev starter project would be (for impossible reconciliations) to keep track of the least offending combo, and print out a summary of what rules it's violating.\r\n       - Function `reconcile_nucleus` addresses problems (1) can't specify atoms by atomic number, (2) can't specify masses by mass number, (3) faced with A, Z, E, real/ghost, and label `@C_special@12.1`, all as inputs, need to make sure (a) extracting as much user info as possible, (b) not allowing contradictory info, and (c) filling in everything else from periodictable. Like chgmult, fn handles this by defining rules and candidate values, and letting itertools do the rest. Expand atom label spec so can specify isotope and atomic number e.g., `Gh(27@58.933)` or `2H_deut`.\r\n       - Validates atoms-too-close all at once, rather than per-atom, which can run into units, coordsys, and? old CoordEntry trouble.\r\n     - New `from_dict` fn takes a fully validated and defaulted molrec dict and constructs a Mol. psi4 fn is in export_mints.cc, and qcdb fn is in molecule.py.\r\n     - New `to_dict` fn serializes Mol into molrec dict. This fn in molecule.py is shared by psi4 & qcdb Mol classes. For the moment (not mandatory), this dict passes again through `from_arrays` and output is compared to make sure (1) resulting dict is pure and (2) Mol hasn't been tampered with in an unphysical way.\r\n     - `from_arrays` used internally to qcdb.Molecule for decomposing and reconstituting Mol into np arrays for fragmentation and alignment (potentially reordering)\r\n     - BasisSet molecule handover (happens a lot to construct py basis for c++ mol and hand it back; also happens once per atom for SAD) that used to use create_psi4_string_from_molecule & create_molecule_from_string now uses to_dict & from_dict. So even though all this serialization tech isn't hooked up to `molecule {...}`, it's still getting exercised a lot.\r\n     - ISAPT calcs may well need to use `from_arrays` rather than `molecule {...}` for a bit (until new molecule string parser in) if splitting bonds. See note in `tests/isapt1`. @bwb314, your SAPT consumer base may need informing about this change when it hits master.\r\n  - Add a py-side vibrational analysis called from `driver.frequency()` after the internal hessian() call\r\n     - Still sets `Wavefunction.frequencies` member data with vib-only real frequencies in cm^-1 so tests happy\r\n     - Rest of results is appended to Wfn py-side. See Q below\r\n     - Adds a `symmetrize_hessian` function\r\n     - Translates `print_molden_vibs`\r\n     - Easy switching between mass-weighted normalized (q), un-mass-weighted (w), and un-mass-weighted normalized (x) normal coordinates\r\n     - projects translations and rotations from Hessian\r\n     - separate `print_vibs(vibinfo)` function in which q/w/x normco, number of vibs per row, number of decimal places for freq, number of decimal places for normco, and normco (nat x 3) or (3*nat x 1) is all customizable by option\r\n     - py-side thermo analysis that returns a dict of all the results\r\n     - compare_vibinfos fn so one can compare every aspect of a vib calculation, including normco. has capability to forgive some fields e.g., irrep label on mol with degen modes\r\n     - checks normco for partial findif frequency. @psi-rking fixed bug that made normco wrong for not-totally-symmetric partial findif-by-G frequency. connection?\r\n     - Adds gradient calc to the beginning of every Hessian and stores in wfn. Adds check of whether sys is at stationary point (Grms > 1.e-2) and if so, and doing findif, include rotational dof in SALCs. Adds keyword `FD_PROJECT` for user to force inclusion/disclusion.\r\n     - If _not_ at stationary point (same crit as above), during vibrational analysis _don't_ project out rotations b/c vib/rot can't properly be separated. this leaves 3 extra normco than user might be expecting.\r\n     - For reference, if my memory serves be correctly, Gaussian prints low freqs of unproj and final normco of proj, Q-Chem prints the final normco of proj, Cfour prints final normco of unproj and prints the freq of proj.\r\n  - Add nifty fn stolen from internet to \r\n     - decompose numpy matrices into little numpy matrices (like the i, jth atom of a Hessian ...) and put it back together again.\r\n     - generate a random, evenly distributed 3d rotation matrix\r\n  - Adds an alignment tool (B787) that returns a displacement vec, rotation mat, and atom map to get best Kabsch overlap (@dsirianni code) between two molecules. Uses Hungarian algorithm+ for atom shuffling. In that case, required `hungarian` and `networkx` add'l packages. Handles shuffled atoms up to at least benzene trimer and more if haven't too many symmetry-equivalent atoms. Really good for perfect matches, fine but untuned for imperfect matches. Also provides functions that use that return set to properly manipulate list, vec, mol, grad, hess (hess untested). Upon request, also tests mirror-image alignment.\r\n  - Remove everything beyond constructing the Cartesian Hessian from findif, including VIBRATION class\r\n  - Remove the c-side thermo module \r\n  - Adds extensive vib test on HOOH-TS, CO2, ethene, H2CO, methane that checks freqs _and_ normco of each mol vs. Cfour output for following conditions\r\n     - Cfour Hessian (tests harmonic analysis machinery)\r\n     - Psi freq by grad\r\n     - Psi freq by energy\r\n     - Psi freq by analytic ~(only methane and ammonia pass)~ All pass now, thanks to @andysim \r\n - [x] fix the embarrassing bug (I'll do you a coding favor if you spot it, but I'm not admitting it otherwise)\r\n - [x] better handle non-stationary. probably need an option to force-rot-space-inclusion but by default, `frequency()` does a gradient to determine if rotational projection is safe, then another flag to query external field and company to see if even translational projection is appropriate. \r\n - [x] more testing of isotopic, partial, non-stationary, etc., particularly wrt normco not just freq\r\n - Add `compare_dicts` and `compare_molrecs` comparison functions. Former uses `deepdiff` module and does recursive comparison (sensitive to types). Can exempt fields with `forgive` arg. Latter makes use of former and also allows geoms to change if warranted by fix_com/orientation (checks via aligner).\r\n - convert qcdb test suite from GnuMake (yes, that old) to pytest. switch compare_* fns to raise `TestComparisonError`, not `sys.exit(1)`.\r\n - have to temporarily set `0 2` in some test cases, b/c the reconciler wants physically reasonable values, but the input molecule isn't currently passing through the code that would set those defaults.\r\n - updated v2rdm_casscf pinning to one Eugene already fixed up to work w/psi\r\n* **User-Facing for Release Notes**\r\n\r\n## Questions\r\n- [ ] Right now, results of harmonic analysis is a dict of namedtuples with numpy arrays (contents and interface below). This is pretty convenient to access and work with. But it is numpy arrays attached to Wfn and thus mixing array classes on Wfn and unable to access c-side. Is this ok? Better ideas?\r\n   ```\r\n     Returns\r\n     -------\r\n     dict, text\r\n         Returns dictionary of VibrationAspect objects (fields: lbl unit data comment)\r\n         Also returns text suitable for printing\r\n  \r\n     +---------------+--------------------------------------------+-----------+------------------------------------------------------+\r\n     | key           | description (lbl & comment)                | units     | data (real/imaginary modes)                          |\r\n     +===============+============================================+===========+======================================================+\r\n     | omega         | frequency                                  | cm^-1     | np.array(ndof) complex (real/imag)                   |\r\n     | q             | normal mode, normalized mass-weighted      | a0 u^1/2  | np.array(ndof, ndof) float                           |\r\n     | w             | normal mode, un-mass-weighted              | a0        | np.array(ndof, ndof) float                           |\r\n     | x             | normal mode, normalized un-mass-weighted   | a0        | np.array(ndof, ndof) float                           |\r\n     | degeneracy    | degree of degeneracy                       |           | np.array(ndof) int                                   |\r\n     | TRV           | translation/rotation/vibration             |           | np.array(ndof) str 'TR' or 'V' or '-' for partial    |\r\n     | gamma         | irreducible representation                 |           | np.array(ndof) str irrep or None if unclassifiable   |\r\n     | mu            | reduced mass                               | u         | np.array(ndof) float (+/+)                           |\r\n     | k             | force constant                             | mDyne/A   | np.array(ndof) float (+/-)                           |\r\n     | DQ0           | RMS deviation v=0                          | a0 u^1/2  | np.array(ndof) float (+/0)                           |\r\n     | Qtp0          | Turning point v=0                          | a0 u^1/2  | np.array(ndof) float (+/0)                           |\r\n     | Xtp0          | Turning point v=0                          | a0        | np.array(ndof) float (+/0)                           |\r\n     | theta_vib     | char temp                                  | K         | np.array(ndof) float (+/0)                           |\r\n \r\n     Examples\r\n     --------\r\n     # displacement of first atom in highest energy mode\r\n     >>> vibinfo['x'].data[:, -1].reshape(nat, 3)[0]\r\n \r\n     # remove translations & rotations\r\n     >>> vibonly = filter_nonvib(vibinfo)\r\n   ```\r\n- [ ] Should we run a gradient before every freq to judge whether to project rotations? Right now freq on non-stationary structures are going to be way different than from findif because findif stuck with the (in PR analysis labeling) \"pre-proj\" vibs\r\n- [ ] How to handle natural geometry shift the occurs upon isotopic substitution in geometry but not in reused Hessian? shift/rotate the Hessian? compute in center-of-charge instead?\r\n\r\n## Good stuff still to do\r\n- [ ] vibs docs\r\n- [ ] warning to isapt folks that frag spec just got tighter wrt mult\r\n- [ ] break up vibanalysis, dft-cation, dft-water-dimer tests. to py?\r\n\r\n## Status\r\n- [x] Ready for review\r\n- [x] Ready for merge content-correctness-wise\r\n- [ ] Ready for merge psi-planning-wise","created_at":"2017-10-31T08:01:19Z","updated_at":"2018-04-08T18:55:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dcb9dc718431947318a3e18e3ceb6670ffb5b3c1","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/psi4/psi4/milestones/3","html_url":"https://github.com/psi4/psi4/milestone/3","labels_url":"https://api.github.com/repos/psi4/psi4/milestones/3/labels","id":2362493,"number":3,"title":"Psi4 1.2","description":"Milstones for the 1.2.0 release.","creator":{"login":"dgasmith","id":1769841,"avatar_url":"https://avatars2.githubusercontent.com/u/1769841?v=4","gravatar_id":"","url":"https://api.github.com/users/dgasmith","html_url":"https://github.com/dgasmith","followers_url":"https://api.github.com/users/dgasmith/followers","following_url":"https://api.github.com/users/dgasmith/following{/other_user}","gists_url":"https://api.github.com/users/dgasmith/gists{/gist_id}","starred_url":"https://api.github.com/users/dgasmith/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dgasmith/subscriptions","organizations_url":"https://api.github.com/users/dgasmith/orgs","repos_url":"https://api.github.com/users/dgasmith/repos","events_url":"https://api.github.com/users/dgasmith/events{/privacy}","received_events_url":"https://api.github.com/users/dgasmith/received_events","type":"User","site_admin":false},"open_issues":16,"closed_issues":8,"state":"open","created_at":"2017-03-04T04:00:03Z","updated_at":"2018-04-07T15:13:45Z","due_on":"2018-06-30T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/psi4/psi4/pulls/834/commits","review_comments_url":"https://api.github.com/repos/psi4/psi4/pulls/834/comments","review_comment_url":"https://api.github.com/repos/psi4/psi4/pulls/comments{/number}","comments_url":"https://api.github.com/repos/psi4/psi4/issues/834/comments","statuses_url":"https://api.github.com/repos/psi4/psi4/statuses/582899c275c4bb7de61054960b1da4e777c6eae5","head":{"label":"loriab:pyvib2","ref":"pyvib2","sha":"582899c275c4bb7de61054960b1da4e777c6eae5","user":{"login":"loriab","id":2314730,"avatar_url":"https://avatars0.githubusercontent.com/u/2314730?v=4","gravatar_id":"","url":"https://api.github.com/users/loriab","html_url":"https://github.com/loriab","followers_url":"https://api.github.com/users/loriab/followers","following_url":"https://api.github.com/users/loriab/following{/other_user}","gists_url":"https://api.github.com/users/loriab/gists{/gist_id}","starred_url":"https://api.github.com/users/loriab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loriab/subscriptions","organizations_url":"https://api.github.com/users/loriab/orgs","repos_url":"https://api.github.com/users/loriab/repos","events_url":"https://api.github.com/users/loriab/events{/privacy}","received_events_url":"https://api.github.com/users/loriab/received_events","type":"User","site_admin":false},"repo":{"id":71407205,"name":"psi4","full_name":"loriab/psi4","owner":{"login":"loriab","id":2314730,"avatar_url":"https://avatars0.githubusercontent.com/u/2314730?v=4","gravatar_id":"","url":"https://api.github.com/users/loriab","html_url":"https://github.com/loriab","followers_url":"https://api.github.com/users/loriab/followers","following_url":"https://api.github.com/users/loriab/following{/other_user}","gists_url":"https://api.github.com/users/loriab/gists{/gist_id}","starred_url":"https://api.github.com/users/loriab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/loriab/subscriptions","organizations_url":"https://api.github.com/users/loriab/orgs","repos_url":"https://api.github.com/users/loriab/repos","events_url":"https://api.github.com/users/loriab/events{/privacy}","received_events_url":"https://api.github.com/users/loriab/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/loriab/psi4","description":"Open-Source Quantum Chemistry – an electronic structure package in C++ driven by Python","fork":true,"url":"https://api.github.com/repos/loriab/psi4","forks_url":"https://api.github.com/repos/loriab/psi4/forks","keys_url":"https://api.github.com/repos/loriab/psi4/keys{/key_id}","collaborators_url":"https://api.github.com/repos/loriab/psi4/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/loriab/psi4/teams","hooks_url":"https://api.github.com/repos/loriab/psi4/hooks","issue_events_url":"https://api.github.com/repos/loriab/psi4/issues/events{/number}","events_url":"https://api.github.com/repos/loriab/psi4/events","assignees_url":"https://api.github.com/repos/loriab/psi4/assignees{/user}","branches_url":"https://api.github.com/repos/loriab/psi4/branches{/branch}","tags_url":"https://api.github.com/repos/loriab/psi4/tags","blobs_url":"https://api.github.com/repos/loriab/psi4/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/loriab/psi4/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/loriab/psi4/git/refs{/sha}","trees_url":"https://api.github.com/repos/loriab/psi4/git/trees{/sha}","statuses_url":"https://api.github.com/repos/loriab/psi4/statuses/{sha}","languages_url":"https://api.github.com/repos/loriab/psi4/languages","stargazers_url":"https://api.github.com/repos/loriab/psi4/stargazers","contributors_url":"https://api.github.com/repos/loriab/psi4/contributors","subscribers_url":"https://api.github.com/repos/loriab/psi4/subscribers","subscription_url":"https://api.github.com/repos/loriab/psi4/subscription","commits_url":"https://api.github.com/repos/loriab/psi4/commits{/sha}","git_commits_url":"https://api.github.com/repos/loriab/psi4/git/commits{/sha}","comments_url":"https://api.github.com/repos/loriab/psi4/comments{/number}","issue_comment_url":"https://api.github.com/repos/loriab/psi4/issues/comments{/number}","contents_url":"https://api.github.com/repos/loriab/psi4/contents/{+path}","compare_url":"https://api.github.com/repos/loriab/psi4/compare/{base}...{head}","merges_url":"https://api.github.com/repos/loriab/psi4/merges","archive_url":"https://api.github.com/repos/loriab/psi4/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/loriab/psi4/downloads","issues_url":"https://api.github.com/repos/loriab/psi4/issues{/number}","pulls_url":"https://api.github.com/repos/loriab/psi4/pulls{/number}","milestones_url":"https://api.github.com/repos/loriab/psi4/milestones{/number}","notifications_url":"https://api.github.com/repos/loriab/psi4/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/loriab/psi4/labels{/name}","releases_url":"https://api.github.com/repos/loriab/psi4/releases{/id}","deployments_url":"https://api.github.com/repos/loriab/psi4/deployments","created_at":"2016-10-19T23:17:18Z","updated_at":"2016-10-19T23:18:22Z","pushed_at":"2018-04-07T01:56:40Z","git_url":"git://github.com/loriab/psi4.git","ssh_url":"git@github.com:loriab/psi4.git","clone_url":"https://github.com/loriab/psi4.git","svn_url":"https://github.com/loriab/psi4","homepage":"http://psicode.org","size":80508,"stargazers_count":0,"watchers_count":0,"language":"C++","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":1,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"psi4:master","ref":"master","sha":"c1bb2fef750fc7a214fd873f8a7c095780017bf9","user":{"login":"psi4","id":2636883,"avatar_url":"https://avatars1.githubusercontent.com/u/2636883?v=4","gravatar_id":"","url":"https://api.github.com/users/psi4","html_url":"https://github.com/psi4","followers_url":"https://api.github.com/users/psi4/followers","following_url":"https://api.github.com/users/psi4/following{/other_user}","gists_url":"https://api.github.com/users/psi4/gists{/gist_id}","starred_url":"https://api.github.com/users/psi4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psi4/subscriptions","organizations_url":"https://api.github.com/users/psi4/orgs","repos_url":"https://api.github.com/users/psi4/repos","events_url":"https://api.github.com/users/psi4/events{/privacy}","received_events_url":"https://api.github.com/users/psi4/received_events","type":"Organization","site_admin":false},"repo":{"id":9174469,"name":"psi4","full_name":"psi4/psi4","owner":{"login":"psi4","id":2636883,"avatar_url":"https://avatars1.githubusercontent.com/u/2636883?v=4","gravatar_id":"","url":"https://api.github.com/users/psi4","html_url":"https://github.com/psi4","followers_url":"https://api.github.com/users/psi4/followers","following_url":"https://api.github.com/users/psi4/following{/other_user}","gists_url":"https://api.github.com/users/psi4/gists{/gist_id}","starred_url":"https://api.github.com/users/psi4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/psi4/subscriptions","organizations_url":"https://api.github.com/users/psi4/orgs","repos_url":"https://api.github.com/users/psi4/repos","events_url":"https://api.github.com/users/psi4/events{/privacy}","received_events_url":"https://api.github.com/users/psi4/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/psi4/psi4","description":"Open-Source Quantum Chemistry – an electronic structure package in C++ driven by Python","fork":false,"url":"https://api.github.com/repos/psi4/psi4","forks_url":"https://api.github.com/repos/psi4/psi4/forks","keys_url":"https://api.github.com/repos/psi4/psi4/keys{/key_id}","collaborators_url":"https://api.github.com/repos/psi4/psi4/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/psi4/psi4/teams","hooks_url":"https://api.github.com/repos/psi4/psi4/hooks","issue_events_url":"https://api.github.com/repos/psi4/psi4/issues/events{/number}","events_url":"https://api.github.com/repos/psi4/psi4/events","assignees_url":"https://api.github.com/repos/psi4/psi4/assignees{/user}","branches_url":"https://api.github.com/repos/psi4/psi4/branches{/branch}","tags_url":"https://api.github.com/repos/psi4/psi4/tags","blobs_url":"https://api.github.com/repos/psi4/psi4/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/psi4/psi4/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/psi4/psi4/git/refs{/sha}","trees_url":"https://api.github.com/repos/psi4/psi4/git/trees{/sha}","statuses_url":"https://api.github.com/repos/psi4/psi4/statuses/{sha}","languages_url":"https://api.github.com/repos/psi4/psi4/languages","stargazers_url":"https://api.github.com/repos/psi4/psi4/stargazers","contributors_url":"https://api.github.com/repos/psi4/psi4/contributors","subscribers_url":"https://api.github.com/repos/psi4/psi4/subscribers","subscription_url":"https://api.github.com/repos/psi4/psi4/subscription","commits_url":"https://api.github.com/repos/psi4/psi4/commits{/sha}","git_commits_url":"https://api.github.com/repos/psi4/psi4/git/commits{/sha}","comments_url":"https://api.github.com/repos/psi4/psi4/comments{/number}","issue_comment_url":"https://api.github.com/repos/psi4/psi4/issues/comments{/number}","contents_url":"https://api.github.com/repos/psi4/psi4/contents/{+path}","compare_url":"https://api.github.com/repos/psi4/psi4/compare/{base}...{head}","merges_url":"https://api.github.com/repos/psi4/psi4/merges","archive_url":"https://api.github.com/repos/psi4/psi4/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/psi4/psi4/downloads","issues_url":"https://api.github.com/repos/psi4/psi4/issues{/number}","pulls_url":"https://api.github.com/repos/psi4/psi4/pulls{/number}","milestones_url":"https://api.github.com/repos/psi4/psi4/milestones{/number}","notifications_url":"https://api.github.com/repos/psi4/psi4/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/psi4/psi4/labels{/name}","releases_url":"https://api.github.com/repos/psi4/psi4/releases{/id}","deployments_url":"https://api.github.com/repos/psi4/psi4/deployments","created_at":"2013-04-02T16:21:04Z","updated_at":"2018-04-07T15:13:49Z","pushed_at":"2018-04-08T17:59:52Z","git_url":"git://github.com/psi4/psi4.git","ssh_url":"git@github.com:psi4/psi4.git","clone_url":"https://github.com/psi4/psi4.git","svn_url":"https://github.com/psi4/psi4","homepage":"http://psicode.org","size":79486,"stargazers_count":196,"watchers_count":196,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":165,"mirror_url":null,"archived":false,"open_issues_count":88,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0"},"forks":165,"open_issues":88,"watchers":196,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/psi4/psi4/pulls/834"},"html":{"href":"https://github.com/psi4/psi4/pull/834"},"issue":{"href":"https://api.github.com/repos/psi4/psi4/issues/834"},"comments":{"href":"https://api.github.com/repos/psi4/psi4/issues/834/comments"},"review_comments":{"href":"https://api.github.com/repos/psi4/psi4/pulls/834/comments"},"review_comment":{"href":"https://api.github.com/repos/psi4/psi4/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/psi4/psi4/pulls/834/commits"},"statuses":{"href":"https://api.github.com/repos/psi4/psi4/statuses/582899c275c4bb7de61054960b1da4e777c6eae5"}},"author_association":"OWNER"}}
{"actor":{"display_login":"loriab"}}