chemruby 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +120 -0
 - data/Rakefile +195 -0
 - data/ext/extconf.rb +4 -0
 - data/ext/subcomp.c +416 -0
 - data/lib/chem.rb +130 -0
 - data/lib/chem/appl.rb +1 -0
 - data/lib/chem/appl/chem3dole.rb +36 -0
 - data/lib/chem/appl/tinker/nucleic.rb +40 -0
 - data/lib/chem/appl/tinker/tinker_reader.rb +43 -0
 - data/lib/chem/data.rb +4 -0
 - data/lib/chem/data/atomic_weight.rb +124 -0
 - data/lib/chem/data/character.rb +2 -0
 - data/lib/chem/data/electronegativity.rb +14 -0
 - data/lib/chem/data/periodic_table.rb +6 -0
 - data/lib/chem/data/prime_numbers.rb +1 -0
 - data/lib/chem/data/vdw_radii.rb +1 -0
 - data/lib/chem/db.rb +64 -0
 - data/lib/chem/db/cansmi.rb +234 -0
 - data/lib/chem/db/cdx.rb +1525 -0
 - data/lib/chem/db/eps.rb +164 -0
 - data/lib/chem/db/g98.rb +909 -0
 - data/lib/chem/db/gspan.rb +130 -0
 - data/lib/chem/db/iupac.rb +5 -0
 - data/lib/chem/db/iupac/a_1.rb +46 -0
 - data/lib/chem/db/iupac/iuparser.rb +226 -0
 - data/lib/chem/db/iupac/iuparser.ry +97 -0
 - data/lib/chem/db/iupac/postfix.rb +2 -0
 - data/lib/chem/db/kcf.rb +390 -0
 - data/lib/chem/db/kcf_glycan.rb +19 -0
 - data/lib/chem/db/kegg.rb +516 -0
 - data/lib/chem/db/linucs/linparser.rb +144 -0
 - data/lib/chem/db/linucs/linucs.ry +53 -0
 - data/lib/chem/db/mdl.rb +379 -0
 - data/lib/chem/db/molconnz.rb +12 -0
 - data/lib/chem/db/mopac.rb +88 -0
 - data/lib/chem/db/msi.rb +107 -0
 - data/lib/chem/db/pdb_dic.rb +115 -0
 - data/lib/chem/db/pdf.rb +131 -0
 - data/lib/chem/db/pubchem.rb +113 -0
 - data/lib/chem/db/rmagick.rb +70 -0
 - data/lib/chem/db/sdf.rb +37 -0
 - data/lib/chem/db/smbl.rb +88 -0
 - data/lib/chem/db/smiles.rb +2 -0
 - data/lib/chem/db/smiles/smiles.ry +203 -0
 - data/lib/chem/db/smiles/smiparser.rb +375 -0
 - data/lib/chem/db/swf.rb +74 -0
 - data/lib/chem/db/sybyl.rb +150 -0
 - data/lib/chem/db/tinker.rb +77 -0
 - data/lib/chem/db/types/type_cansmi.rb +9 -0
 - data/lib/chem/db/types/type_cdx.rb +24 -0
 - data/lib/chem/db/types/type_gspan.rb +31 -0
 - data/lib/chem/db/types/type_kcf.rb +28 -0
 - data/lib/chem/db/types/type_kcf_glycan.rb +26 -0
 - data/lib/chem/db/types/type_kegg.rb +92 -0
 - data/lib/chem/db/types/type_mdl.rb +31 -0
 - data/lib/chem/db/types/type_pdf.rb +33 -0
 - data/lib/chem/db/types/type_png.rb +31 -0
 - data/lib/chem/db/types/type_rxn.rb +25 -0
 - data/lib/chem/db/types/type_sdf.rb +25 -0
 - data/lib/chem/db/types/type_sybyl.rb +30 -0
 - data/lib/chem/db/types/type_xyz.rb +26 -0
 - data/lib/chem/db/vector.rb +128 -0
 - data/lib/chem/db/xyz.rb +39 -0
 - data/lib/chem/model.rb +119 -0
 - data/lib/chem/model/skeleton.rb +37 -0
 - data/lib/chem/utils.rb +11 -0
 - data/lib/chem/utils/geometry.rb +27 -0
 - data/lib/chem/utils/graph_db.rb +146 -0
 - data/lib/chem/utils/math.rb +17 -0
 - data/lib/chem/utils/prop.rb +123 -0
 - data/lib/chem/utils/sssr.rb +101 -0
 - data/lib/chem/utils/sub.rb +78 -0
 - data/lib/chem/utils/transform.rb +110 -0
 - data/lib/chem/utils/traverse.rb +37 -0
 - data/lib/chem/utils/ullmann.rb +134 -0
 - data/lib/graph.rb +41 -0
 - data/lib/graph/cluster.rb +20 -0
 - data/lib/graph/morgan.rb +38 -0
 - data/sample/frequent_subgraph.rb +46 -0
 - data/sample/images/ex1.rb +11 -0
 - data/sample/images/ex2.rb +4 -0
 - data/sample/images/ex3.rb +5 -0
 - data/sample/images/ex4.rb +17 -0
 - data/sample/images/ex5.rb +10 -0
 - data/sample/images/mol/adenine.mol +26 -0
 - data/sample/images/mol/atp.mol +69 -0
 - data/sample/images/temp/ex5.mol +344 -0
 - data/sample/kegg_db.rb +116 -0
 - data/setup.rb +1551 -0
 - data/test/all.rb +6 -0
 - data/test/coord_test.rb +17 -0
 - data/test/ctab_test.rb +31 -0
 - data/test/data/A_21.tar.gz +0 -0
 - data/test/data/A_21/aceanthrylene.cdx +0 -0
 - data/test/data/A_21/aceanthrylene.mol +40 -0
 - data/test/data/A_21/acenaphthylene.cdx +0 -0
 - data/test/data/A_21/acenaphthylene.mol +31 -0
 - data/test/data/A_21/acephenanthrylene.cdx +0 -0
 - data/test/data/A_21/acephenanthrylene.mol +40 -0
 - data/test/data/A_21/anthracene.cdx +0 -0
 - data/test/data/A_21/anthracene.mol +35 -0
 - data/test/data/A_21/as-indacene.cdx +0 -0
 - data/test/data/A_21/as-indacene.mol +31 -0
 - data/test/data/A_21/azulene.cdx +0 -0
 - data/test/data/A_21/azulene.mol +26 -0
 - data/test/data/A_21/biphenylene.cdx +0 -0
 - data/test/data/A_21/biphenylene.mol +31 -0
 - data/test/data/A_21/chrysene.cdx +0 -0
 - data/test/data/A_21/chrysene.mol +44 -0
 - data/test/data/A_21/coronen.cdx +0 -0
 - data/test/data/A_21/coronen.mol +59 -0
 - data/test/data/A_21/fluoranthene.cdx +0 -0
 - data/test/data/A_21/fluoranthene.mol +40 -0
 - data/test/data/A_21/fluorene.cdx +0 -0
 - data/test/data/A_21/fluorene.mol +33 -0
 - data/test/data/A_21/heptacene.cdx +0 -0
 - data/test/data/A_21/heptacene.mol +71 -0
 - data/test/data/A_21/heptalene.cdx +0 -0
 - data/test/data/A_21/heptalene.mol +30 -0
 - data/test/data/A_21/heptaphene.cdx +0 -0
 - data/test/data/A_21/heptaphene.mol +71 -0
 - data/test/data/A_21/hexacene.cdx +0 -0
 - data/test/data/A_21/hexacene.mol +62 -0
 - data/test/data/A_21/hexaphene.cdx +0 -0
 - data/test/data/A_21/hexaphene.mol +62 -0
 - data/test/data/A_21/indene.cdx +0 -0
 - data/test/data/A_21/indene.mol +24 -0
 - data/test/data/A_21/iupac.txt +41 -0
 - data/test/data/A_21/naphthacene.cdx +0 -0
 - data/test/data/A_21/naphthacene.mol +44 -0
 - data/test/data/A_21/naphthalene.cdx +0 -0
 - data/test/data/A_21/naphthalene.mol +26 -0
 - data/test/data/A_21/ovalene.cdx +0 -0
 - data/test/data/A_21/ovalene.mol +78 -0
 - data/test/data/A_21/pentacene.cdx +0 -0
 - data/test/data/A_21/pentacene.mol +53 -0
 - data/test/data/A_21/pentalene.cdx +0 -0
 - data/test/data/A_21/pentalene.mol +22 -0
 - data/test/data/A_21/pentaphene.cdx +0 -0
 - data/test/data/A_21/pentaphene.mol +53 -0
 - data/test/data/A_21/perylene.cdx +0 -0
 - data/test/data/A_21/perylene.mol +49 -0
 - data/test/data/A_21/phenalene.cdx +0 -0
 - data/test/data/A_21/phenalene.mol +33 -0
 - data/test/data/A_21/phenanthrene.cdx +0 -0
 - data/test/data/A_21/phenanthrene.mol +35 -0
 - data/test/data/A_21/picene.cdx +0 -0
 - data/test/data/A_21/picene.mol +53 -0
 - data/test/data/A_21/pleiadene.cdx +0 -0
 - data/test/data/A_21/pleiadene.mol +44 -0
 - data/test/data/A_21/pyranthrene.cdx +0 -0
 - data/test/data/A_21/pyranthrene.mol +72 -0
 - data/test/data/A_21/pyrene.cdx +0 -0
 - data/test/data/A_21/pyrene.mol +40 -0
 - data/test/data/A_21/rubicene.cdx +0 -0
 - data/test/data/A_21/rubicene.mol +63 -0
 - data/test/data/A_21/s-indacene.cdx +0 -0
 - data/test/data/A_21/s-indacene.mol +31 -0
 - data/test/data/A_21/tetraphenylene.cdx +0 -0
 - data/test/data/A_21/tetraphenylene.mol +57 -0
 - data/test/data/A_21/trinaphthylene.cdx +0 -0
 - data/test/data/A_21/trinaphthylene.mol +71 -0
 - data/test/data/A_21/triphenylene.cdx +0 -0
 - data/test/data/A_21/triphenylene.mol +44 -0
 - data/test/data/C00147.kcf +25 -0
 - data/test/data/G00147.kcf +13 -0
 - data/test/data/atp.mol +69 -0
 - data/test/data/cyclohexane.mol +17 -0
 - data/test/data/cyclohexane.ps +485 -0
 - data/test/data/fullerene.mol +155 -0
 - data/test/data/glycan +33 -0
 - data/test/data/hypericin.cdx +0 -0
 - data/test/data/hypericin.cdxml +596 -0
 - data/test/data/hypericin.chm +0 -0
 - data/test/data/hypericin.ct +85 -0
 - data/test/data/hypericin.f1d +0 -0
 - data/test/data/hypericin.f1q +0 -0
 - data/test/data/hypericin.gif +0 -0
 - data/test/data/hypericin.mol +88 -0
 - data/test/data/hypericin.mol2 +159 -0
 - data/test/data/hypericin.msm +123 -0
 - data/test/data/hypericin.pdf +359 -0
 - data/test/data/hypericin.png +0 -0
 - data/test/data/hypericin.ps +0 -0
 - data/test/data/hypericin.skc +0 -0
 - data/test/data/hypericin2.gif +0 -0
 - data/test/data/hypericin2.ps +0 -0
 - data/test/data/kegg/genomes/hsa/hsa_enzyme.list +4 -0
 - data/test/data/kegg/genomes/hsa/hsa_pfam.list +4 -0
 - data/test/data/kegg/ligand/mol/C00147.mol +26 -0
 - data/test/data/kegg/ligand/reaction +14 -0
 - data/test/data/kegg/ligand/reaction.lst +1 -0
 - data/test/data/kegg/ligand/reaction_mapformula.lst +3 -0
 - data/test/data/reaction +14 -0
 - data/test/data/reaction.lst +1 -0
 - data/test/data/reaction_mapformula.lst +3 -0
 - data/test/data/rxn/C00001.mol +6 -0
 - data/test/data/rxn/C00011.mol +10 -0
 - data/test/data/rxn/C00014.mol +6 -0
 - data/test/data/rxn/C01010.mol +18 -0
 - data/test/data/rxn/sample.rxn +50 -0
 - data/test/data/rxn/substitution.rxn +45 -0
 - data/test/data/test.eps +0 -0
 - data/test/data/test.mol +28 -0
 - data/test/data/test.sdf +143 -0
 - data/test/data/test.skc +0 -0
 - data/test/data/test.xyz +4 -0
 - data/test/data/test_lf.sdf +143 -0
 - data/test/heavy_test_pubchem.rb +16 -0
 - data/test/multiple_test.rb +22 -0
 - data/test/test_adj.rb +54 -0
 - data/test/test_canonical_smiles.rb +46 -0
 - data/test/test_cdx.rb +32 -0
 - data/test/test_chem.rb +18 -0
 - data/test/test_cluster.rb +19 -0
 - data/test/test_db.rb +11 -0
 - data/test/test_eps.rb +24 -0
 - data/test/test_geometry.rb +11 -0
 - data/test/test_gspan.rb +28 -0
 - data/test/test_iupac.rb +36 -0
 - data/test/test_kcf.rb +24 -0
 - data/test/test_kcf_glycan.rb +10 -0
 - data/test/test_kegg.rb +118 -0
 - data/test/test_linucs.rb +21 -0
 - data/test/test_mdl.rb +45 -0
 - data/test/test_mol2.rb +62 -0
 - data/test/test_morgan.rb +21 -0
 - data/test/test_pdf.rb +12 -0
 - data/test/test_prop.rb +86 -0
 - data/test/test_rmagick.rb +15 -0
 - data/test/test_sbdb.rb +23 -0
 - data/test/test_sdf.rb +30 -0
 - data/test/test_smiles.rb +84 -0
 - data/test/test_sssr.rb +18 -0
 - data/test/test_sub.rb +47 -0
 - data/test/test_subcomp.rb +37 -0
 - data/test/test_traverse.rb +29 -0
 - data/test/test_writer.rb +13 -0
 - data/test/test_xyz.rb +15 -0
 - data/test/type_test.rb +25 -0
 - metadata +290 -0
 
    
        data/lib/chem/db/eps.rb
    ADDED
    
    | 
         @@ -0,0 +1,164 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Encapsulated Postscript writer.
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Chem
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              module Molecule
         
     | 
| 
      
 6 
     | 
    
         
            +
                
         
     | 
| 
      
 7 
     | 
    
         
            +
                EpsHeader = "%%!PS-Adobe-3.0 EPSF-3.0\n" +
         
     | 
| 
      
 8 
     | 
    
         
            +
                  "%%Creator: ChemRuby n.tanaka\n" + 
         
     | 
| 
      
 9 
     | 
    
         
            +
                  "%%For: Scientists\n" +
         
     | 
| 
      
 10 
     | 
    
         
            +
                  "%%Title: Molecular compound\n" +
         
     | 
| 
      
 11 
     | 
    
         
            +
                  "%%CreationDate: %d/%d/%d %d:%d \n"
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def to_eps(para = EpsParameter.new)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # What should I do to ensure 2D features?
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  str = ''
         
     | 
| 
      
 17 
     | 
    
         
            +
                  if block_given?
         
     | 
| 
      
 18 
     | 
    
         
            +
                    yield para
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  ratio, min = para.calc_bounding_box_size(@nodes)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  str = header(para)
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  pos = {}
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  @nodes.each do |atom|
         
     | 
| 
      
 28 
     | 
    
         
            +
                    pos[atom] = Vector[atom.x, atom.y]
         
     | 
| 
      
 29 
     | 
    
         
            +
                    pos[atom] -= min
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    #diff = diff == 0 ? 1 : diff
         
     | 
| 
      
 32 
     | 
    
         
            +
                    pos[atom] *= para.diff * 100
         
     | 
| 
      
 33 
     | 
    
         
            +
                    pos[atom] += para.orig_pt + Vector[para.margin, para.margin] + ratio * 0.5
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            #         if para.has_atom_yield
         
     | 
| 
      
 36 
     | 
    
         
            +
            #           str += eps.atom_yield.call(atom)
         
     | 
| 
      
 37 
     | 
    
         
            +
            #         end
         
     | 
| 
      
 38 
     | 
    
         
            +
            #        str += atom.eps_header if atom.eps_header
         
     | 
| 
      
 39 
     | 
    
         
            +
            #        if(atom.visible)
         
     | 
| 
      
 40 
     | 
    
         
            +
                      str += "%5f %5f moveto\n" % [pos[atom][0], pos[atom][1]]
         
     | 
| 
      
 41 
     | 
    
         
            +
                      str += "(" + atom.element.to_s + ") dup stringwidth pop 2 div neg -1.5 rmoveto show\n"
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            #        end
         
     | 
| 
      
 44 
     | 
    
         
            +
            #        str += atom.eps_footer if atom.eps_footer
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
            #      @nodes.each do ||
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  @edges.each do |bond, atom1, atom2|
         
     | 
| 
      
 49 
     | 
    
         
            +
                    #str += bond.eps_header if bond.eps_header
         
     | 
| 
      
 50 
     | 
    
         
            +
                    beginX = pos[atom1][0]
         
     | 
| 
      
 51 
     | 
    
         
            +
                    beginY = pos[atom1][1]
         
     | 
| 
      
 52 
     | 
    
         
            +
                    endX   = pos[atom2][0]
         
     | 
| 
      
 53 
     | 
    
         
            +
                    endY   = pos[atom2][1]
         
     | 
| 
      
 54 
     | 
    
         
            +
                    dx = (endX - beginX) / ((endX - beginX)**2 + (endY - beginY)**2)**0.5
         
     | 
| 
      
 55 
     | 
    
         
            +
                    dx = dx.nan? ? 0 : dx / 2.0
         
     | 
| 
      
 56 
     | 
    
         
            +
                    dy = (endY - beginY) / ((endX - beginX)**2 + (endY - beginY)**2)**0.5
         
     | 
| 
      
 57 
     | 
    
         
            +
                    dy = dy.nan? ? 0 : dy / 2.0
         
     | 
| 
      
 58 
     | 
    
         
            +
                    if(atom2.visible)
         
     | 
| 
      
 59 
     | 
    
         
            +
                      endX = endX - char_height * dx
         
     | 
| 
      
 60 
     | 
    
         
            +
                      endY = endY - char_height * dy
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
                    if(atom1.visible)
         
     | 
| 
      
 63 
     | 
    
         
            +
                      beginX = beginX + char_size * dx
         
     | 
| 
      
 64 
     | 
    
         
            +
                      beginY = beginY + char_size * dy
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
                    transition = bond.respond_to?('i') ? bond.i : 0
         
     | 
| 
      
 67 
     | 
    
         
            +
                    multi_bond_ratio = 1.0
         
     | 
| 
      
 68 
     | 
    
         
            +
                    beginX = beginX - dy * (bond.v - 1 + transition.abs) * multi_bond_ratio
         
     | 
| 
      
 69 
     | 
    
         
            +
                    beginY = beginY + dx * (bond.v - 1 + transition.abs) * multi_bond_ratio
         
     | 
| 
      
 70 
     | 
    
         
            +
                    endX   = endX   - dy * (bond.v - 1 + transition.abs) * multi_bond_ratio
         
     | 
| 
      
 71 
     | 
    
         
            +
                    endY   = endY   + dx * (bond.v - 1 + transition.abs) * multi_bond_ratio
         
     | 
| 
      
 72 
     | 
    
         
            +
                    valence = bond.v
         
     | 
| 
      
 73 
     | 
    
         
            +
            #        1.upto(bond.v + transition.abs) do |n|
         
     | 
| 
      
 74 
     | 
    
         
            +
                    (bond.v + transition.abs).times do |n|
         
     | 
| 
      
 75 
     | 
    
         
            +
            #           if(color)
         
     | 
| 
      
 76 
     | 
    
         
            +
            #             if(transition < 0)
         
     | 
| 
      
 77 
     | 
    
         
            +
            #               str += "1 0 0 setrgbcolor\n"
         
     | 
| 
      
 78 
     | 
    
         
            +
            #             elsif(transition > 0)
         
     | 
| 
      
 79 
     | 
    
         
            +
            #               str += "0 0 1 setrgbcolor\n"
         
     | 
| 
      
 80 
     | 
    
         
            +
            #             else
         
     | 
| 
      
 81 
     | 
    
         
            +
            #               str += "0 0 0 setrgbcolor\n"
         
     | 
| 
      
 82 
     | 
    
         
            +
            #             end
         
     | 
| 
      
 83 
     | 
    
         
            +
            #           end
         
     | 
| 
      
 84 
     | 
    
         
            +
                      str += "newpath %f %f moveto %f %f lineto stroke\n" % [beginX, beginY, endX, endY]
         
     | 
| 
      
 85 
     | 
    
         
            +
                      centerX = (endX + beginX) /2
         
     | 
| 
      
 86 
     | 
    
         
            +
                      centerY = (endY + beginY) /2
         
     | 
| 
      
 87 
     | 
    
         
            +
                            if(transition >0)
         
     | 
| 
      
 88 
     | 
    
         
            +
                              str += centerX.to_s + " " + centerY.to_s + " " + inbond.to_s + " 0 360 arc stroke\n"
         
     | 
| 
      
 89 
     | 
    
         
            +
                    elsif(transition <0)
         
     | 
| 
      
 90 
     | 
    
         
            +
                      str += "newpath %f %f moveto %f %f lineto stroke\n" %
         
     | 
| 
      
 91 
     | 
    
         
            +
                             [centerX + dy - dx*outbond, centerY - dx - outbond * dy,
         
     | 
| 
      
 92 
     | 
    
         
            +
                              centerX - dy - outbond * dx, dx - outbond * dy + centerY]
         
     | 
| 
      
 93 
     | 
    
         
            +
                      str += "newpath %f %f moveto %f %f lineto stroke\n" %
         
     | 
| 
      
 94 
     | 
    
         
            +
                             [centerX + dy + dx*outbond, centerY - dx + outbond * dy, 
         
     | 
| 
      
 95 
     | 
    
         
            +
                              centerX - dy + outbond * dx, dy * outbond + dx + centerY]
         
     | 
| 
      
 96 
     | 
    
         
            +
                    end
         
     | 
| 
      
 97 
     | 
    
         
            +
                    transition = transition + 1 if(transition < 0)
         
     | 
| 
      
 98 
     | 
    
         
            +
                    transition = transition - 1 if(transition > 0)
         
     | 
| 
      
 99 
     | 
    
         
            +
                    valence = valence - 1
         
     | 
| 
      
 100 
     | 
    
         
            +
                    beginX = beginX + dy  * multi_bond_ratio * 2
         
     | 
| 
      
 101 
     | 
    
         
            +
                    beginY = beginY - dx  * multi_bond_ratio * 2
         
     | 
| 
      
 102 
     | 
    
         
            +
                    endX   = endX   + dy  * multi_bond_ratio * 2
         
     | 
| 
      
 103 
     | 
    
         
            +
                    endY   = endY   - dx  * multi_bond_ratio * 2
         
     | 
| 
      
 104 
     | 
    
         
            +
                    end
         
     | 
| 
      
 105 
     | 
    
         
            +
                  end
         
     | 
| 
      
 106 
     | 
    
         
            +
            #      str += "0 0 0 setrgbcolor\n"
         
     | 
| 
      
 107 
     | 
    
         
            +
                  #      str += " #{@size / 2.0} #{@size / 2.0} #{@size / 2.0 + @margin} 0 360 arc stroke\n"
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
                  #open("test.eps", "w").puts str
         
     | 
| 
      
 110 
     | 
    
         
            +
                  str
         
     | 
| 
      
 111 
     | 
    
         
            +
                end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
                private 
         
     | 
| 
      
 114 
     | 
    
         
            +
                def header para
         
     | 
| 
      
 115 
     | 
    
         
            +
                  now = Time.new
         
     | 
| 
      
 116 
     | 
    
         
            +
                  str = EpsHeader % [now.day, now.month, now.year, now.hour, now.min]
         
     | 
| 
      
 117 
     | 
    
         
            +
            #      str += "%%%%BoundingBox: %d %d %d %d\n" % [@orig_pt[0], @orig_pt[1], @orig_pt[0] + @width, @orig_pt[1] + @height]
         
     | 
| 
      
 118 
     | 
    
         
            +
                  str += "/Arial findfont 5 scalefont setfont\n"
         
     | 
| 
      
 119 
     | 
    
         
            +
            #      str += "#{@line_width} setlinewidth\n"
         
     | 
| 
      
 120 
     | 
    
         
            +
                  str
         
     | 
| 
      
 121 
     | 
    
         
            +
                end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                class EpsParameter
         
     | 
| 
      
 124 
     | 
    
         
            +
                  attr_accessor :width, :height, :min, :x_max, :y_max, :fit_box, :diff, :orig_pt,:margin
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                  def initialize
         
     | 
| 
      
 127 
     | 
    
         
            +
                    @size = Vector[100.0, 100.0]
         
     | 
| 
      
 128 
     | 
    
         
            +
                    @diff = 1.0
         
     | 
| 
      
 129 
     | 
    
         
            +
                    @orig_pt = Vector[0.0, 0.0]
         
     | 
| 
      
 130 
     | 
    
         
            +
                    @margin = 10.0
         
     | 
| 
      
 131 
     | 
    
         
            +
                  end
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
                  def calc_bounding_box_size nodes
         
     | 
| 
      
 134 
     | 
    
         
            +
                    # Shocking code :P
         
     | 
| 
      
 135 
     | 
    
         
            +
                    min = Vector[ 1.0 / 0,  1.0 / 0]
         
     | 
| 
      
 136 
     | 
    
         
            +
                    max = Vector[-1.0 / 0, -1.0 / 0]
         
     | 
| 
      
 137 
     | 
    
         
            +
                    nodes.each do |atom|
         
     | 
| 
      
 138 
     | 
    
         
            +
                      min[0] = min[0] > atom.x ? atom.x : min[0]
         
     | 
| 
      
 139 
     | 
    
         
            +
                      max[0] = max[0] < atom.x ? atom.x : max[0]
         
     | 
| 
      
 140 
     | 
    
         
            +
                      min[1] = min[1] > atom.y ? atom.y : min[1]
         
     | 
| 
      
 141 
     | 
    
         
            +
                      max[1] = max[1] < atom.y ? atom.y : max[1]
         
     | 
| 
      
 142 
     | 
    
         
            +
                    end
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
                    diff = 1.0
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
                    ratio = Vector[1.0, 1.0]
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                    if @fit_box
         
     | 
| 
      
 149 
     | 
    
         
            +
                      if ((max[0] - min[0]) / (max[1] - min[1])) >
         
     | 
| 
      
 150 
     | 
    
         
            +
                          (@size[0]  - @margin * 2)/ (@size[1] - @margin * 2)
         
     | 
| 
      
 151 
     | 
    
         
            +
                        diff = (@size[0] - @margin * 2) / (max[0] - min[0])
         
     | 
| 
      
 152 
     | 
    
         
            +
                        ratio[1] = @size[1] - @margin * 2 - (max[1] - min[1]) * diff
         
     | 
| 
      
 153 
     | 
    
         
            +
                      else
         
     | 
| 
      
 154 
     | 
    
         
            +
                        diff = (@size[1] - @margin * 2) / (max[1] - min[1])
         
     | 
| 
      
 155 
     | 
    
         
            +
                        ratio[0] = @size[0] - @margin * 2 - (max[0] - min[1]) * diff
         
     | 
| 
      
 156 
     | 
    
         
            +
                      end
         
     | 
| 
      
 157 
     | 
    
         
            +
                    end
         
     | 
| 
      
 158 
     | 
    
         
            +
                    [ratio, min]
         
     | 
| 
      
 159 
     | 
    
         
            +
                  end
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                end
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
              end
         
     | 
| 
      
 164 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/chem/db/g98.rb
    ADDED
    
    | 
         @@ -0,0 +1,909 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Gaussian98 parser
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Chem
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              module G98
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              class Lines
         
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize lines_array
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @lines = lines_array
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @line_ptr = 0
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
                def next_line
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @lines[@line_ptr + 1]
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
                def proceed num = 1
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @line_ptr = @line_ptr + num
         
     | 
| 
      
 17 
     | 
    
         
            +
                  raise if @line_ptr > @lines.length
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
                def now
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @lines[@line_ptr]
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
                def eof?
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @lines.length == @line_ptr
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              class Link
         
     | 
| 
      
 28 
     | 
    
         
            +
                attr_accessor :next_link, :jump_link, :stop
         
     | 
| 
      
 29 
     | 
    
         
            +
                attr_reader :major_number, :minor_number, :parameters, :default_link, :goto
         
     | 
| 
      
 30 
     | 
    
         
            +
                def initialize major, minor, parameters, goto, gr
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @major_number = major
         
     | 
| 
      
 32 
     | 
    
         
            +
                  @minor_number = minor
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @parameters = parameters
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @goto = goto
         
     | 
| 
      
 35 
     | 
    
         
            +
                  @gaussian_result = gr
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
                def default_link=(l)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  @default_link = l
         
     | 
| 
      
 39 
     | 
    
         
            +
                  @next_link = l
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 42 
     | 
    
         
            +
                  sprintf("%2d%02d %2s ", @major_number, @minor_number, @goto.to_s) + parameter_to_s
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
                def parameter_to_s
         
     | 
| 
      
 45 
     | 
    
         
            +
                  s = ''
         
     | 
| 
      
 46 
     | 
    
         
            +
                  @parameters.each do |key, value|
         
     | 
| 
      
 47 
     | 
    
         
            +
                    s = s + key.to_s + '(' + value.to_s + ') '
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
                  return s
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
                def process lines
         
     | 
| 
      
 52 
     | 
    
         
            +
                  case (@major_number * 100 + @minor_number)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  when 101 # Initializes program and controls overlaying
         
     | 
| 
      
 54 
     | 
    
         
            +
                    lines.proceed 3
         
     | 
| 
      
 55 
     | 
    
         
            +
                    n_atoms = 0
         
     | 
| 
      
 56 
     | 
    
         
            +
                    @gaussian_result.atoms = atoms = Hash.new
         
     | 
| 
      
 57 
     | 
    
         
            +
                    if lines.next_line.split.length < 2 # Z-Matrix
         
     | 
| 
      
 58 
     | 
    
         
            +
                      @gaussian_result.has_z_matrix_coordinate = true
         
     | 
| 
      
 59 
     | 
    
         
            +
                      var = Hash.new
         
     | 
| 
      
 60 
     | 
    
         
            +
                      atoms_tmp = Array.new
         
     | 
| 
      
 61 
     | 
    
         
            +
                      while /^ \w+/ =~ lines.next_line
         
     | 
| 
      
 62 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 63 
     | 
    
         
            +
                        atoms_tmp.push lines.now
         
     | 
| 
      
 64 
     | 
    
         
            +
                        n_atoms = n_atoms + 1 if lines.now.split[0] != 'X'
         
     | 
| 
      
 65 
     | 
    
         
            +
                      end
         
     | 
| 
      
 66 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 67 
     | 
    
         
            +
                      if /Variables:/ =~ lines.now
         
     | 
| 
      
 68 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 69 
     | 
    
         
            +
                        while /^  \w+/ =~ lines.now
         
     | 
| 
      
 70 
     | 
    
         
            +
                          sp = lines.now.split
         
     | 
| 
      
 71 
     | 
    
         
            +
                          var[sp[0]] = sp[1].to_f
         
     | 
| 
      
 72 
     | 
    
         
            +
                          lines.proceed
         
     | 
| 
      
 73 
     | 
    
         
            +
                        end
         
     | 
| 
      
 74 
     | 
    
         
            +
                      end
         
     | 
| 
      
 75 
     | 
    
         
            +
                      n = 1
         
     | 
| 
      
 76 
     | 
    
         
            +
                      atoms_tmp.each do |atom_line|
         
     | 
| 
      
 77 
     | 
    
         
            +
                        atom = G98Atom.new n_atoms, @gaussian_result
         
     | 
| 
      
 78 
     | 
    
         
            +
                        atom_array = atom_line.split
         
     | 
| 
      
 79 
     | 
    
         
            +
                        atom.element = atom_array[0]
         
     | 
| 
      
 80 
     | 
    
         
            +
                        if atom_array.length >= 2
         
     | 
| 
      
 81 
     | 
    
         
            +
                          if /\d/ !~ atom_array[2]
         
     | 
| 
      
 82 
     | 
    
         
            +
                            length = var[atom_array[2]]
         
     | 
| 
      
 83 
     | 
    
         
            +
                          else
         
     | 
| 
      
 84 
     | 
    
         
            +
                            length = atom_array[2].to_f
         
     | 
| 
      
 85 
     | 
    
         
            +
                          end
         
     | 
| 
      
 86 
     | 
    
         
            +
                          atom.distance(atoms[atom_array[1].to_i], length)
         
     | 
| 
      
 87 
     | 
    
         
            +
                        end
         
     | 
| 
      
 88 
     | 
    
         
            +
                        if atom_array.length >= 4
         
     | 
| 
      
 89 
     | 
    
         
            +
                          if /\d/ !~ atom_array[4]
         
     | 
| 
      
 90 
     | 
    
         
            +
                            angle = var[atom_array[4]]
         
     | 
| 
      
 91 
     | 
    
         
            +
                          else
         
     | 
| 
      
 92 
     | 
    
         
            +
                            angle = atom_array[4].to_f
         
     | 
| 
      
 93 
     | 
    
         
            +
                          end
         
     | 
| 
      
 94 
     | 
    
         
            +
                          atom.angle(atoms[atom_array[3].to_i], angle)
         
     | 
| 
      
 95 
     | 
    
         
            +
                        end
         
     | 
| 
      
 96 
     | 
    
         
            +
                        if atom_array.length >= 7
         
     | 
| 
      
 97 
     | 
    
         
            +
                          if /\d/ !~ atom_array[6]
         
     | 
| 
      
 98 
     | 
    
         
            +
                            angle_a = var[atom_array[6]]
         
     | 
| 
      
 99 
     | 
    
         
            +
                          else
         
     | 
| 
      
 100 
     | 
    
         
            +
                            angle_a = atom_array[6].to_f
         
     | 
| 
      
 101 
     | 
    
         
            +
                          end
         
     | 
| 
      
 102 
     | 
    
         
            +
                          if /\d/ !~ atom_array[7]
         
     | 
| 
      
 103 
     | 
    
         
            +
                            angle_b = var[atom_array[7]]
         
     | 
| 
      
 104 
     | 
    
         
            +
                          else
         
     | 
| 
      
 105 
     | 
    
         
            +
                            angle_b = atom_array[7].to_f
         
     | 
| 
      
 106 
     | 
    
         
            +
                          end
         
     | 
| 
      
 107 
     | 
    
         
            +
                          atom.dihedral(atoms[atom_array[5].to_i], angle_a, angle_b)
         
     | 
| 
      
 108 
     | 
    
         
            +
                        end
         
     | 
| 
      
 109 
     | 
    
         
            +
                        atoms[n] = atom
         
     | 
| 
      
 110 
     | 
    
         
            +
                        n = n + 1
         
     | 
| 
      
 111 
     | 
    
         
            +
                      end
         
     | 
| 
      
 112 
     | 
    
         
            +
                    else # Cartessian Matrix
         
     | 
| 
      
 113 
     | 
    
         
            +
                      @gaussian_result.has_cartessian_coordinate = true
         
     | 
| 
      
 114 
     | 
    
         
            +
                      while /^ \w+/ =~ lines.next_line && / The following ModRedundant/ !~ lines.next_line
         
     | 
| 
      
 115 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 116 
     | 
    
         
            +
                        atom_array = lines.now.split
         
     | 
| 
      
 117 
     | 
    
         
            +
                        atom = G98Atom.new n_atoms + 1, @gaussian_result
         
     | 
| 
      
 118 
     | 
    
         
            +
                        atom.element, atom.x, atom.y, atom.z = atom_array
         
     | 
| 
      
 119 
     | 
    
         
            +
                        atoms[n_atoms + 1] = atom
         
     | 
| 
      
 120 
     | 
    
         
            +
                        n_atoms = n_atoms + 1 if lines.now.split[0] != 'X'
         
     | 
| 
      
 121 
     | 
    
         
            +
                      end
         
     | 
| 
      
 122 
     | 
    
         
            +
                    end
         
     | 
| 
      
 123 
     | 
    
         
            +
                    @gaussian_result.n_atoms = n_atoms
         
     | 
| 
      
 124 
     | 
    
         
            +
                    @gaussian_result.atoms = atoms
         
     | 
| 
      
 125 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 126 
     | 
    
         
            +
                    #      @stop = true
         
     | 
| 
      
 127 
     | 
    
         
            +
                  when 103 # Berny optimization to minima and TS, STQN transition state searches
         
     | 
| 
      
 128 
     | 
    
         
            +
                    @next_link = @jump_link if @jump_link
         
     | 
| 
      
 129 
     | 
    
         
            +
                    lines.proceed 2
         
     | 
| 
      
 130 
     | 
    
         
            +
                    while /GradGradGrad/ !~ lines.now
         
     | 
| 
      
 131 
     | 
    
         
            +
                      if(/ Optimization completed./ =~ lines.now)
         
     | 
| 
      
 132 
     | 
    
         
            +
                        #  	if(/ Predicted change in Energy=/ =~ lines.now && / Optimization completed./ =~ lines.next_line)
         
     | 
| 
      
 133 
     | 
    
         
            +
                        @next_link = @default_link
         
     | 
| 
      
 134 
     | 
    
         
            +
                      end
         
     | 
| 
      
 135 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 136 
     | 
    
         
            +
                    end
         
     | 
| 
      
 137 
     | 
    
         
            +
                    #        lines.proceed 2
         
     | 
| 
      
 138 
     | 
    
         
            +
                    #        lines.proceed while / Predicted change in Energy=/ !~ lines.now
         
     | 
| 
      
 139 
     | 
    
         
            +
                    #        puts lines.now
         
     | 
| 
      
 140 
     | 
    
         
            +
                    #        is_loop = true if / Optimization completed./ =~ lines.now
         
     | 
| 
      
 141 
     | 
    
         
            +
                    #  #        lines.proceed while /^ Predicted change in Energy=/ !~ lines.now
         
     | 
| 
      
 142 
     | 
    
         
            +
                    #  #        lines.proceed
         
     | 
| 
      
 143 
     | 
    
         
            +
                    #  #        is_loop = true if / Optimization completed./ =~ lines.now
         
     | 
| 
      
 144 
     | 
    
         
            +
                    #        lines.proceed while /GradGradGrad/ !~ lines.now
         
     | 
| 
      
 145 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 146 
     | 
    
         
            +
                  when 105 # MS optimization
         
     | 
| 
      
 147 
     | 
    
         
            +
                  when 106 # Numerical differentiation of forces/dipoles to obtain polarizability/hyperpolarizability
         
     | 
| 
      
 148 
     | 
    
         
            +
                  when 107 # Linear-synchronous-transit (LST) transition state search
         
     | 
| 
      
 149 
     | 
    
         
            +
                  when 108 # Potential energy surface scan
         
     | 
| 
      
 150 
     | 
    
         
            +
                  when 109 # Newton-Raphson optimization
         
     | 
| 
      
 151 
     | 
    
         
            +
                  when 110 # Double numerical differentiation of energies to produce frequencies
         
     | 
| 
      
 152 
     | 
    
         
            +
                  when 111 # Double num. diff. of energies to compute polarizabilities & hyperpolarizabilities
         
     | 
| 
      
 153 
     | 
    
         
            +
                  when 113 # EF optimization using analytic gradients
         
     | 
| 
      
 154 
     | 
    
         
            +
                  when 114 # EF numerical optimization (using only energies)
         
     | 
| 
      
 155 
     | 
    
         
            +
                  when 115 # Follows reaction path using the intrinsic reaction coordinate (IRC)
         
     | 
| 
      
 156 
     | 
    
         
            +
                  when 116 # Numerical self-consistent reaction field (SCRF)
         
     | 
| 
      
 157 
     | 
    
         
            +
                  when 117 # Post-SCF SCRF
         
     | 
| 
      
 158 
     | 
    
         
            +
                  when 118 # Trajectory calculations
         
     | 
| 
      
 159 
     | 
    
         
            +
                  when 120 # Controls ONIOM calculations
         
     | 
| 
      
 160 
     | 
    
         
            +
                  when 202 # Reorients coordinates, calculates symmetry, and checks variable
         
     | 
| 
      
 161 
     | 
    
         
            +
                    # IOp(15) : Symmetry control.
         
     | 
| 
      
 162 
     | 
    
         
            +
                    # 1: Unconditionally turn symmetry off. Note that Symm is still called, and will determine the
         
     | 
| 
      
 163 
     | 
    
         
            +
                    #    framework group. However, the molecule is not oriented.
         
     | 
| 
      
 164 
     | 
    
         
            +
                    while / Stoichiometry/ !~ lines.now && /Error/ !~ lines.now
         
     | 
| 
      
 165 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 166 
     | 
    
         
            +
                    end
         
     | 
| 
      
 167 
     | 
    
         
            +
                    if /Error/ =~ lines.now
         
     | 
| 
      
 168 
     | 
    
         
            +
                      lines.proceed 6
         
     | 
| 
      
 169 
     | 
    
         
            +
                      return
         
     | 
| 
      
 170 
     | 
    
         
            +
                    end
         
     | 
| 
      
 171 
     | 
    
         
            +
                    @gaussian_result.stoichiometry = lines.now.split[1]
         
     | 
| 
      
 172 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 173 
     | 
    
         
            +
                    @gaussian_result.symmetricity = lines.now.split[2]
         
     | 
| 
      
 174 
     | 
    
         
            +
                    if /KH/ !~ @gaussian_result.symmetricity
         
     | 
| 
      
 175 
     | 
    
         
            +
                      unless @parameters.has_key?(15) && @parameters[15] == 1
         
     | 
| 
      
 176 
     | 
    
         
            +
                        lines.proceed while /Standard orientation:/ !~ lines.now
         
     | 
| 
      
 177 
     | 
    
         
            +
                        lines.proceed 5
         
     | 
| 
      
 178 
     | 
    
         
            +
                        1.upto @gaussian_result.n_atoms do |num|
         
     | 
| 
      
 179 
     | 
    
         
            +
                          o_array = lines.now.split
         
     | 
| 
      
 180 
     | 
    
         
            +
                          @gaussian_result.atoms[o_array[0].to_i].x = o_array[3].to_f
         
     | 
| 
      
 181 
     | 
    
         
            +
                          @gaussian_result.atoms[o_array[0].to_i].y = o_array[4].to_f
         
     | 
| 
      
 182 
     | 
    
         
            +
                          @gaussian_result.atoms[o_array[0].to_i].z = o_array[5].to_f
         
     | 
| 
      
 183 
     | 
    
         
            +
                          lines.proceed
         
     | 
| 
      
 184 
     | 
    
         
            +
                        end
         
     | 
| 
      
 185 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 186 
     | 
    
         
            +
                      end
         
     | 
| 
      
 187 
     | 
    
         
            +
                      while(/^ Isotopes:/ !~ lines.now)
         
     | 
| 
      
 188 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 189 
     | 
    
         
            +
                      end
         
     | 
| 
      
 190 
     | 
    
         
            +
                      while /-$/ =~ lines.now || /,\D+-\d/ =~ lines.next_line
         
     | 
| 
      
 191 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 192 
     | 
    
         
            +
                      end
         
     | 
| 
      
 193 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 194 
     | 
    
         
            +
                    else
         
     | 
| 
      
 195 
     | 
    
         
            +
                      lines.proceed 3
         
     | 
| 
      
 196 
     | 
    
         
            +
                    end
         
     | 
| 
      
 197 
     | 
    
         
            +
                  when 301 # Generate basis set information
         
     | 
| 
      
 198 
     | 
    
         
            +
                    @gaussian_result.standard_basis = lines.now.split(':')[1].chop # Standard basis: VSTO-3G (5D, 7F)
         
     | 
| 
      
 199 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 200 
     | 
    
         
            +
                    if / Basis set in the form of general basis input:/ =~ lines.now # with GFINPUT Keyword (24=10)
         
     | 
| 
      
 201 
     | 
    
         
            +
                      while /^$/ !~ lines.next_line
         
     | 
| 
      
 202 
     | 
    
         
            +
                        lines.proceed #  1 0
         
     | 
| 
      
 203 
     | 
    
         
            +
                      end
         
     | 
| 
      
 204 
     | 
    
         
            +
                      lines.proceed 2#^$
         
     | 
| 
      
 205 
     | 
    
         
            +
                    end
         
     | 
| 
      
 206 
     | 
    
         
            +
                    while / There are/ =~ lines.now
         
     | 
| 
      
 207 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 208 
     | 
    
         
            +
                    end
         
     | 
| 
      
 209 
     | 
    
         
            +
                    lines.proceed while /\d+ basis functions/ !~ lines.now
         
     | 
| 
      
 210 
     | 
    
         
            +
                    @gaussian_result.n_orbitals = lines.now.split[0].to_i
         
     | 
| 
      
 211 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 212 
     | 
    
         
            +
                    @gaussian_result.n_electron = lines.now.split[0].to_i
         
     | 
| 
      
 213 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 214 
     | 
    
         
            +
                    @gaussian_result.nuclear_repulsion_energy = lines.now.split[3].to_f
         
     | 
| 
      
 215 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 216 
     | 
    
         
            +
                  when 302 # Calculates overlap, kinetic, and potential integrals
         
     | 
| 
      
 217 
     | 
    
         
            +
                    lines.proceed 3 # No discrimination between 302 and 303. More Gaussian results needed!
         
     | 
| 
      
 218 
     | 
    
         
            +
                  when 303 # Calculates multipole integrals
         
     | 
| 
      
 219 
     | 
    
         
            +
                    ;
         
     | 
| 
      
 220 
     | 
    
         
            +
                  when 308 # Computes dipole velocity and RxD integrals
         
     | 
| 
      
 221 
     | 
    
         
            +
                  when 309 # Computes ECP integrals
         
     | 
| 
      
 222 
     | 
    
         
            +
                  when 310 # Computes spdf 2-electron integrals in a primitive fashion
         
     | 
| 
      
 223 
     | 
    
         
            +
                  when 311 # Computes sp 2-electron integrals
         
     | 
| 
      
 224 
     | 
    
         
            +
                  when 314 # Computes spdf 2-electron integrals
         
     | 
| 
      
 225 
     | 
    
         
            +
                  when 316 # Prints 2-electron integrals
         
     | 
| 
      
 226 
     | 
    
         
            +
                  when 319 # Computes 1-electron integrals for approximate spin orbital coupling
         
     | 
| 
      
 227 
     | 
    
         
            +
                  when 401 # Forms the initial MO guess
         
     | 
| 
      
 228 
     | 
    
         
            +
                    @gaussian_result.guess = lines.now.chop if @gaussian_result.guess == nil# Projected INDO Guess.
         
     | 
| 
      
 229 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 230 
     | 
    
         
            +
                    if / Initial guess orbital symmetries:/ =~ lines.now
         
     | 
| 
      
 231 
     | 
    
         
            +
                      lines.proceed 2
         
     | 
| 
      
 232 
     | 
    
         
            +
                      while /\(A.\)/ =~ lines.now
         
     | 
| 
      
 233 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 234 
     | 
    
         
            +
                      end
         
     | 
| 
      
 235 
     | 
    
         
            +
                    end
         
     | 
| 
      
 236 
     | 
    
         
            +
                  when 402 # Performs semi-empirical and molecular mechanics calculations
         
     | 
| 
      
 237 
     | 
    
         
            +
                    while / Dipole moment=/ !~ lines.now
         
     | 
| 
      
 238 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 239 
     | 
    
         
            +
                    end
         
     | 
| 
      
 240 
     | 
    
         
            +
                    lines.now.split[4].to_f# Assertive Programming
         
     | 
| 
      
 241 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 242 
     | 
    
         
            +
                  when 405 # Initializes an MCSCF calculation
         
     | 
| 
      
 243 
     | 
    
         
            +
                  when 502 # Iteratively solves the SCF equations (conven. UHF & ROHF, all direct methods, SCRF)
         
     | 
| 
      
 244 
     | 
    
         
            +
                    lines.proceed while / SCF Done:/ !~ lines.now
         
     | 
| 
      
 245 
     | 
    
         
            +
                    @gaussian_result.energy = lines.now.split[4].to_f
         
     | 
| 
      
 246 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 247 
     | 
    
         
            +
                    lines.now.split[5].to_f
         
     | 
| 
      
 248 
     | 
    
         
            +
                    lines.proceed 2
         
     | 
| 
      
 249 
     | 
    
         
            +
                    #      lines.proceed if / Axes restored/ =~ lines.now
         
     | 
| 
      
 250 
     | 
    
         
            +
                    if / Annihilation of the first spin contaminant:/ =~ lines.now
         
     | 
| 
      
 251 
     | 
    
         
            +
                      lines.proceed 2
         
     | 
| 
      
 252 
     | 
    
         
            +
                    end
         
     | 
| 
      
 253 
     | 
    
         
            +
                    if / Final SCRF E-Field is:/ =~ lines.now
         
     | 
| 
      
 254 
     | 
    
         
            +
                      lines.proceed 15
         
     | 
| 
      
 255 
     | 
    
         
            +
                    end
         
     | 
| 
      
 256 
     | 
    
         
            +
                    if /---------/ =~ lines.now && /DeltaG/ =~ lines.next_line
         
     | 
| 
      
 257 
     | 
    
         
            +
                      #      if /---------/ =~ lines.now
         
     | 
| 
      
 258 
     | 
    
         
            +
                      while /DeltaG/ !~ lines.now
         
     | 
| 
      
 259 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 260 
     | 
    
         
            +
                      end
         
     | 
| 
      
 261 
     | 
    
         
            +
                      @gaussian_result.scrf_delta_g = lines.now.split[4].to_f
         
     | 
| 
      
 262 
     | 
    
         
            +
                      lines.proceed 2
         
     | 
| 
      
 263 
     | 
    
         
            +
                    end
         
     | 
| 
      
 264 
     | 
    
         
            +
                    #        lines.proceed
         
     | 
| 
      
 265 
     | 
    
         
            +
                  when 503 # Iteratively solves the SCF equations using direct minimization
         
     | 
| 
      
 266 
     | 
    
         
            +
                  when 506 # Performs an ROHF or GVB-PP calculation
         
     | 
| 
      
 267 
     | 
    
         
            +
                  when 508 # Quadratically convergent SCF program
         
     | 
| 
      
 268 
     | 
    
         
            +
                  when 510 # MC-SCF
         
     | 
| 
      
 269 
     | 
    
         
            +
                  when 601 # Population and related analyses (including multipole moments)
         
     | 
| 
      
 270 
     | 
    
         
            +
                    #        puts 'l601 : '+ lines.now
         
     | 
| 
      
 271 
     | 
    
         
            +
                    #        lines.proceed
         
     | 
| 
      
 272 
     | 
    
         
            +
                    #        puts 'l601 : '+ lines.now
         
     | 
| 
      
 273 
     | 
    
         
            +
                    #        lines.proceed
         
     | 
| 
      
 274 
     | 
    
         
            +
                    #        puts 'l601 : '+ lines.now
         
     | 
| 
      
 275 
     | 
    
         
            +
                    #        lines.proceed
         
     | 
| 
      
 276 
     | 
    
         
            +
                    #        puts 'l601 : '+ lines.now
         
     | 
| 
      
 277 
     | 
    
         
            +
                    #        lines.proceed 4
         
     | 
| 
      
 278 
     | 
    
         
            +
                    lines.proceed 7
         
     | 
| 
      
 279 
     | 
    
         
            +
                    if / Orbital Symmetries:/ =~ lines.now
         
     | 
| 
      
 280 
     | 
    
         
            +
                      lines.proceed while / electronic state/ !~ lines.now
         
     | 
| 
      
 281 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 282 
     | 
    
         
            +
                    end
         
     | 
| 
      
 283 
     | 
    
         
            +
                    lines.proceed while / Alpha / =~ lines.now || / Beta / =~ lines.now
         
     | 
| 
      
 284 
     | 
    
         
            +
                    if /     Molecular Orbital Coefficients/ =~ lines.now
         
     | 
| 
      
 285 
     | 
    
         
            +
                      if(@parameters.has_key?(7))# Population = Full
         
     | 
| 
      
 286 
     | 
    
         
            +
                        n = @gaussian_result.n_orbitals / 5.0
         
     | 
| 
      
 287 
     | 
    
         
            +
                        n_orbital_col = n.ceil
         
     | 
| 
      
 288 
     | 
    
         
            +
                      else
         
     | 
| 
      
 289 
     | 
    
         
            +
                        n_orbital_col = 2
         
     | 
| 
      
 290 
     | 
    
         
            +
                      end
         
     | 
| 
      
 291 
     | 
    
         
            +
                      lines.proceed #     Molecular Orbital Coefficients
         
     | 
| 
      
 292 
     | 
    
         
            +
                      last_occupy_or_virtual = ''
         
     | 
| 
      
 293 
     | 
    
         
            +
                      1.upto(n_orbital_col) do |cycle|
         
     | 
| 
      
 294 
     | 
    
         
            +
                        lines.proceed #                           1         2         3         4         5
         
     | 
| 
      
 295 
     | 
    
         
            +
                        mo_array = lines.now.split
         
     | 
| 
      
 296 
     | 
    
         
            +
                        0.upto( mo_array.length - 1 ) do |n_mo|
         
     | 
| 
      
 297 
     | 
    
         
            +
                          /\((.+)\)/ =~ mo_array[n_mo] ; sym = $+
         
     | 
| 
      
 298 
     | 
    
         
            +
                          /\)--(.)/ =~ mo_array[n_mo]
         
     | 
| 
      
 299 
     | 
    
         
            +
                          occupy_or_virtual = ($+ != nil ? $+ : mo_array[n_mo])
         
     | 
| 
      
 300 
     | 
    
         
            +
                          @gaussian_result.mo[(cycle - 1) * 5 + n_mo] =
         
     | 
| 
      
 301 
     | 
    
         
            +
                            MolecularOrbital.new(((cycle - 1) * 5 + n_mo), sym, occupy_or_virtual)
         
     | 
| 
      
 302 
     | 
    
         
            +
                          if last_occupy_or_virtual == 'O' && occupy_or_virtual == 'V'
         
     | 
| 
      
 303 
     | 
    
         
            +
                            @gaussian_result.homo = @gaussian_result.mo[(cycle - 1) * 5 + n_mo - 1]
         
     | 
| 
      
 304 
     | 
    
         
            +
                            @gaussian_result.lumo = @gaussian_result.mo[(cycle - 1) * 5 + n_mo]
         
     | 
| 
      
 305 
     | 
    
         
            +
                          elsif(@gaussian_result.homo == nil && n_orbital_col == cycle && mo_array.length - 1 == n_mo)
         
     | 
| 
      
 306 
     | 
    
         
            +
                            # No LUMO ! Example Br-
         
     | 
| 
      
 307 
     | 
    
         
            +
                            @gaussian_result.homo = @gaussian_result.mo[(cycle - 1) * 5 + n_mo - 1]
         
     | 
| 
      
 308 
     | 
    
         
            +
                            @gaussian_result.lumo = nil
         
     | 
| 
      
 309 
     | 
    
         
            +
                          end
         
     | 
| 
      
 310 
     | 
    
         
            +
                          last_occupy_or_virtual = occupy_or_virtual
         
     | 
| 
      
 311 
     | 
    
         
            +
                        end
         
     | 
| 
      
 312 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 313 
     | 
    
         
            +
                        ev_array = lines.now.split
         
     | 
| 
      
 314 
     | 
    
         
            +
                        0.upto (ev_array.length - 3) do |n_ev|
         
     | 
| 
      
 315 
     | 
    
         
            +
                          @gaussian_result.mo[(cycle - 1) * 5 + n_ev].eigen_value = ev_array[n_ev + 2].to_f
         
     | 
| 
      
 316 
     | 
    
         
            +
                        end
         
     | 
| 
      
 317 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 318 
     | 
    
         
            +
                        1.upto(@gaussian_result.n_orbitals) do | num |
         
     | 
| 
      
 319 
     | 
    
         
            +
                          coef_array = [lines.now[0..3].strip, lines.now[5..8].strip, lines.now[9..10].strip,
         
     | 
| 
      
 320 
     | 
    
         
            +
                            lines.now[11..21].strip]
         
     | 
| 
      
 321 
     | 
    
         
            +
                          0.upto (mo_array.length - 1) do |n_mo|
         
     | 
| 
      
 322 
     | 
    
         
            +
                            coef_array << lines.now[(21 + n_mo*10)..(31 + n_mo*10)]
         
     | 
| 
      
 323 
     | 
    
         
            +
                          end
         
     | 
| 
      
 324 
     | 
    
         
            +
                          plus = 0
         
     | 
| 
      
 325 
     | 
    
         
            +
                          #  	    if /^[[:alpha:]]+/ =~ coef_array[2]
         
     | 
| 
      
 326 
     | 
    
         
            +
                          if coef_array[1] != ''
         
     | 
| 
      
 327 
     | 
    
         
            +
                            atom = @gaussian_result.atoms[coef_array[1].to_i]
         
     | 
| 
      
 328 
     | 
    
         
            +
                          end
         
     | 
| 
      
 329 
     | 
    
         
            +
                          1.upto( mo_array.length ) do |n_ao|
         
     | 
| 
      
 330 
     | 
    
         
            +
                            atom.ao(coef_array[3]).push(coef_array[n_ao + 2].to_i)
         
     | 
| 
      
 331 
     | 
    
         
            +
                            @gaussian_result.mo[(cycle - 1) * 5 + n_ao - 1].push([atom.index, coef_array[3]], coef_array[3 + n_ao].to_f)
         
     | 
| 
      
 332 
     | 
    
         
            +
                            #  	      @gaussian_result.mo[(cycle - 1) * 5 + n_ao].push(coef_array[n_ao + plus + 2].to_f)
         
     | 
| 
      
 333 
     | 
    
         
            +
                          end
         
     | 
| 
      
 334 
     | 
    
         
            +
                          lines.proceed
         
     | 
| 
      
 335 
     | 
    
         
            +
                        end
         
     | 
| 
      
 336 
     | 
    
         
            +
                      end
         
     | 
| 
      
 337 
     | 
    
         
            +
                      lines.proceed #      DENSITY MATRIX.
         
     | 
| 
      
 338 
     | 
    
         
            +
                      density_time = @gaussian_result.n_orbitals
         
     | 
| 
      
 339 
     | 
    
         
            +
                      while(density_time >0)
         
     | 
| 
      
 340 
     | 
    
         
            +
                        lines.proceed #                           1         2         3         4         5
         
     | 
| 
      
 341 
     | 
    
         
            +
                        lines.proceed density_time
         
     | 
| 
      
 342 
     | 
    
         
            +
                        density_time = density_time - 5
         
     | 
| 
      
 343 
     | 
    
         
            +
                      end
         
     | 
| 
      
 344 
     | 
    
         
            +
                      lines.proceed #    Full Mulliken population analysis:
         
     | 
| 
      
 345 
     | 
    
         
            +
                      mulliken_time = @gaussian_result.n_orbitals
         
     | 
| 
      
 346 
     | 
    
         
            +
                      while(mulliken_time > 0)
         
     | 
| 
      
 347 
     | 
    
         
            +
                        lines.proceed #                           1         2         3         4         5
         
     | 
| 
      
 348 
     | 
    
         
            +
                        lines.proceed mulliken_time
         
     | 
| 
      
 349 
     | 
    
         
            +
                        mulliken_time = mulliken_time - 5
         
     | 
| 
      
 350 
     | 
    
         
            +
                      end
         
     | 
| 
      
 351 
     | 
    
         
            +
                      lines.proceed #     Gross orbital populations:
         
     | 
| 
      
 352 
     | 
    
         
            +
                      1.upto(@gaussian_result.n_orbitals) do |num|
         
     | 
| 
      
 353 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 354 
     | 
    
         
            +
                      end
         
     | 
| 
      
 355 
     | 
    
         
            +
                      lines.proceed #          Condensed to atoms (all electrons):
         
     | 
| 
      
 356 
     | 
    
         
            +
                    end
         
     | 
| 
      
 357 
     | 
    
         
            +
                    n = (@gaussian_result.n_atoms) / 6.0
         
     | 
| 
      
 358 
     | 
    
         
            +
                    if /Condensed to / =~ lines.now
         
     | 
| 
      
 359 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 360 
     | 
    
         
            +
                      if /              1/ =~ lines.now # BUG of Gaussian98 !?
         
     | 
| 
      
 361 
     | 
    
         
            +
                        1.upto(n.ceil) do |num|
         
     | 
| 
      
 362 
     | 
    
         
            +
                          @gaussian_result.exist_condensed_to_atom = true
         
     | 
| 
      
 363 
     | 
    
         
            +
                          lines.proceed
         
     | 
| 
      
 364 
     | 
    
         
            +
                          1.upto(@gaussian_result.n_atoms) do |nn|
         
     | 
| 
      
 365 
     | 
    
         
            +
                            array = lines.now.split
         
     | 
| 
      
 366 
     | 
    
         
            +
                            1.upto(array.length - 2) do |col|
         
     | 
| 
      
 367 
     | 
    
         
            +
                              @gaussian_result.atoms[array[0].to_i].density[(num - 1)* 6 + col] = array[col + 1].to_f
         
     | 
| 
      
 368 
     | 
    
         
            +
                            end
         
     | 
| 
      
 369 
     | 
    
         
            +
                            lines.proceed
         
     | 
| 
      
 370 
     | 
    
         
            +
                          end
         
     | 
| 
      
 371 
     | 
    
         
            +
                        end
         
     | 
| 
      
 372 
     | 
    
         
            +
                      end
         
     | 
| 
      
 373 
     | 
    
         
            +
                    end
         
     | 
| 
      
 374 
     | 
    
         
            +
                    lines.proceed 2
         
     | 
| 
      
 375 
     | 
    
         
            +
                    1.upto(@gaussian_result.n_atoms) do | num |
         
     | 
| 
      
 376 
     | 
    
         
            +
                      @gaussian_result.atoms[lines.now.split[0].to_i].total_atomic_charge = lines.now.split[2].to_f
         
     | 
| 
      
 377 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 378 
     | 
    
         
            +
                    end
         
     | 
| 
      
 379 
     | 
    
         
            +
                    @gaussian_result.sum_of_mulliken_charge = lines.now.split[4].to_f
         
     | 
| 
      
 380 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 381 
     | 
    
         
            +
                    lines.proceed # Atomic charges with hydrogens summed into heavy atoms:
         
     | 
| 
      
 382 
     | 
    
         
            +
                    lines.proceed #              1
         
     | 
| 
      
 383 
     | 
    
         
            +
                    1.upto(@gaussian_result.n_atoms) do |num|
         
     | 
| 
      
 384 
     | 
    
         
            +
                      @gaussian_result.atoms[lines.now.split[0].to_i].heavy_charge = lines.now.split[2].to_f
         
     | 
| 
      
 385 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 386 
     | 
    
         
            +
                    end
         
     | 
| 
      
 387 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 388 
     | 
    
         
            +
                    if /Atomic-Atomic Spin Densities./ =~ lines.now
         
     | 
| 
      
 389 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 390 
     | 
    
         
            +
                      n = @gaussian_result.n_atoms / 6.0
         
     | 
| 
      
 391 
     | 
    
         
            +
                      1.upto n.ceil do |num|
         
     | 
| 
      
 392 
     | 
    
         
            +
                        lines.proceed @gaussian_result.n_atoms
         
     | 
| 
      
 393 
     | 
    
         
            +
                      end
         
     | 
| 
      
 394 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 395 
     | 
    
         
            +
                      lines.proceed # Total atomic spin densities:
         
     | 
| 
      
 396 
     | 
    
         
            +
                      lines.proceed #              1
         
     | 
| 
      
 397 
     | 
    
         
            +
                      lines.proceed @gaussian_result.n_atoms
         
     | 
| 
      
 398 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 399 
     | 
    
         
            +
                      if /Isotropic Fermi / =~ lines.now
         
     | 
| 
      
 400 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 401 
     | 
    
         
            +
                        1.upto(@gaussian_result.n_atoms) do |num|
         
     | 
| 
      
 402 
     | 
    
         
            +
                          lines.proceed
         
     | 
| 
      
 403 
     | 
    
         
            +
                        end
         
     | 
| 
      
 404 
     | 
    
         
            +
                      end
         
     | 
| 
      
 405 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 406 
     | 
    
         
            +
                    end
         
     | 
| 
      
 407 
     | 
    
         
            +
                    #        if(@parameters.has_key?(7) && (@parameters[7] == 3 || @parameters[7] == 2))
         
     | 
| 
      
 408 
     | 
    
         
            +
                    if/ Electronic spatial extent/ =~ lines.now
         
     | 
| 
      
 409 
     | 
    
         
            +
                      #      if(@parameters.has_key?(28))
         
     | 
| 
      
 410 
     | 
    
         
            +
                      @gaussian_result.electronic_spatial_extent = lines.now.split[5].to_f
         
     | 
| 
      
 411 
     | 
    
         
            +
                      lines.proceed 3
         
     | 
| 
      
 412 
     | 
    
         
            +
                      @gaussian_result.dipole_moment_total = lines.now.split[7].to_f
         
     | 
| 
      
 413 
     | 
    
         
            +
                      lines.proceed while / N-N=/ !~ lines.now
         
     | 
| 
      
 414 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 415 
     | 
    
         
            +
                      if / Symmetry/ =~ lines.now
         
     | 
| 
      
 416 
     | 
    
         
            +
                        lines.proceed while / Symmetry/ =~ lines.now
         
     | 
| 
      
 417 
     | 
    
         
            +
                      end
         
     | 
| 
      
 418 
     | 
    
         
            +
                    end
         
     | 
| 
      
 419 
     | 
    
         
            +
                    if /Exact polarizability/ =~ lines.now
         
     | 
| 
      
 420 
     | 
    
         
            +
                      lines.now.split[7].to_f #Assertive programming ;)
         
     | 
| 
      
 421 
     | 
    
         
            +
                      lines.proceed while /Thermochemistry/ != lines.now
         
     | 
| 
      
 422 
     | 
    
         
            +
                      lines.proceed while / TOTAL BOT/ !~ lines.now
         
     | 
| 
      
 423 
     | 
    
         
            +
                      lines.proceed while / ROTATIONAL/ !~ lines.now
         
     | 
| 
      
 424 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 425 
     | 
    
         
            +
                    end
         
     | 
| 
      
 426 
     | 
    
         
            +
                    #      @stop = true
         
     | 
| 
      
 427 
     | 
    
         
            +
                  when 602 # 1-electron properties (potential, field, and field gradient)
         
     | 
| 
      
 428 
     | 
    
         
            +
                  when 604 # Evaluates MOs or density over a grid of points
         
     | 
| 
      
 429 
     | 
    
         
            +
                    lines.proceed while / LenV=/ !~ lines.now
         
     | 
| 
      
 430 
     | 
    
         
            +
                  when 607 # Performs NBO analyses
         
     | 
| 
      
 431 
     | 
    
         
            +
                  when 608 # Non-iterative DFT energies
         
     | 
| 
      
 432 
     | 
    
         
            +
                  when 609 # Atoms in Molecules properties
         
     | 
| 
      
 433 
     | 
    
         
            +
                  when 701 # 1-electron integral first or second derivatives
         
     | 
| 
      
 434 
     | 
    
         
            +
                    lines.proceed if /solvent charges in/ =~ lines.now
         
     | 
| 
      
 435 
     | 
    
         
            +
                  when 702 # 2-electron integral first or second derivatives (sp)
         
     | 
| 
      
 436 
     | 
    
         
            +
                    lines.proceed if /Density matrix is not symmetric/ =~ lines.now
         
     | 
| 
      
 437 
     | 
    
         
            +
                  when 703 # 2-electron integral first or second derivatives (spdf)
         
     | 
| 
      
 438 
     | 
    
         
            +
                  when 709 # Forms the ECP integral derivative contribution to gradients
         
     | 
| 
      
 439 
     | 
    
         
            +
                  when 716 # Processes information for optimizations and frequencies
         
     | 
| 
      
 440 
     | 
    
         
            +
                    # ***** Axes restored to original set *****
         
     | 
| 
      
 441 
     | 
    
         
            +
                    lines.proceed if /Axes restored/ =~ lines.now
         
     | 
| 
      
 442 
     | 
    
         
            +
                    if /Rotating electric field/ =~ lines.now
         
     | 
| 
      
 443 
     | 
    
         
            +
                      lines.proceed while /Axes restored/ !~ lines.now
         
     | 
| 
      
 444 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 445 
     | 
    
         
            +
                    end
         
     | 
| 
      
 446 
     | 
    
         
            +
                    lines.proceed # -------------------------------------------------------------------
         
     | 
| 
      
 447 
     | 
    
         
            +
                    lines.proceed # Center     Atomic                   Forces (Hartrees/Bohr)
         
     | 
| 
      
 448 
     | 
    
         
            +
                    lines.proceed # Number     Number              X              Y              Z
         
     | 
| 
      
 449 
     | 
    
         
            +
                    lines.proceed # -------------------------------------------------------------------
         
     | 
| 
      
 450 
     | 
    
         
            +
                    1.upto(@gaussian_result.n_atoms) do |num|
         
     | 
| 
      
 451 
     | 
    
         
            +
                      lines.now.split[4].to_f #Assertive Programming ;)
         
     | 
| 
      
 452 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 453 
     | 
    
         
            +
                    end
         
     | 
| 
      
 454 
     | 
    
         
            +
                    lines.proceed # -------------------------------------------------------------------
         
     | 
| 
      
 455 
     | 
    
         
            +
                    lines.proceed # Cartesian Forces:  Max     2.919256220 RMS     1.058248881
         
     | 
| 
      
 456 
     | 
    
         
            +
                  when 801 # Initializes transformation of 2-electron integrals
         
     | 
| 
      
 457 
     | 
    
         
            +
                    lines.proceed 2
         
     | 
| 
      
 458 
     | 
    
         
            +
                  when 802 # Performs integral transformation (N3 in-core)
         
     | 
| 
      
 459 
     | 
    
         
            +
                  when 803 # Complete basis set (CBS) extrapolation
         
     | 
| 
      
 460 
     | 
    
         
            +
                  when 804 # Integral transformation
         
     | 
| 
      
 461 
     | 
    
         
            +
                    #        if /^$/ =~ lines.now
         
     | 
| 
      
 462 
     | 
    
         
            +
                    #  	lines.proceed 3 # **** Warning!!: The largest alpha MO coefficient is  0.39613240D+02
         
     | 
| 
      
 463 
     | 
    
         
            +
                    #        else
         
     | 
| 
      
 464 
     | 
    
         
            +
                    #  	lines.proceed # Estimate disk for full transformation     8758468 words.
         
     | 
| 
      
 465 
     | 
    
         
            +
                    #        end
         
     | 
| 
      
 466 
     | 
    
         
            +
                    while !(/ANorm/ =~ lines.now && /^ E2=/ =~ lines.next_line)
         
     | 
| 
      
 467 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 468 
     | 
    
         
            +
                    end
         
     | 
| 
      
 469 
     | 
    
         
            +
                    lines.proceed 2
         
     | 
| 
      
 470 
     | 
    
         
            +
                  when 811 # Transforms integral derivatives & computes their contributions to MP2 2nd derivatives
         
     | 
| 
      
 471 
     | 
    
         
            +
                    lines.proceed # Form MO integral derivatives with frozen-active canonical formalism.
         
     | 
| 
      
 472 
     | 
    
         
            +
                    lines.proceed # MDV=     6291456.
         
     | 
| 
      
 473 
     | 
    
         
            +
                    lines.proceed # Discarding MO integrals.
         
     | 
| 
      
 474 
     | 
    
         
            +
                    lines.proceed #             Reordered first order wavefunction length =       176418
         
     | 
| 
      
 475 
     | 
    
         
            +
                    lines.proceed if /In DefCFB/ =~ lines.now
         
     | 
| 
      
 476 
     | 
    
         
            +
                    lines.proceed if /Large arrays: / =~ lines.now
         
     | 
| 
      
 477 
     | 
    
         
            +
                  when 901 # Anti-symmetrizes 2-electron integrals
         
     | 
| 
      
 478 
     | 
    
         
            +
                  when 902 # Determines the stability of the Hartree-Fock wavefunction
         
     | 
| 
      
 479 
     | 
    
         
            +
                  when 903 # Old in-core MP2
         
     | 
| 
      
 480 
     | 
    
         
            +
                  when 905 # Complex MP2
         
     | 
| 
      
 481 
     | 
    
         
            +
                  when 906 # Semi-direct MP2
         
     | 
| 
      
 482 
     | 
    
         
            +
                    #      puts 'l906 : ' + lines.now
         
     | 
| 
      
 483 
     | 
    
         
            +
                    #      lines.proceed 12
         
     | 
| 
      
 484 
     | 
    
         
            +
                    lines.proceed while / E2 =/ !~ lines.now
         
     | 
| 
      
 485 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 486 
     | 
    
         
            +
                  when 908 # OVGF (closed shell)
         
     | 
| 
      
 487 
     | 
    
         
            +
                  when 909 # OVGF (open shell)
         
     | 
| 
      
 488 
     | 
    
         
            +
                  when 913 # Calculates post-SCF energies and gradient terms
         
     | 
| 
      
 489 
     | 
    
         
            +
                    while /^ QCISD\(T\)=/ !~ lines.now
         
     | 
| 
      
 490 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 491 
     | 
    
         
            +
                    end
         
     | 
| 
      
 492 
     | 
    
         
            +
                    lines.proceed 1
         
     | 
| 
      
 493 
     | 
    
         
            +
                  when 914 # CI-Single, RPA and Zindo excited states; SCF stability
         
     | 
| 
      
 494 
     | 
    
         
            +
                    lines.proceed while /       state/ !~ lines.now
         
     | 
| 
      
 495 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 496 
     | 
    
         
            +
                    n_state = 0
         
     | 
| 
      
 497 
     | 
    
         
            +
                    while / Ground to excited state/ !~ lines.now
         
     | 
| 
      
 498 
     | 
    
         
            +
                      n_state = n_state + 1
         
     | 
| 
      
 499 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 500 
     | 
    
         
            +
                    end
         
     | 
| 
      
 501 
     | 
    
         
            +
                    while / Excitation energies and oscillator strengths:/ !~ lines.now
         
     | 
| 
      
 502 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 503 
     | 
    
         
            +
                    end
         
     | 
| 
      
 504 
     | 
    
         
            +
                    1.upto n_state do |num|
         
     | 
| 
      
 505 
     | 
    
         
            +
                      lines.proceed while / Excited State / !~ lines.now
         
     | 
| 
      
 506 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 507 
     | 
    
         
            +
                      lines.proceed while /\d+ ->/ =~ lines.now
         
     | 
| 
      
 508 
     | 
    
         
            +
                    end
         
     | 
| 
      
 509 
     | 
    
         
            +
                  when 915 # Computes fifth order quantities (for MP5, QCISD (TQ) and BD (TQ))
         
     | 
| 
      
 510 
     | 
    
         
            +
                  when 918 # Reoptimizes the wavefunction
         
     | 
| 
      
 511 
     | 
    
         
            +
                  when 1002 # Iteratively solves the CPHF equations; computes various properteis
         
     | 
| 
      
 512 
     | 
    
         
            +
                    #      lines.proceed while /degrees of freedom in the / !~ lines.now
         
     | 
| 
      
 513 
     | 
    
         
            +
                    #        lines.proceed # Petite list used in FoFDir.
         
     | 
| 
      
 514 
     | 
    
         
            +
                    #        lines.proceed #MinBra= 0 MaxBra= 2 Meth= 1.
         
     | 
| 
      
 515 
     | 
    
         
            +
                    #        lines.proceed #IRaf=       0 NMat=   1 IRICut=       1 DoRegI=T DoRafI=F ISym2E= 1 JSym2E=1.
         
     | 
| 
      
 516 
     | 
    
         
            +
                    #        lines.proceed while /vectors were produced by pass/ =~ lines.now
         
     | 
| 
      
 517 
     | 
    
         
            +
                    while /Inverted reduced A of dimension/ !~ lines.now
         
     | 
| 
      
 518 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 519 
     | 
    
         
            +
                    end
         
     | 
| 
      
 520 
     | 
    
         
            +
                    lines.proceed
         
     | 
| 
      
 521 
     | 
    
         
            +
                    if / Calculating GIAO nuclear magnetic shielding tensors./ =~ lines.now
         
     | 
| 
      
 522 
     | 
    
         
            +
                      1.upto @gaussian_result.n_atoms do |num|
         
     | 
| 
      
 523 
     | 
    
         
            +
                        lines.proceed while /Eigenvalues:/ !~ lines.now
         
     | 
| 
      
 524 
     | 
    
         
            +
                        lines.proceed
         
     | 
| 
      
 525 
     | 
    
         
            +
                      end
         
     | 
| 
      
 526 
     | 
    
         
            +
                    end
         
     | 
| 
      
 527 
     | 
    
         
            +
                    #  	while /^$/ !~ lines.now
         
     | 
| 
      
 528 
     | 
    
         
            +
                    #  	  lines.proceed
         
     | 
| 
      
 529 
     | 
    
         
            +
                    #  	end
         
     | 
| 
      
 530 
     | 
    
         
            +
                    #        end
         
     | 
| 
      
 531 
     | 
    
         
            +
                    #        lines.proceed
         
     | 
| 
      
 532 
     | 
    
         
            +
                  when 1003 # Iteratively solves the CP-MCSCF equations
         
     | 
| 
      
 533 
     | 
    
         
            +
                  when 1014 # Computes analytic CI-Single second derivatives
         
     | 
| 
      
 534 
     | 
    
         
            +
                  when 1101 # Computes 1-electron integral derivatives
         
     | 
| 
      
 535 
     | 
    
         
            +
                  when 1102 # Computes dipole derivative integrals
         
     | 
| 
      
 536 
     | 
    
         
            +
                  when 1110 # 2-electron integral derivative condition to F
         
     | 
| 
      
 537 
     | 
    
         
            +
                    lines.proceed if /G2DrvN: will do/ =~ lines.now
         
     | 
| 
      
 538 
     | 
    
         
            +
                    lines.proceed if /FoFDir used for/ =~ lines.now
         
     | 
| 
      
 539 
     | 
    
         
            +
                  when 1111 # 2 PDM and post-SCF derivatives
         
     | 
| 
      
 540 
     | 
    
         
            +
                  when 1112 # MP2 second derivatives
         
     | 
| 
      
 541 
     | 
    
         
            +
                    lines.proceed if /R2 and R3 integrals will be/ =~ lines.now
         
     | 
| 
      
 542 
     | 
    
         
            +
                    lines.proceed while / Incrementing Polarizabilities/ !~ lines.now
         
     | 
| 
      
 543 
     | 
    
         
            +
                    lines.proceed 2
         
     | 
| 
      
 544 
     | 
    
         
            +
                  when 9999 # Finalizes calculation and output
         
     | 
| 
      
 545 
     | 
    
         
            +
                    while !lines.eof?
         
     | 
| 
      
 546 
     | 
    
         
            +
                      if / Normal termination/ =~ lines.now
         
     | 
| 
      
 547 
     | 
    
         
            +
                        #	  puts ' ****** Normal termination ****** '
         
     | 
| 
      
 548 
     | 
    
         
            +
                      end
         
     | 
| 
      
 549 
     | 
    
         
            +
                      lines.proceed
         
     | 
| 
      
 550 
     | 
    
         
            +
                    end
         
     | 
| 
      
 551 
     | 
    
         
            +
            	@stop = true
         
     | 
| 
      
 552 
     | 
    
         
            +
                  else
         
     | 
| 
      
 553 
     | 
    
         
            +
                    puts 'Not implemented Link Number!!'
         
     | 
| 
      
 554 
     | 
    
         
            +
                    printf " major : %d   minor : %d\n", @major_number, @minor_number,to_s
         
     | 
| 
      
 555 
     | 
    
         
            +
                  end
         
     | 
| 
      
 556 
     | 
    
         
            +
                rescue
         
     | 
| 
      
 557 
     | 
    
         
            +
                  puts 'exception at ' + (@major_number * 100 + @minor_number).to_s
         
     | 
| 
      
 558 
     | 
    
         
            +
                  raise
         
     | 
| 
      
 559 
     | 
    
         
            +
                end
         
     | 
| 
      
 560 
     | 
    
         
            +
              end
         
     | 
| 
      
 561 
     | 
    
         
            +
             
     | 
| 
      
 562 
     | 
    
         
            +
              class MolecularOrbital
         
     | 
| 
      
 563 
     | 
    
         
            +
                attr_accessor :eigen_value, :index
         
     | 
| 
      
 564 
     | 
    
         
            +
                def initialize index, sym, occupy_or_virtual
         
     | 
| 
      
 565 
     | 
    
         
            +
                  @index = index
         
     | 
| 
      
 566 
     | 
    
         
            +
                  @sym = sym
         
     | 
| 
      
 567 
     | 
    
         
            +
                  @occupy_or_virtual = occupy_or_virtual
         
     | 
| 
      
 568 
     | 
    
         
            +
                  @coefficient = Hash.new
         
     | 
| 
      
 569 
     | 
    
         
            +
                end
         
     | 
| 
      
 570 
     | 
    
         
            +
                def each_ao
         
     | 
| 
      
 571 
     | 
    
         
            +
                  @coefficient.each do |key, ao|
         
     | 
| 
      
 572 
     | 
    
         
            +
                    yield key, ao
         
     | 
| 
      
 573 
     | 
    
         
            +
                  end
         
     | 
| 
      
 574 
     | 
    
         
            +
                end
         
     | 
| 
      
 575 
     | 
    
         
            +
                def push ao, coef
         
     | 
| 
      
 576 
     | 
    
         
            +
                  @coefficient[ao] = coef
         
     | 
| 
      
 577 
     | 
    
         
            +
                  #    puts index.to_s + ' : ' + @sym.to_s + ':' + ' : ' + @occupy_or_virtual + ':' + ao + ' : ' +coef.to_s + ' '
         
     | 
| 
      
 578 
     | 
    
         
            +
                end
         
     | 
| 
      
 579 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 580 
     | 
    
         
            +
                  s = sprintf(" %3d %s %s", @index, @sym, @occupy_or_virtual)
         
     | 
| 
      
 581 
     | 
    
         
            +
                  if @coefficient.length < 1
         
     | 
| 
      
 582 
     | 
    
         
            +
                    puts '@coefficient == 0!'
         
     | 
| 
      
 583 
     | 
    
         
            +
                  end
         
     | 
| 
      
 584 
     | 
    
         
            +
                  @coefficient.each do |key, coef|
         
     | 
| 
      
 585 
     | 
    
         
            +
                    s = s + sprintf(" %1.1f", coef)
         
     | 
| 
      
 586 
     | 
    
         
            +
                  end
         
     | 
| 
      
 587 
     | 
    
         
            +
                  s
         
     | 
| 
      
 588 
     | 
    
         
            +
                end
         
     | 
| 
      
 589 
     | 
    
         
            +
              end
         
     | 
| 
      
 590 
     | 
    
         
            +
             
     | 
| 
      
 591 
     | 
    
         
            +
              class AtomicOrbital
         
     | 
| 
      
 592 
     | 
    
         
            +
                def initialize type
         
     | 
| 
      
 593 
     | 
    
         
            +
                  @type = type
         
     | 
| 
      
 594 
     | 
    
         
            +
                  @coefficient = Array.new
         
     | 
| 
      
 595 
     | 
    
         
            +
                end
         
     | 
| 
      
 596 
     | 
    
         
            +
                def push coef
         
     | 
| 
      
 597 
     | 
    
         
            +
                  @coefficient.push coef
         
     | 
| 
      
 598 
     | 
    
         
            +
                end
         
     | 
| 
      
 599 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 600 
     | 
    
         
            +
                  s = sprintf("%5s ", @type)
         
     | 
| 
      
 601 
     | 
    
         
            +
                  @coefficient.each do |coef|
         
     | 
| 
      
 602 
     | 
    
         
            +
                    s = s + sprintf("%2.2f ", coef)
         
     | 
| 
      
 603 
     | 
    
         
            +
                  end
         
     | 
| 
      
 604 
     | 
    
         
            +
                  return s
         
     | 
| 
      
 605 
     | 
    
         
            +
                end
         
     | 
| 
      
 606 
     | 
    
         
            +
              end
         
     | 
| 
      
 607 
     | 
    
         
            +
             
     | 
| 
      
 608 
     | 
    
         
            +
              class G98Atom
         
     | 
| 
      
 609 
     | 
    
         
            +
             
     | 
| 
      
 610 
     | 
    
         
            +
                #include Atom
         
     | 
| 
      
 611 
     | 
    
         
            +
             
     | 
| 
      
 612 
     | 
    
         
            +
                attr_accessor :element, :density,
         
     | 
| 
      
 613 
     | 
    
         
            +
                :distance_atom, :distance_length, :angle_atom, :angle, :dihedral_angle_atom, :diheral_angle_a, :dihedral_angle_b,
         
     | 
| 
      
 614 
     | 
    
         
            +
                :x, :y, :z, :total_atomic_charge, :heavy_charge
         
     | 
| 
      
 615 
     | 
    
         
            +
                attr_reader :index
         
     | 
| 
      
 616 
     | 
    
         
            +
                VALENCY = {'C'=>4, 'N'=>3, 'H'=>1, 'F'=>1, 'CL'=>1, 'I'=>1, 'O'=>2, 'BR'=>1}
         
     | 
| 
      
 617 
     | 
    
         
            +
                VALENCY2 = {'C'=>2, 'H'=>-1, 'O'=>0, 'F'=>-1, 'CL'=>-1, 'BR'=>-1}
         
     | 
| 
      
 618 
     | 
    
         
            +
                WEIGHT = {'O'=>15.9999, 'BR'=>79.904, 'H'=>1.00794, 'C'=>12.001, 'F'=>18.9984032, 'CL'=>35.4527, 'N'=>14.00674}
         
     | 
| 
      
 619 
     | 
    
         
            +
                def initialize index, molecule
         
     | 
| 
      
 620 
     | 
    
         
            +
                  @index = index
         
     | 
| 
      
 621 
     | 
    
         
            +
                  @molecule = molecule
         
     | 
| 
      
 622 
     | 
    
         
            +
                  @density = Hash.new
         
     | 
| 
      
 623 
     | 
    
         
            +
                  @orbital = Hash.new
         
     | 
| 
      
 624 
     | 
    
         
            +
                end
         
     | 
| 
      
 625 
     | 
    
         
            +
                def get_distance atom
         
     | 
| 
      
 626 
     | 
    
         
            +
                  Math.sqrt((@x - atom.x)*(@x - atom.x) + (@y - atom.y)*(@y - atom.y) + (@z - atom.z)*(@z - atom.z))
         
     | 
| 
      
 627 
     | 
    
         
            +
                end
         
     | 
| 
      
 628 
     | 
    
         
            +
                def neighbor? atom, length
         
     | 
| 
      
 629 
     | 
    
         
            +
                  return (get_distance(atom) < length)
         
     | 
| 
      
 630 
     | 
    
         
            +
                end
         
     | 
| 
      
 631 
     | 
    
         
            +
                def element= el
         
     | 
| 
      
 632 
     | 
    
         
            +
                  @element = el.upcase
         
     | 
| 
      
 633 
     | 
    
         
            +
                end
         
     | 
| 
      
 634 
     | 
    
         
            +
                def weight
         
     | 
| 
      
 635 
     | 
    
         
            +
                  puts('@element : ' + @element + 'is not defined weight!!') if WEIGHT[@element] == nil
         
     | 
| 
      
 636 
     | 
    
         
            +
                  return WEIGHT[@element]
         
     | 
| 
      
 637 
     | 
    
         
            +
                end
         
     | 
| 
      
 638 
     | 
    
         
            +
                def valency
         
     | 
| 
      
 639 
     | 
    
         
            +
                  puts('@element : ' + @element + 'is not defined valency!!') if VALENCY[@element] == nil
         
     | 
| 
      
 640 
     | 
    
         
            +
                  VALENCY[@element]
         
     | 
| 
      
 641 
     | 
    
         
            +
                end
         
     | 
| 
      
 642 
     | 
    
         
            +
                def valency2
         
     | 
| 
      
 643 
     | 
    
         
            +
                  puts('@element : ' + @element + 'is not defined valency2!!') if VALENCY2[@element] == nil
         
     | 
| 
      
 644 
     | 
    
         
            +
                  VALENCY2[@element]
         
     | 
| 
      
 645 
     | 
    
         
            +
                end
         
     | 
| 
      
 646 
     | 
    
         
            +
                def each_ao
         
     | 
| 
      
 647 
     | 
    
         
            +
                  @orbital.each_value do |atomic_orbital|
         
     | 
| 
      
 648 
     | 
    
         
            +
                    yield atomic_orbital
         
     | 
| 
      
 649 
     | 
    
         
            +
                  end
         
     | 
| 
      
 650 
     | 
    
         
            +
                end
         
     | 
| 
      
 651 
     | 
    
         
            +
                def ao hash
         
     | 
| 
      
 652 
     | 
    
         
            +
                  if @orbital[hash] == nil
         
     | 
| 
      
 653 
     | 
    
         
            +
                    return @orbital[hash] = AtomicOrbital.new(hash)
         
     | 
| 
      
 654 
     | 
    
         
            +
                  else
         
     | 
| 
      
 655 
     | 
    
         
            +
                    return @orbital[hash]
         
     | 
| 
      
 656 
     | 
    
         
            +
                  end
         
     | 
| 
      
 657 
     | 
    
         
            +
                end
         
     | 
| 
      
 658 
     | 
    
         
            +
                def distance atom, length
         
     | 
| 
      
 659 
     | 
    
         
            +
                  @distance_atom = atom
         
     | 
| 
      
 660 
     | 
    
         
            +
                  @distance_length = length
         
     | 
| 
      
 661 
     | 
    
         
            +
                end
         
     | 
| 
      
 662 
     | 
    
         
            +
                def angle atom, angle
         
     | 
| 
      
 663 
     | 
    
         
            +
                  @angle_atom = atom
         
     | 
| 
      
 664 
     | 
    
         
            +
                  @angle = angle
         
     | 
| 
      
 665 
     | 
    
         
            +
                end
         
     | 
| 
      
 666 
     | 
    
         
            +
                def dihedral atom, angle_a, angle_b
         
     | 
| 
      
 667 
     | 
    
         
            +
                  @dihedral_atom = atom
         
     | 
| 
      
 668 
     | 
    
         
            +
                  @dihedral_angle_a = angle_a
         
     | 
| 
      
 669 
     | 
    
         
            +
                  @dihedral_angle_b = angle_b
         
     | 
| 
      
 670 
     | 
    
         
            +
                end
         
     | 
| 
      
 671 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 672 
     | 
    
         
            +
                  if @molecule.has_cartessian_coordinate
         
     | 
| 
      
 673 
     | 
    
         
            +
                    return to_cartessian_coodinate
         
     | 
| 
      
 674 
     | 
    
         
            +
                  elsif @molecule.has_z_matrix
         
     | 
| 
      
 675 
     | 
    
         
            +
                    return to_z_matrix
         
     | 
| 
      
 676 
     | 
    
         
            +
                  end
         
     | 
| 
      
 677 
     | 
    
         
            +
                end
         
     | 
| 
      
 678 
     | 
    
         
            +
                def to_condensed_density
         
     | 
| 
      
 679 
     | 
    
         
            +
                  s = sprintf("%2s  ", @element)
         
     | 
| 
      
 680 
     | 
    
         
            +
                  1.upto @molecule.atoms.length do |num|
         
     | 
| 
      
 681 
     | 
    
         
            +
                    s = s + sprintf("% f  ", @density[num].to_s)
         
     | 
| 
      
 682 
     | 
    
         
            +
                  end
         
     | 
| 
      
 683 
     | 
    
         
            +
                  return s
         
     | 
| 
      
 684 
     | 
    
         
            +
                end
         
     | 
| 
      
 685 
     | 
    
         
            +
                def to_cartessian_coodinate
         
     | 
| 
      
 686 
     | 
    
         
            +
                  sprintf(" %2s  % f  % f  % f", @element, @x, @y, @z)
         
     | 
| 
      
 687 
     | 
    
         
            +
                end
         
     | 
| 
      
 688 
     | 
    
         
            +
                def to_mol
         
     | 
| 
      
 689 
     | 
    
         
            +
                  sprintf("%10.4f%10.4f%10.4f %-2s  0  0  0  0  0", @x, @y, @z, @element)
         
     | 
| 
      
 690 
     | 
    
         
            +
                end
         
     | 
| 
      
 691 
     | 
    
         
            +
                def to_xyz
         
     | 
| 
      
 692 
     | 
    
         
            +
                  sprintf("%2s% 8.3f% 8.3f% 8.3f\n", @element, @x, @y, @z)
         
     | 
| 
      
 693 
     | 
    
         
            +
                end
         
     | 
| 
      
 694 
     | 
    
         
            +
                def to_z_matrix
         
     | 
| 
      
 695 
     | 
    
         
            +
                  s = sprintf("%d  %s ", @molecule.atoms.index(self), @element)
         
     | 
| 
      
 696 
     | 
    
         
            +
                  if @distance_atom != nil
         
     | 
| 
      
 697 
     | 
    
         
            +
                    s = s + sprintf("%2d  %f  ", @molecule.atoms.index(@distance_atom), @distance_length)
         
     | 
| 
      
 698 
     | 
    
         
            +
                  end
         
     | 
| 
      
 699 
     | 
    
         
            +
                  if @angle_atom != nil
         
     | 
| 
      
 700 
     | 
    
         
            +
                    s = s + sprintf("%2d  %f  ", @molecule.atoms.index(@angle_atom), @angle)
         
     | 
| 
      
 701 
     | 
    
         
            +
                  end
         
     | 
| 
      
 702 
     | 
    
         
            +
                  if @dihedral_atom != nil
         
     | 
| 
      
 703 
     | 
    
         
            +
                    s = s + sprintf("%2d  %f  %f", @molecule.atoms.index(@dihedral_atom), @dihedral_angle_a, @dihedral_angle_b)
         
     | 
| 
      
 704 
     | 
    
         
            +
                  end
         
     | 
| 
      
 705 
     | 
    
         
            +
                  return s
         
     | 
| 
      
 706 
     | 
    
         
            +
                end
         
     | 
| 
      
 707 
     | 
    
         
            +
              end
         
     | 
| 
      
 708 
     | 
    
         
            +
             
     | 
| 
      
 709 
     | 
    
         
            +
              class GaussianResult
         
     | 
| 
      
 710 
     | 
    
         
            +
                attr_accessor :guess, :standard_basis, :energy, :n_orbitals, :n_electron, :nuclear_repulsion_energy, :n_atoms,
         
     | 
| 
      
 711 
     | 
    
         
            +
                :sum_of_mulliken_charge, :electronic_spatial_extent, :scrf_delta_g, :dipole_moment_total, :atoms,
         
     | 
| 
      
 712 
     | 
    
         
            +
                :has_cartessian_coordinate, :has_z_matrix_coordinate, :exist_condensed_to_atom, :mo, :homo, :lumo,
         
     | 
| 
      
 713 
     | 
    
         
            +
                :stoichiometry, :symmetricity
         
     | 
| 
      
 714 
     | 
    
         
            +
                def initialize input, view=false
         
     | 
| 
      
 715 
     | 
    
         
            +
                  @mo = Hash.new
         
     | 
| 
      
 716 
     | 
    
         
            +
                  @has_cartessian_coordinate = false
         
     | 
| 
      
 717 
     | 
    
         
            +
                  @has_z_matrix_coordinate = false
         
     | 
| 
      
 718 
     | 
    
         
            +
                  @input = input
         
     | 
| 
      
 719 
     | 
    
         
            +
                  read_link
         
     | 
| 
      
 720 
     | 
    
         
            +
                  lines = Lines.new input.readlines
         
     | 
| 
      
 721 
     | 
    
         
            +
                  link = @links[0].first
         
     | 
| 
      
 722 
     | 
    
         
            +
                  puts_links if view
         
     | 
| 
      
 723 
     | 
    
         
            +
                  while ! lines.eof?
         
     | 
| 
      
 724 
     | 
    
         
            +
                    link.process lines
         
     | 
| 
      
 725 
     | 
    
         
            +
                    break if link.stop
         
     | 
| 
      
 726 
     | 
    
         
            +
                    link = link.next_link
         
     | 
| 
      
 727 
     | 
    
         
            +
                  end
         
     | 
| 
      
 728 
     | 
    
         
            +
                  #      link.process lines
         
     | 
| 
      
 729 
     | 
    
         
            +
                end
         
     | 
| 
      
 730 
     | 
    
         
            +
                def weight
         
     | 
| 
      
 731 
     | 
    
         
            +
                  total_weight = 0
         
     | 
| 
      
 732 
     | 
    
         
            +
                  @atoms.each do |key, atom|
         
     | 
| 
      
 733 
     | 
    
         
            +
                    total_weight = total_weight + atom.weight
         
     | 
| 
      
 734 
     | 
    
         
            +
                  end
         
     | 
| 
      
 735 
     | 
    
         
            +
                  total_weight
         
     | 
| 
      
 736 
     | 
    
         
            +
                end
         
     | 
| 
      
 737 
     | 
    
         
            +
                def moment
         
     | 
| 
      
 738 
     | 
    
         
            +
                  total_moment_x = 0
         
     | 
| 
      
 739 
     | 
    
         
            +
                  total_moment_y = 0
         
     | 
| 
      
 740 
     | 
    
         
            +
                  total_moment_z = 0
         
     | 
| 
      
 741 
     | 
    
         
            +
                  @atoms.each do |key, atom|
         
     | 
| 
      
 742 
     | 
    
         
            +
                    total_moment_x = total_moment_x + atom.weight * atom.x * atom.x
         
     | 
| 
      
 743 
     | 
    
         
            +
                    total_moment_y = total_moment_y + atom.weight * atom.y * atom.y
         
     | 
| 
      
 744 
     | 
    
         
            +
                    total_moment_z = total_moment_z + atom.weight * atom.z * atom.z
         
     | 
| 
      
 745 
     | 
    
         
            +
                  end
         
     | 
| 
      
 746 
     | 
    
         
            +
                  return total_moment_x * total_moment_y * total_moment_z
         
     | 
| 
      
 747 
     | 
    
         
            +
                end
         
     | 
| 
      
 748 
     | 
    
         
            +
                def entropy_trans temperature
         
     | 
| 
      
 749 
     | 
    
         
            +
                  return 76.57 + 12.47 * Math.log10(weight) + 20.79 * Math.log10(temperature)
         
     | 
| 
      
 750 
     | 
    
         
            +
                end
         
     | 
| 
      
 751 
     | 
    
         
            +
                def entropy_rotate temperature, sigma
         
     | 
| 
      
 752 
     | 
    
         
            +
                  return 877.37 + 8.3144 * (Math.log10(moment) + Math.log10(temperature) - Math.log10(sigma))
         
     | 
| 
      
 753 
     | 
    
         
            +
                end
         
     | 
| 
      
 754 
     | 
    
         
            +
                def entropy temperature
         
     | 
| 
      
 755 
     | 
    
         
            +
                  return entropy_trans(temperature)
         
     | 
| 
      
 756 
     | 
    
         
            +
                end
         
     | 
| 
      
 757 
     | 
    
         
            +
                def valency
         
     | 
| 
      
 758 
     | 
    
         
            +
                  total_valency = 0
         
     | 
| 
      
 759 
     | 
    
         
            +
                  @atoms.each do |key, atom|
         
     | 
| 
      
 760 
     | 
    
         
            +
                    total_valency = total_valency + atom.valency
         
     | 
| 
      
 761 
     | 
    
         
            +
                  end
         
     | 
| 
      
 762 
     | 
    
         
            +
                  total_valency
         
     | 
| 
      
 763 
     | 
    
         
            +
                end
         
     | 
| 
      
 764 
     | 
    
         
            +
                def valency2
         
     | 
| 
      
 765 
     | 
    
         
            +
                  total_valency2 = 0
         
     | 
| 
      
 766 
     | 
    
         
            +
                  @atoms.each do |key, atom|
         
     | 
| 
      
 767 
     | 
    
         
            +
                    total_valency2 = total_valency2 + atom.valency2
         
     | 
| 
      
 768 
     | 
    
         
            +
                  end
         
     | 
| 
      
 769 
     | 
    
         
            +
                  total_valency2 / 2 + 1
         
     | 
| 
      
 770 
     | 
    
         
            +
                end
         
     | 
| 
      
 771 
     | 
    
         
            +
                def near one, distance
         
     | 
| 
      
 772 
     | 
    
         
            +
                  @atoms.each do |key, another|
         
     | 
| 
      
 773 
     | 
    
         
            +
                    puts '.'
         
     | 
| 
      
 774 
     | 
    
         
            +
                    puts ((another.x - one.x) * (another.x - one.x) +
         
     | 
| 
      
 775 
     | 
    
         
            +
                            (another.y - one.y) * (another.y - one.y) +
         
     | 
| 
      
 776 
     | 
    
         
            +
                            (another.z + one.z) * (another.z - one.z)).to_s
         
     | 
| 
      
 777 
     | 
    
         
            +
                    if ((another.x - one.x) * (another.x - one.x) +
         
     | 
| 
      
 778 
     | 
    
         
            +
                          (another.y - one.y) * (another.y - one.y) +
         
     | 
| 
      
 779 
     | 
    
         
            +
                          (another.z + one.z) * (another.z - one.z)) < distance * distance
         
     | 
| 
      
 780 
     | 
    
         
            +
                      yield another
         
     | 
| 
      
 781 
     | 
    
         
            +
                    end
         
     | 
| 
      
 782 
     | 
    
         
            +
                  end
         
     | 
| 
      
 783 
     | 
    
         
            +
                end
         
     | 
| 
      
 784 
     | 
    
         
            +
                def to_xyz
         
     | 
| 
      
 785 
     | 
    
         
            +
                  s = @atoms.length.to_s + "\n"
         
     | 
| 
      
 786 
     | 
    
         
            +
                  s = s + "*\n"
         
     | 
| 
      
 787 
     | 
    
         
            +
                  @atoms.each do |key, atom|
         
     | 
| 
      
 788 
     | 
    
         
            +
                    s = s + sprintf("%2s% 8.3f% 8.3f% 8.3f\n", atom.element, atom.x, atom.y, atom.z)
         
     | 
| 
      
 789 
     | 
    
         
            +
                  end
         
     | 
| 
      
 790 
     | 
    
         
            +
                  s
         
     | 
| 
      
 791 
     | 
    
         
            +
                end
         
     | 
| 
      
 792 
     | 
    
         
            +
                def process_link_line line, last_link
         
     | 
| 
      
 793 
     | 
    
         
            +
                  /\// =~ line
         
     | 
| 
      
 794 
     | 
    
         
            +
                  major_no =  $`.to_i
         
     | 
| 
      
 795 
     | 
    
         
            +
                  /\// =~ $'
         
     | 
| 
      
 796 
     | 
    
         
            +
                  parameters = Hash.new
         
     | 
| 
      
 797 
     | 
    
         
            +
                  minor_no = $'.chop.chop.split ','
         
     | 
| 
      
 798 
     | 
    
         
            +
                  $`.split(',').each do |p|
         
     | 
| 
      
 799 
     | 
    
         
            +
                    /=/ =~ p
         
     | 
| 
      
 800 
     | 
    
         
            +
                    parameters[$`.to_i] = $'.to_i
         
     | 
| 
      
 801 
     | 
    
         
            +
                  end
         
     | 
| 
      
 802 
     | 
    
         
            +
                  goto = 0
         
     | 
| 
      
 803 
     | 
    
         
            +
                  if /\((-?\d+)/ =~ minor_no.last
         
     | 
| 
      
 804 
     | 
    
         
            +
                    minor_no[-1] = $`
         
     | 
| 
      
 805 
     | 
    
         
            +
                    goto = $+.to_i
         
     | 
| 
      
 806 
     | 
    
         
            +
                  end
         
     | 
| 
      
 807 
     | 
    
         
            +
                  stop = false
         
     | 
| 
      
 808 
     | 
    
         
            +
                  major_links = Array.new
         
     | 
| 
      
 809 
     | 
    
         
            +
                  minor_no.each do |minor|
         
     | 
| 
      
 810 
     | 
    
         
            +
                    link = Link.new(major_no, minor.to_i, parameters, goto, self)# if(major_no == 1 && minor == '1')
         
     | 
| 
      
 811 
     | 
    
         
            +
                    major_links.push link
         
     | 
| 
      
 812 
     | 
    
         
            +
                  end
         
     | 
| 
      
 813 
     | 
    
         
            +
                  major_links
         
     | 
| 
      
 814 
     | 
    
         
            +
                end
         
     | 
| 
      
 815 
     | 
    
         
            +
                def read_link
         
     | 
| 
      
 816 
     | 
    
         
            +
                  @links = Array.new
         
     | 
| 
      
 817 
     | 
    
         
            +
                  while(/[*]{10}/ !~ @input.readline)
         
     | 
| 
      
 818 
     | 
    
         
            +
                    ;
         
     | 
| 
      
 819 
     | 
    
         
            +
                  end
         
     | 
| 
      
 820 
     | 
    
         
            +
                  while(/[*]{10}/ !~ @input.readline)
         
     | 
| 
      
 821 
     | 
    
         
            +
                    ;
         
     | 
| 
      
 822 
     | 
    
         
            +
                  end
         
     | 
| 
      
 823 
     | 
    
         
            +
                  while /[%]/ =~ @input.readline
         
     | 
| 
      
 824 
     | 
    
         
            +
                    ;
         
     | 
| 
      
 825 
     | 
    
         
            +
                  end
         
     | 
| 
      
 826 
     | 
    
         
            +
                  @input.readline if / Will use up to/ =~ $_
         
     | 
| 
      
 827 
     | 
    
         
            +
                  @input.readline# # RHF/6-31G(d) Pop=Full Test
         
     | 
| 
      
 828 
     | 
    
         
            +
                  @input.readline# ----------------------------
         
     | 
| 
      
 829 
     | 
    
         
            +
                  while(/(--+)|( Leave Link)/ !~ @input.readline)
         
     | 
| 
      
 830 
     | 
    
         
            +
                    if /^$/ =~ $_
         
     | 
| 
      
 831 
     | 
    
         
            +
                      @input.readline
         
     | 
| 
      
 832 
     | 
    
         
            +
                      @input.readline
         
     | 
| 
      
 833 
     | 
    
         
            +
                      @input.readline
         
     | 
| 
      
 834 
     | 
    
         
            +
                      @input.readline
         
     | 
| 
      
 835 
     | 
    
         
            +
                    end
         
     | 
| 
      
 836 
     | 
    
         
            +
                    if(@links.last != nil)
         
     | 
| 
      
 837 
     | 
    
         
            +
                      last = @links.last.last
         
     | 
| 
      
 838 
     | 
    
         
            +
                    else
         
     | 
| 
      
 839 
     | 
    
         
            +
                      last = nil
         
     | 
| 
      
 840 
     | 
    
         
            +
                    end
         
     | 
| 
      
 841 
     | 
    
         
            +
                    link =  process_link_line $_, last
         
     | 
| 
      
 842 
     | 
    
         
            +
                    @links.push link
         
     | 
| 
      
 843 
     | 
    
         
            +
                    #        puts link
         
     | 
| 
      
 844 
     | 
    
         
            +
                  end
         
     | 
| 
      
 845 
     | 
    
         
            +
                  last_link = nil
         
     | 
| 
      
 846 
     | 
    
         
            +
                  @links.each do |link|
         
     | 
| 
      
 847 
     | 
    
         
            +
                    link.each do |minor_link|
         
     | 
| 
      
 848 
     | 
    
         
            +
                      if (last_link != nil)
         
     | 
| 
      
 849 
     | 
    
         
            +
                        last_link.default_link = minor_link
         
     | 
| 
      
 850 
     | 
    
         
            +
                        if minor_link.goto > 0
         
     | 
| 
      
 851 
     | 
    
         
            +
                          minor_link.jump_link = @links[@links.index(link) + minor_link.goto + 1].first
         
     | 
| 
      
 852 
     | 
    
         
            +
                        elsif minor_link.goto < 0
         
     | 
| 
      
 853 
     | 
    
         
            +
                          minor_link.jump_link = @links[@links.index(link) + minor_link.goto].first
         
     | 
| 
      
 854 
     | 
    
         
            +
                        end
         
     | 
| 
      
 855 
     | 
    
         
            +
                      end
         
     | 
| 
      
 856 
     | 
    
         
            +
                      last_link = minor_link
         
     | 
| 
      
 857 
     | 
    
         
            +
                    end
         
     | 
| 
      
 858 
     | 
    
         
            +
                  end
         
     | 
| 
      
 859 
     | 
    
         
            +
                end
         
     | 
| 
      
 860 
     | 
    
         
            +
                def include? major, minor, parameter
         
     | 
| 
      
 861 
     | 
    
         
            +
                  @links.each do | link |
         
     | 
| 
      
 862 
     | 
    
         
            +
                    link.each do |minor_link|
         
     | 
| 
      
 863 
     | 
    
         
            +
                      if parameter
         
     | 
| 
      
 864 
     | 
    
         
            +
                        if(minor_link.major_number == major &&
         
     | 
| 
      
 865 
     | 
    
         
            +
                             minor_link.minor_number == minor &&
         
     | 
| 
      
 866 
     | 
    
         
            +
                             minor_link.parameters.has_key?(parameter))
         
     | 
| 
      
 867 
     | 
    
         
            +
                          return true
         
     | 
| 
      
 868 
     | 
    
         
            +
                        end
         
     | 
| 
      
 869 
     | 
    
         
            +
                      else
         
     | 
| 
      
 870 
     | 
    
         
            +
                        if(minor_link.major_number == major && minor_link.minor_number == minor)
         
     | 
| 
      
 871 
     | 
    
         
            +
                          return true
         
     | 
| 
      
 872 
     | 
    
         
            +
                        end
         
     | 
| 
      
 873 
     | 
    
         
            +
                      end
         
     | 
| 
      
 874 
     | 
    
         
            +
                    end
         
     | 
| 
      
 875 
     | 
    
         
            +
                  end
         
     | 
| 
      
 876 
     | 
    
         
            +
                  false
         
     | 
| 
      
 877 
     | 
    
         
            +
                end
         
     | 
| 
      
 878 
     | 
    
         
            +
                def puts_links
         
     | 
| 
      
 879 
     | 
    
         
            +
                  @links.each do | link |
         
     | 
| 
      
 880 
     | 
    
         
            +
                    puts link
         
     | 
| 
      
 881 
     | 
    
         
            +
                  end
         
     | 
| 
      
 882 
     | 
    
         
            +
                end
         
     | 
| 
      
 883 
     | 
    
         
            +
              end
         
     | 
| 
      
 884 
     | 
    
         
            +
             
     | 
| 
      
 885 
     | 
    
         
            +
              if __FILE__ == $0
         
     | 
| 
      
 886 
     | 
    
         
            +
                gr = GaussianResult.new(File.open(ARGV.shift), false)
         
     | 
| 
      
 887 
     | 
    
         
            +
                puts gr.entropy 256
         
     | 
| 
      
 888 
     | 
    
         
            +
                valency = 0
         
     | 
| 
      
 889 
     | 
    
         
            +
                puts 'entropy : ' + gr.entropy(276).to_s
         
     | 
| 
      
 890 
     | 
    
         
            +
                puts 'eigen_value : ' + gr.homo.eigen_value.to_s
         
     | 
| 
      
 891 
     | 
    
         
            +
                gr.atoms.keys.sort.each do |atom_num|
         
     | 
| 
      
 892 
     | 
    
         
            +
                  #    puts gr.atoms[atom_num].to_condensed_density
         
     | 
| 
      
 893 
     | 
    
         
            +
                  #      gr.atoms[atom_num].each_ao do |ao|
         
     | 
| 
      
 894 
     | 
    
         
            +
                  #        puts ao
         
     | 
| 
      
 895 
     | 
    
         
            +
                  #      end
         
     | 
| 
      
 896 
     | 
    
         
            +
                end
         
     | 
| 
      
 897 
     | 
    
         
            +
                puts '--------------- Print Out Molecular Orbitals---------------'
         
     | 
| 
      
 898 
     | 
    
         
            +
                #    gr.mo.keys.sort.each do |mo_key|
         
     | 
| 
      
 899 
     | 
    
         
            +
                #      puts gr.mo[mo_key].to_s
         
     | 
| 
      
 900 
     | 
    
         
            +
                #    end
         
     | 
| 
      
 901 
     | 
    
         
            +
                #    puts gr.homo
         
     | 
| 
      
 902 
     | 
    
         
            +
                #    puts gr.lumo
         
     | 
| 
      
 903 
     | 
    
         
            +
                #  printf "energy : %f\n", gr.energy
         
     | 
| 
      
 904 
     | 
    
         
            +
                #  puts gr.valency
         
     | 
| 
      
 905 
     | 
    
         
            +
                #  puts gr.valency2
         
     | 
| 
      
 906 
     | 
    
         
            +
                File.open("test.xyz", "w").puts gr.to_xyz
         
     | 
| 
      
 907 
     | 
    
         
            +
              end
         
     | 
| 
      
 908 
     | 
    
         
            +
              end # end of G98 module
         
     | 
| 
      
 909 
     | 
    
         
            +
            end
         
     |