From 95d21fe1659e46d12a3c8a80abeeb150d023c969 Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Mon, 9 Dec 2024 20:59:34 -0700 Subject: [PATCH 01/10] . --- tests/test_functional_groups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_functional_groups.py b/tests/test_functional_groups.py index 5625e091..5e45ecb5 100644 --- a/tests/test_functional_groups.py +++ b/tests/test_functional_groups.py @@ -934,7 +934,7 @@ def test_is_amide(): "Cobalt(II) sulfate", "CoO", "Copper(I) bromide", "Copper(I) chloride", "Copper(I) fluoride", "Copper(II) azide", "Copper(II) bromide", "Copper(II) carbonate", "Copper(II) chloride", "Copper(II) nitrate", "Copper(II) oxide", "Copper(II) sulfate", "Copper(II) sulfide", "Copper(I) oxide", "Copper(I) sulfate", "Copper(I) sulfide", "Copper oxychloride", "Cr", "Cr2O3", "CrO2", "CrO3", "Cs", "Cu", "Cu2O", "CuO", "Curium(III) oxide", - "Cyanogen", "Cyanogen bromide", "Cyanogen chloride", "Cyanogen iodide", "Diammonium phosphate", "Diborane", "Diboron tetrafluoride", + "Cyanogen", "Cyanogen bromide", "Cyanogen chloride", "Cyanogen iodide", "Diammonium phosphate", "Diboron tetrafluoride", "Dichlorine heptoxide", "Dichlorine monoxide", "Dichlorine tetroxide (chlorine perchlorate)", "Dichlorosilane", "Dimagnesium phosphate", "Dinitrogen pentoxide (nitronium nitrate)", "Dinitrogen tetrafluoride", "Dinitrogen tetroxide", "Dinitrogen trioxide", "Diphosphorus tetrafluoride", "Diphosphorus tetraiodide", "Disilane", "Disulfur decafluoride", "Dy", "Dy2O3", "Dysprosium(III) chloride", "Er", "Er2O3", "Erbium(III) chloride", "Es", From 7642f4c22d459ec32d355a70136a8ed6f4bc1c1f Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Fri, 13 Dec 2024 09:53:09 -0700 Subject: [PATCH 02/10] Code cleanup --- tests/Data/joback_log_good_sorted.txt | 1 - tests/test_chemical.py | 2 +- tests/test_heat_capacity.py | 11 +++++++++++ thermo/electrochem.py | 4 +--- thermo/utils/t_dependent_property.py | 3 +++ 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/tests/Data/joback_log_good_sorted.txt b/tests/Data/joback_log_good_sorted.txt index dc7650b3..e564f14c 100644 --- a/tests/Data/joback_log_good_sorted.txt +++ b/tests/Data/joback_log_good_sorted.txt @@ -2321,7 +2321,6 @@ Did not match all atoms present 110690-43-2 CCOCN1C=C(C(=O)N(C1=O)C(=O)C2=CC(=CC Did not match all atoms present 1107-00-2 C1=CC2=C(C=C1C(C3=CC4=C(C=C3)C(=O)OC4=O)(C(F)(F)F)C(F)(F)F)C(=O)OC2=O {16: 6, 28: 4, 4: 3, 14: 6} Did not match all atoms present 1107-69-3 C/C(=N\NC1=C(C=C(C=C1)[N+](=O)[O-])[N+](=O)[O-])/C=N/NC2=C(C=C(C=C2)[N+](=O)[O-])[N+](=O)[O-] {1: 1, 34: 2, 38: 4, 6: 1, 7: 1, 14: 6, 31: 2} Did not match all atoms present 110720-66-6 [C@@H]([C@H](C(=O)[O-])O)(C(=O)[O-])O.[Ca+2] {24: 2, 3: 2, 20: 2} -Did not match all atoms present 11073-85-1 [Ge].[Te] {} Did not match all atoms present 110735-99-4 C(COC(=O)CC(C(=O)OCCC(C(C(C(C(C(F)(F)F)(F)F)(F)F)(F)F)(F)F)(F)F)S(=O)(=O)[O-])C(C(C(C(C(C(F)(F)F)(F)F)(F)F)(F)F)(F)F)(F)F.[Na+] {2: 5, 3: 1, 4: 12, 16: 26, 28: 2, 29: 3} Did not match all atoms present 110736-41-9 O.O.O.[Fe].[Fe] {} Did not match all atoms present 11075-28-8 C1=CC=C2C(=C1)C(=O)C3=C(C=CC(=C3C2=O)NCC(CCl)O)NCC(CCl)O {2: 4, 3: 2, 14: 6, 17: 2, 20: 2, 25: 2, 31: 2} diff --git a/tests/test_chemical.py b/tests/test_chemical.py index a6e01c54..90a3c8ac 100644 --- a/tests/test_chemical.py +++ b/tests/test_chemical.py @@ -292,7 +292,7 @@ def test_H_Chemical(): @pytest.mark.meta_Chemical @pytest.mark.deprecated def test_all_chemicals(): - for i in pubchem_db.CAS_index.values(): + for i in pubchem_db: c = Chemical(i.CASs) print(i.CASs) diff --git a/tests/test_heat_capacity.py b/tests/test_heat_capacity.py index 996a0f32..eab33fc4 100644 --- a/tests/test_heat_capacity.py +++ b/tests/test_heat_capacity.py @@ -874,6 +874,7 @@ def test_JANAF_fit_carbon_exists(): @pytest.mark.slow @pytest.mark.fuzz +@pytest.mark.meta_T_dept def test_locked_integral(): obj = HeatCapacityGas(load_data=False, CASRN="7732-18-5", similarity_variable=0.16652530518537598, MW=18.01528, extrapolation="linear", method="POLY_FIT", @@ -888,6 +889,7 @@ def test_locked_integral(): @pytest.mark.slow @pytest.mark.fuzz +@pytest.mark.meta_T_dept def test_locked_integral_over_T(): obj = HeatCapacityGas(load_data=False, CASRN="7732-18-5", similarity_variable=0.16652530518537598, MW=18.01528, extrapolation="linear", method="POLY_FIT", poly_fit=(50.0, 1000.0, [5.543665000518528e-22, -2.403756749600872e-18, 4.2166477594350336e-15, -3.7965208514613565e-12, 1.823547122838406e-09, -4.3747690853614695e-07, 5.437938301211039e-05, -0.003220061088723078, 33.32731489750759])) @@ -899,3 +901,12 @@ def to_int(T): quad_ans = quad(to_int, T1, T2)[0] analytical_ans = obj.T_dependent_property_integral_over_T(T1, T2) assert_close(quad_ans, analytical_ans, rtol=1e-5) + +@pytest.mark.meta_T_dept +def test_heat_capacity_interp1d_removed_extrapolation_method_compatibility(): + EtOH = HeatCapacityGas(CASRN='64-17-5', similarity_variable=0.1953615, MW=46.06844, extrapolation='interp1d', method='POLING_POLY') + assert_close(EtOH(EtOH.Tmin - 10), 37.421995400002054) + assert_close(EtOH(EtOH.Tmax + 10), 142.81153700770574) + EtOH = HeatCapacityGas(CASRN='64-17-5', similarity_variable=0.1953615, MW=46.06844, extrapolation='interp1d|interp1d', method='POLING_POLY') + assert_close(EtOH(EtOH.Tmin - 10), 37.421995400002054) + assert_close(EtOH(EtOH.Tmax + 10), 142.81153700770574) \ No newline at end of file diff --git a/thermo/electrochem.py b/thermo/electrochem.py index d03e716c..b38025a6 100644 --- a/thermo/electrochem.py +++ b/thermo/electrochem.py @@ -749,8 +749,6 @@ def Laliberte_heat_capacity_mix(T, ws, a1s, a2s, a3s, a4s, a5s, a6s): Temperature of fluid [K] ws : array Weight fractions of fluid components other than water - CASRNs : array - CAS numbers of the fluid components other than water Returns ------- @@ -798,7 +796,7 @@ def Laliberte_heat_capacity(T, ws, CASRNs): Temperature of fluid [K] ws : array Weight fractions of fluid components other than water - CASRNs : array + CASRNs : list[str] CAS numbers of the fluid components other than water Returns diff --git a/thermo/utils/t_dependent_property.py b/thermo/utils/t_dependent_property.py index 67d3af4f..ec6285ea 100644 --- a/thermo/utils/t_dependent_property.py +++ b/thermo/utils/t_dependent_property.py @@ -4264,6 +4264,9 @@ def extrapolation(self): @extrapolation.setter def extrapolation(self, extrapolation): + # backwards compatibility + if extrapolation is not None: + extrapolation = extrapolation.replace('interp1d', 'linear') self._extrapolation = extrapolation if extrapolation is None: self.extrapolation_split = False From 1995cdcc7a6f1a30b185be0c6592893b9102fbba Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Tue, 17 Dec 2024 14:57:51 -0700 Subject: [PATCH 03/10] First working PPR78 --- tests/test_ppr78.py | 566 +++++++++++++++++++++++++++++ thermo/group_contribution/ppr78.py | 442 ++++++++++++++++++++++ 2 files changed, 1008 insertions(+) create mode 100644 tests/test_ppr78.py create mode 100644 thermo/group_contribution/ppr78.py diff --git a/tests/test_ppr78.py b/tests/test_ppr78.py new file mode 100644 index 00000000..4a522e78 --- /dev/null +++ b/tests/test_ppr78.py @@ -0,0 +1,566 @@ +'''Chemical Engineering Design Library (ChEDL). Utilities for process modeling. +Copyright (C) 2024, Caleb Bell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +''' +from math import * + +import pytest +from fluids.numerics import * + +from thermo import Chemical +from thermo.group_contribution.group_contribution_base import smarts_fragment_priority +from thermo.group_contribution.ppr78 import PPR78_kij, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID +try: + import rdkit + from rdkit import Chem +except: + rdkit = None + +def test_ppr78_kij_propane_butane(): + """ + Test PPR78_kij function against the example calculation from the paper for + propane(1)/n-butane(2) system at T = 303.15 K. + + Values taken from: + Jaubert, J.-N., and Fabrice Mutelet. "VLE Predictions with the Peng-Robinson + Equation of State and Temperature Dependent Kij Calculated through a Group + Contribution Method." Fluid Phase Equilibria 224, no. 2 (2004): 285-304. + """ + # Test conditions from paper + T = 303.15 # K + + # Molecule group compositions + molecule1_groups = { + "CH3": 2, # propane has 2 CH3 groups + "CH2": 1 # propane has 1 CH2 group + } + + molecule2_groups = { + "CH3": 2, # n-butane has 2 CH3 groups + "CH2": 2 # n-butane has 2 CH2 groups + } + + # Critical properties and acentric factors from paper + Tc1 = 369.83 # K (propane) + Pc1 = 42.48e5 # Pa + omega1 = 0.152 + + Tc2 = 425.12 # K (n-butane) + Pc2 = 37.96e5 # Pa + omega2 = 0.200 + + # Calculate kij + kij = PPR78_kij(T, molecule1_groups, molecule2_groups, + Tc1, Pc1, omega1, Tc2, Pc2, omega2) + + # Expected value from paper + expected_kij = 0.0028 + + # Test with reasonable tolerance due to potential rounding differences + assert_close(kij, expected_kij, atol=0.00005) + + # Check group fractions + alpha_11 = 2/3 # CH3 fraction in propane + alpha_12 = 1/3 # CH2 fraction in propane + alpha_21 = 1/2 # CH3 fraction in butane + alpha_22 = 1/2 # CH2 fraction in butane + + # Calculate fractions from our function inputs for verification + calc_alpha_11 = molecule1_groups["CH3"] / sum(molecule1_groups.values()) + calc_alpha_12 = molecule1_groups["CH2"] / sum(molecule1_groups.values()) + calc_alpha_21 = molecule2_groups["CH3"] / sum(molecule2_groups.values()) + calc_alpha_22 = molecule2_groups["CH2"] / sum(molecule2_groups.values()) + + # Verify group fractions + assert_close(calc_alpha_11, alpha_11, rtol=1e-10) + assert_close(calc_alpha_12, alpha_12, rtol=1e-10) + assert_close(calc_alpha_21, alpha_21, rtol=1e-10) + assert_close(calc_alpha_22, alpha_22, rtol=1e-10) + +def test_ppr78_kijs_matrix(): + """ + Test PPR78_kijs matrix calculation for a propane/n-butane/n-pentane system. + """ + T = 303.15 # K + + # Molecule group compositions + groups = [ + {"CH3": 2, "CH2": 1}, # propane + {"CH3": 2, "CH2": 2}, # n-butane + {"CH3": 2, "CH2": 3}, # n-pentane + ] + + # Critical properties and acentric factors + Tcs = [369.83, 425.12, 469.70] # K + Pcs = [42.48e5, 37.96e5, 33.70e5] # Pa + omegas = [0.152, 0.200, 0.252] + + # Calculate full kij matrix + kij_matrix = PPR78_kijs(T, groups, Tcs, Pcs, omegas) + + # Test matrix properties + assert len(kij_matrix) == 3, "Matrix should be 3x3" + assert all(len(row) == 3 for row in kij_matrix), "Matrix should be square" + + assert_close2d(kij_matrix, [[0.0, 0.0027994360072542274, 0.006933513208806096], + [0.0027994360072542274, 0.0, 0.000827218293750849], + [0.006933513208806096, 0.000827218293750849, 0.0]], + rtol=1e-7) + +def readable_assignment(assignment): + return {PPR78_GROUPS_BY_ID[i].group : v for i, v in assignment.items()} + +@pytest.mark.rdkit +@pytest.mark.skipif(rdkit is None, reason="requires rdkit") +def test_table_2_2005_paper_compounds(): + '''Jaubert, Jean-Noël, Stéphane Vitu, Fabrice Mutelet, and Jean-Pierre Corriou. + "Extension of the PPR78 Model (Predictive 1978, Peng-Robinson EOS with Temperature + Dependent Kij Calculated through a Group Contribution Method) to Systems Containing + Aromatic Compounds." Fluid Phase Equilibria 237, no. 1-2 (October 25, 2005): + 193-211. doi:10.1016/j.fluid.2005.09.003. + ''' + rdkitmol = Chemical('nitrogen').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'N2': 1} + assert success + rdkitmol = Chemical('carbon dioxide').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CO2': 1} + assert success + + rdkitmol = Chemical('hydrogen sulfide').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'H2S': 1} + assert success + + + rdkitmol = Chemical('methane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH4': 1} + assert success + + + # Ethane - should use the specific C2H6 group + rdkitmol = Chemical('ethane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'C2H6': 1} + assert success + + # Propane - should be CH3-CH2-CH3 + rdkitmol = Chemical('propane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 1} + assert success + + # n-Butane - should be CH3-CH2-CH2-CH3 + rdkitmol = Chemical('butane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 2} + assert success + + + # n-Pentane (CH3-CH2-CH2-CH2-CH3) + rdkitmol = Chemical('pentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 3} + assert success + + # 2-Methyl butane (iso-pentane) (CH3-CH(CH3)-CH2-CH3) + rdkitmol = Chemical('2-methylbutane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 1} + assert success + + # 2,2-Dimethyl propane (neo-pentane) ((CH3)4-C) + rdkitmol = Chemical('2,2-dimethylpropane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'C': 1} + assert success + + # n-Hexane (CH3-CH2-CH2-CH2-CH2-CH3) + rdkitmol = Chemical('hexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 4} + assert success + + # 2-Methyl pentane (CH3-CH(CH3)-CH2-CH2-CH3) + rdkitmol = Chemical('2-methylpentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} + assert success + + # 3-Methyl pentane (CH3-CH2-CH(CH3)-CH2-CH3) + rdkitmol = Chemical('3-methylpentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} + assert success + + # 2,2-Dimethyl butane (CH3-C(CH3)2-CH2-CH3) + rdkitmol = Chemical('2,2-dimethylbutane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'C': 1, 'CH2': 1} + assert success + + # 2,3-Dimethyl butane (CH3-CH(CH3)-CH(CH3)-CH3) + rdkitmol = Chemical('2,3-dimethylbutane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2} + assert success + + # Benzene (C6H6) + rdkitmol = Chemical('benzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 6} + assert success + + # n-Heptane (CH3-CH2-CH2-CH2-CH2-CH2-CH3) + rdkitmol = Chemical('heptane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 5} + assert success + + # 3-Methyl hexane (CH3-CH2-CH(CH3)-CH2-CH2-CH3) + rdkitmol = Chemical('3-methylhexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 3} + assert success + + # 2,3-Dimethyl pentane (CH3-CH(CH3)-CH(CH3)-CH2-CH3) + rdkitmol = Chemical('2,3-dimethylpentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 1} + assert success + + # 2,4-Dimethyl pentane (CH3-CH(CH3)-CH2-CH(CH3)-CH3) + rdkitmol = Chemical('2,4-dimethylpentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 1} + assert success + + # 2,2,3-Trimethyl butane (CH3-C(CH3)2-CH(CH3)-CH3) + rdkitmol = Chemical('2,2,3-trimethylbutane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 5, 'CH': 1, 'C': 1} + assert success + + # 2,2,4-Trimethyl pentane (iso-octane) (CH3-C(CH3)2-CH2-CH(CH3)-CH3) + rdkitmol = Chemical('2,2,4-trimethylpentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 5, 'CH': 1, 'C': 1, 'CH2': 1} + assert success + + # Methyl benzene (toluene) (C6H5-CH3) + rdkitmol = Chemical('toluene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH3': 1} + assert success + + # n-Octane (CH3-(CH2)6-CH3) + rdkitmol = Chemical('octane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 6} + assert success + + # 2,2,5-Trimethyl hexane (CH3-CH2-CH2-CH(CH3)-C(CH3)2-CH3) + rdkitmol = Chemical('2,2,5-trimethylhexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 5, 'CH': 1, 'C': 1, 'CH2': 2} + assert success + + # Ethyl benzene (C6H5-CH2-CH3) + rdkitmol = Chemical('ethylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 1, 'CH3': 1} + assert success + + # 1,4-Dimethyl benzene (para-xylene) + rdkitmol = Chemical('p-xylene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} + assert success + + # 1,3-Dimethyl benzene (meta-xylene) + rdkitmol = Chemical('m-xylene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} + assert success + + # 1,2-Dimethyl benzene (ortho-xylene) + rdkitmol = Chemical('o-xylene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} + assert success + + # n-Propyl benzene (C6H5-CH2-CH2-CH3) + rdkitmol = Chemical('propylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 2, 'CH3': 1} + assert success + + # Isopropyl benzene (cumene) (C6H5-CH(CH3)2) + rdkitmol = Chemical('isopropylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH': 1, 'CH3': 2} + assert success + + # 1,3,5-Trimethyl benzene (mesitylene) + rdkitmol = Chemical('1,3,5-trimethylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} + assert success + + # 1,2,4-Trimethyl benzene + rdkitmol = Chemical('1,2,4-trimethylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} + assert success + + # Naphthalene (C10H8) + rdkitmol = Chemical('naphthalene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 8, 'Cfused_aromatic': 2} + assert success + + # n-Nonane (CH3-(CH2)7-CH3) + rdkitmol = Chemical('nonane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 7} + assert success + + # 2,2-Dimethyl heptane (CH3-CH2-CH2-CH2-CH2-C(CH3)2-CH3) + rdkitmol = Chemical('2,2-dimethylheptane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'C': 1, 'CH2': 4} + assert success + + # Butyl benzene (C6H5-CH2-CH2-CH2-CH3) + rdkitmol = Chemical('butylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 3, 'CH3': 1} + assert success + + # Tertiobutyl benzene (C6H5-C(CH3)3) + rdkitmol = Chemical('t-butylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'C': 1, 'CH3': 3} + assert success + + # 1-Methyl naphthalene + rdkitmol = Chemical('1-methylnaphthalene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 7, 'Cfused_aromatic': 2, 'Caro': 1, 'CH3': 1} + assert success + + # Long chain n-alkanes + alkanes = { + 'decane': {'CH3': 2, 'CH2': 8}, + 'dodecane': {'CH3': 2, 'CH2': 10}, + 'tridecane': {'CH3': 2, 'CH2': 11}, + 'tetradecane': {'CH3': 2, 'CH2': 12}, + 'pentadecane': {'CH3': 2, 'CH2': 13}, + 'hexadecane': {'CH3': 2, 'CH2': 14}, + 'heptadecane': {'CH3': 2, 'CH2': 15} + } + + for name, expected in alkanes.items(): + rdkitmol = Chemical(name).rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == expected + assert success + + # Phenanthrene (C14H10) + rdkitmol = Chemical('phenanthrene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 10, 'Cfused_aromatic': 4} + assert success + + +@pytest.mark.rdkit +@pytest.mark.skipif(rdkit is None, reason="requires rdkit") +def test_extension_naphtenic(): + '''Vitu, Stéphane, Jean-Noël Jaubert, and Fabrice Mutelet. "Extension of the PPR78 Model + (Predictive 1978, Peng–Robinson EOS with Temperature Dependent Kij Calculated through + a Group Contribution Method) to Systems Containing Naphtenic Compounds." + Fluid Phase Equilibria 243, no. 1-2 (May 10, 2006): 9-28. doi:10.1016/j.fluid.2006.02.004. + ''' + # 1,2,3-Trimethyl benzene + rdkitmol = Chemical('1,2,3-trimethylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} + assert success + + # 2,2,4,4,6,8,8-Heptamethyl nonane + rdkitmol = Chemical('2,2,4,4,6,8,8-heptamethylnonane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 9, 'CH': 1, 'C': 3, 'CH2': 3} + assert success + + # 3,4-Dimethyl hexane + rdkitmol = Chemical('3,4-dimethylhexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 2} + assert success + + # 3-Methyl pentane (already covered in previous tests, but including for completeness) + rdkitmol = Chemical('3-methylpentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} + assert success + + # 4-Methyl heptane + rdkitmol = Chemical('4-methylheptane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 4} + assert success + + # Biphenyl (phenyl benzene) + rdkitmol = Chemical('biphenyl').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 10, 'Caro': 2} + assert success + + # Cis-decalin + rdkitmol = Chemical('cis-decalin').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 8, 'CHcyclic': 2} + assert success + + # Cycloheptane + rdkitmol = Chemical('cycloheptane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 7} + assert success + + # Cyclohexane + rdkitmol = Chemical('cyclohexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 6} + assert success + + # Cyclooctane + rdkitmol = Chemical('cyclooctane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 8} + assert success + + # Cyclopentane + rdkitmol = Chemical('cyclopentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 5} + assert success + + # Ethyl cyclohexane + rdkitmol = Chemical('ethylcyclohexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH2': 1, 'CH3': 1} + assert success + + # Methyl cyclohexane + rdkitmol = Chemical('methylcyclohexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH3': 1} + assert success + + # Methyl cyclopentane + rdkitmol = Chemical('methylcyclopentane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 4, 'CHcyclic': 1, 'CH3': 1} + assert success + + # n-Butyl benzene + rdkitmol = Chemical('butylbenzene').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 3, 'CH3': 1} + assert success + + # n-Propyl cyclohexane + rdkitmol = Chemical('propylcyclohexane').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH2': 2, 'CH3': 1} + assert success + + # Tetralin (1,2,3,4-tetrahydronaphthalene) + rdkitmol = Chemical('tetralin').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'Cfused_aromatic': 2, 'CHaro': 4, 'CH2cyclic': 4} + assert success + + # Trans-decalin + rdkitmol = Chemical('trans-decalin').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH2cyclic': 8, 'CHcyclic': 2} + assert success + +@pytest.mark.rdkit +@pytest.mark.skipif(rdkit is None, reason="requires rdkit") +def test_SH_group(): + """Privat, Romain, Jean-Noël Jaubert, and Fabrice Mutelet. "Addition of + the Sulfhydryl Group (-SH) to the PPR78 Model (Predictive 1978, + Peng-Robinson EOS with Temperature Dependent kIj Calculated through + a Group Contribution Method)." The Journal of Chemical + Thermodynamics 40, no. 9 (September 1, 2008): 1331-41. + """ + # Methyl mercaptan (CH3-SH) + rdkitmol = Chemical('methanethiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 1, 'SH': 1} + assert success + + # Ethyl mercaptan (CH3-CH2-SH) + rdkitmol = Chemical('ethanethiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 1, 'CH2': 1, 'SH': 1} + assert success + + # Propyl mercaptan (CH3-CH2-CH2-SH) + rdkitmol = Chemical('propane-1-thiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 1, 'CH2': 2, 'SH': 1} + assert success + + # Butyl mercaptan (CH3-CH2-CH2-CH2-SH) + rdkitmol = Chemical('butane-1-thiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 1, 'CH2': 3, 'SH': 1} + assert success + + # Isopropyl mercaptan (CH3-CH(CH3)-SH) + rdkitmol = Chemical('propane-2-thiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH': 1, 'SH': 1} + assert success + + # Secbutyl mercaptan (CH3-CH2-CH(CH3)-SH) + rdkitmol = Chemical('butane-2-thiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 1, 'CH': 1, 'SH': 1} + assert success + + # Isobutyl mercaptan (CH3-CH(CH3)-CH2-SH) + rdkitmol = Chemical('2-methylpropane-1-thiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 2, 'CH': 1, 'CH2': 1, 'SH': 1} + assert success + + # Tertbutyl mercaptan ((CH3)3C-SH) + rdkitmol = Chemical('2-methylpropane-2-thiol').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) + assert readable_assignment(assignment) == {'CH3': 3, 'C': 1, 'SH': 1} + assert success \ No newline at end of file diff --git a/thermo/group_contribution/ppr78.py b/thermo/group_contribution/ppr78.py new file mode 100644 index 00000000..479c859c --- /dev/null +++ b/thermo/group_contribution/ppr78.py @@ -0,0 +1,442 @@ +'''Chemical Engineering Design Library (ChEDL). Utilities for process modeling. +Copyright (C) 2024 Caleb Bell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +This module contains an implementation of the PPR78 +group-contribution method. +This functionality requires the RDKit library to work. + +.. contents:: :local: + +.. autofunction:: thermo.group_contribution.PPR78_kij +.. autofunction:: thermo.group_contribution.PPR78_kijs + +''' +__all__ = ['PPR78_kij', 'PPR78_kijs', 'PPR78_GROUP_IDS', 'PPR78_INTERACTIONS', 'PPR78_GROUPS'] + +from thermo.unifac import priority_from_atoms +from math import sqrt +from fluids.constants import R + +SINGLE_BOND = 'single' +DOUBLE_BOND = 'double' +TRIPLE_BOND = 'triple ' +AROMATIC_BOND = 'aromatic' + +GROUP_ID_COUNTER = 1 + + + +class PPR78GroupContribution: + __slots__ = ('group', 'group_id', 'atoms', 'bonds', 'smarts', 'priority', 'hydrogen_from_smarts', 'smart_rdkit') + + def __init__(self, group, atoms=None, bonds=None, smarts=None, priority=None, hydrogen_from_smarts=False): + global GROUP_ID_COUNTER + self.group = group + self.atoms = atoms + self.bonds = bonds + self.smarts = smarts + self.priority = priority + self.group_id = GROUP_ID_COUNTER + self.hydrogen_from_smarts = hydrogen_from_smarts + self.smart_rdkit = None + GROUP_ID_COUNTER += 1 + + def __repr__(self): + return f"GroupContribution(group={self.group!r}, atoms={self.atoms!r}, bonds={self.bonds!r})" + +PPR78_GROUPS_BY_ID = {} +PPR78_GROUPS = {} +# The order of these statements is sensitive +PPR78_GROUPS['CH3'] = PPR78GroupContribution('CH3', smarts='[CX4;H3]', atoms={'C': 1, 'H': 3}, bonds={}) +PPR78_GROUPS['CH2'] = PPR78GroupContribution('CH2', smarts='[CX4;H2]', atoms={'C': 1, 'H': 2}, bonds={}) +PPR78_GROUPS['CH'] = PPR78GroupContribution('CH', smarts='[CX4;H1]', atoms={'C': 1, 'H': 1}, bonds={}) +PPR78_GROUPS['C'] = PPR78GroupContribution('C', smarts='[CX4;H0]', atoms={'C': 1, 'H': 0}, bonds={}) +# Specifically methane +PPR78_GROUPS['CH4'] = PPR78GroupContribution('CH4', atoms={'C': 1, 'H': 4}, bonds={}, smarts='[CX4H4]') +# Specifically ethane +PPR78_GROUPS['C2H6'] = PPR78GroupContribution('C2H6', atoms={'C': 2, 'H': 6}, bonds={}, smarts='[CH3X4]-[CH3X4]') +# messy ones, did some examples with all of these and they did make sense to me +PPR78_GROUPS['CHaro'] = PPR78GroupContribution('CHaro', atoms={'C': 1, 'H': 1}, bonds={AROMATIC_BOND: 2}, smarts='[cH]') +PPR78_GROUPS['Caro'] = PPR78GroupContribution('Caro', atoms={'C': 1}, bonds={AROMATIC_BOND: 2}, smarts='[c]') +PPR78_GROUPS['Cfused_aromatic'] = PPR78GroupContribution('Cfused_aromatic', atoms={'C': 1}, bonds={AROMATIC_BOND: 3}, smarts='[cR2]', priority=10000) +PPR78_GROUPS['CH2cyclic'] = PPR78GroupContribution('CH2cyclic', atoms={'C': 1, 'H': 2}, bonds={}, smarts='[CH2R]') +PPR78_GROUPS['CHcyclic'] = PPR78GroupContribution('CHcyclic', atoms={'C': 1, 'H': 1}, bonds={}, smarts='[CHR]') +# CO2, N2, H2S from PSRK +PPR78_GROUPS['CO2'] = PPR78GroupContribution('CO2', atoms={'C': 1, 'O': 2}, bonds={DOUBLE_BOND: 2}, smarts='[CX2H0](=[OX1H0])=[OX1H0]') +PPR78_GROUPS['N2'] = PPR78GroupContribution('N2', atoms={'N': 2}, bonds={TRIPLE_BOND: 1}, smarts='N#N') +PPR78_GROUPS['H2S'] = PPR78GroupContribution('H2S', atoms={'S': 1, 'H': 2}, bonds={}, smarts='[SH2]') + +PPR78_GROUPS['SH'] = PPR78GroupContribution('SH', atoms={'S': 1, 'H': 1}, bonds={}, smarts='[S;H1]') + +# Populate PPR78_GROUPS_BY_ID for easy lookup +for group in PPR78_GROUPS.values(): + if group.priority is None: + if group.atoms is not None: + group.priority = priority_from_atoms(group.atoms, group.bonds) + PPR78_GROUPS_BY_ID[group.group_id] = group + +catalog = PPR78_GROUPS.values() + + +# format A, B value indexed by tuple of groups +PPR78_INTERACTIONS = {} +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CH3'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CH2'])] = (74.81, 165.7) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CH'])] = (261.5, 388.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['C'])] = (396.7, 804.3) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CH4'])] = (32.94, -35.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['C2H6'])] = (8.579, -29.51) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CHaro'])] = (90.25, 146.1) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['Caro'])] = (62.80, 41.86) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['Cfused_aromatic'])] = (62.80, 41.86) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CH2cyclic'])] = (40.38, 95.90) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CHcyclic'])] = (98.48, 231.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['CO2'])] = (164.0, 269.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['N2'])] = (52.74, 87.19) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['H2S'])] = (158.4, 241.2) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH3'], PPR78_GROUPS['SH'])] = (799.9, 2109.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CH2'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CH'])] = (51.47, 79.61) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['C'])] = (88.53, 315.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CH4'])] = (36.72, 108.4) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['C2H6'])] = (31.23, 84.76) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CHaro'])] = (29.78, 58.17) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['Caro'])] = (3.775, 144.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['Cfused_aromatic'])] = (3.775, 144.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CH2cyclic'])] = (12.78, 28.37) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CHcyclic'])] = (-54.90, -319.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['CO2'])] = (136.9, 254.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['N2'])] = (82.28, 202.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['H2S'])] = (134.6, 138.3) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2'], PPR78_GROUPS['SH'])] = (459.5, 627.3) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['CH'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['C'])] = (-305.7, -250.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['CH4'])] = (145.2, 301.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['C2H6'])] = (174.3, 352.1) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['CHaro'])] = (103.3, 191.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['Caro'])] = (6.177, -33.97) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['Cfused_aromatic'])] = (6.177, -33.97) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['CH2cyclic'])] = (101.9, -90.93) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['CHcyclic'])] = (-226.5, -51.47) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['CO2'])] = (184.3, 762.1) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['N2'])] = (365.4, 521.9) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['H2S'])] = (193.9, 307.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH'], PPR78_GROUPS['SH'])] = (425.5, 514.7) + +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['C'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['CH4'])] = (263.9, 531.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['C2H6'])] = (333.2, 203.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['CHaro'])] = (158.9, 613.2) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['Caro'])] = (79.61, -326.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['Cfused_aromatic'])] = (79.61, -326.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['CH2cyclic'])] = (177.1, 601.9) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['CHcyclic'])] = (17.84, -109.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['CO2'])] = (287.9, 346.2) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['N2'])] = (263.9, 772.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['H2S'])] = (305.1, -143.1) +PPR78_INTERACTIONS[(PPR78_GROUPS['C'], PPR78_GROUPS['SH'])] = (682.9, 1544.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['CH4'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['C2H6'])] = (13.04, 6.863) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['CHaro'])] = (67.26, 167.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['Caro'])] = (139.3, 464.3) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['Cfused_aromatic'])] = (139.3, 464.3) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['CH2cyclic'])] = (36.37, 26.42) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['CHcyclic'])] = (40.15, 255.3) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['CO2'])] = (137.3, 194.2) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['N2'])] = (37.90, 37.2) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['H2S'])] = (181.2, 288.9) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH4'], PPR78_GROUPS['SH'])] = (706.0, 1483.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['C2H6'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['CHaro'])] = (41.18, 50.79) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['Caro'])] = (-3.088, 13.04) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['Cfused_aromatic'])] = (-3.088, 13.04) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['CH2cyclic'])] = (8.579, 76.86) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['CHcyclic'])] = (10.29, -52.84) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['CO2'])] = (135.5, 239.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['N2'])] = (61.59, 84.92) +PPR78_INTERACTIONS[(PPR78_GROUPS['C2H6'], PPR78_GROUPS['H2S'])] = (157.2, 217.1) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['CHaro'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['Caro'])] = (-13.38, 20.25) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['Cfused_aromatic'])] = (-13.38, 20.25) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['CH2cyclic'])] = (29.17, 69.32) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['CHcyclic'])] = (-26.42, -789.2) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['CO2'])] = (102.6, 161.3) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['N2'])] = (185.2, 490.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['H2S'])] = (21.96, 13.04) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHaro'], PPR78_GROUPS['SH'])] = (285.5, 392.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['Caro'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['Cfused_aromatic'])] = (0.0, 0.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['CH2cyclic'])] = (34.31, 95.39) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['CHcyclic'])] = (-105.7, -286.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['CO2'])] = (110.1, 637.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['N2'])] = (284.0, 1892.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['H2S'])] = (1.029, -8.579) +PPR78_INTERACTIONS[(PPR78_GROUPS['Caro'], PPR78_GROUPS['SH'])] = (1072.0, 1094.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['Cfused_aromatic'], PPR78_GROUPS['CH2cyclic'])] = (34.31, 95.39) +PPR78_INTERACTIONS[(PPR78_GROUPS['Cfused_aromatic'], PPR78_GROUPS['CHcyclic'])] = (-105.7, -286.5) +PPR78_INTERACTIONS[(PPR78_GROUPS['Cfused_aromatic'], PPR78_GROUPS['CO2'])] = (267.3, 444.4) +PPR78_INTERACTIONS[(PPR78_GROUPS['Cfused_aromatic'], PPR78_GROUPS['N2'])] = (718.1, 1892.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['Cfused_aromatic'], PPR78_GROUPS['H2S'])] = (1.029, -8.579) +PPR78_INTERACTIONS[(PPR78_GROUPS['Cfused_aromatic'], PPR78_GROUPS['SH'])] = (1072.0, 1094.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2cyclic'], PPR78_GROUPS['CHcyclic'])] = (-50.10, -891.1) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2cyclic'], PPR78_GROUPS['CO2'])] = (130.1, 225.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2cyclic'], PPR78_GROUPS['N2'])] = (179.5, 546.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2cyclic'], PPR78_GROUPS['H2S'])] = (120.8, 163.0) +PPR78_INTERACTIONS[(PPR78_GROUPS['CH2cyclic'], PPR78_GROUPS['SH'])] = (446.1, 549.0) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CHcyclic'], PPR78_GROUPS['CO2'])] = (91.28, 82.01) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHcyclic'], PPR78_GROUPS['N2'])] = (100.9, 249.8) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHcyclic'], PPR78_GROUPS['H2S'])] = (-16.13, -147.6) +PPR78_INTERACTIONS[(PPR78_GROUPS['CHcyclic'], PPR78_GROUPS['SH'])] = (411.8, -308.8) + +PPR78_INTERACTIONS[(PPR78_GROUPS['CO2'], PPR78_GROUPS['N2'])] = (98.42, 221.4) +PPR78_INTERACTIONS[(PPR78_GROUPS['CO2'], PPR78_GROUPS['H2S'])] = (134.9, 201.4) +# PPR78_INTERACTIONS[(PPR78_GROUPS['CO2'], PPR78_GROUPS['SH'])] = (None, None) # N.A. + +PPR78_INTERACTIONS[(PPR78_GROUPS['N2'], PPR78_GROUPS['H2S'])] = (319.5, 550.1) +# PPR78_INTERACTIONS[(PPR78_GROUPS['N2'], PPR78_GROUPS['SH'])] = (None, None) # N.A. + +PPR78_INTERACTIONS[(PPR78_GROUPS['H2S'], PPR78_GROUPS['SH'])] = (-77.21, 156.1) + + +# Symmetrize and fill missing interactions +PPR78_ZERO_PARAMETER = (0.0, 0.0) +# Symmetrize the PPR78_INTERACTIONS +groups = list(PPR78_GROUPS.values()) +# Loop through all pairs of groups to ensure symmetry and fill defaults +for group1 in groups: + for group2 in groups: + key = (group1, group2) + reverse_key = (group2, group1) + # Symmetrize: if key exists but reverse_key does not, copy the value + if key in PPR78_INTERACTIONS and reverse_key not in PPR78_INTERACTIONS: + PPR78_INTERACTIONS[reverse_key] = PPR78_INTERACTIONS[key] + # Missing parameters are zero + if key not in PPR78_INTERACTIONS and reverse_key not in PPR78_INTERACTIONS: + PPR78_INTERACTIONS[key] = PPR78_ZERO_PARAMETER + PPR78_INTERACTIONS[reverse_key] = PPR78_ZERO_PARAMETER + +PPR78_INTERACTIONS_BY_STR = {} +for (group1, group2), value in PPR78_INTERACTIONS.items(): + PPR78_INTERACTIONS_BY_STR[(group1.group, group2.group)] = value + +PPR78_GROUP_IDS = [k.group_id for k in PPR78_GROUPS.values()] +PPR78_GROUPS = list(PPR78_GROUPS.values()) + +def PPR78_kij(T, molecule1_groups, molecule2_groups, Tc1, Pc1, omega1, Tc2, Pc2, omega2): + r'''Calculate binary interaction parameter kij(T) between two molecules using the PPR78 method. + + This function implements the PPR78 (Predictive Peng-Robinson 1978) method to calculate + the binary interaction parameter kij between two molecules, including the calculation + of their equation of state parameters. + + .. math:: + k_{ij}(T) = \frac{ + -\frac{1}{2} \left[ \sum_{k=1}^{N_g} \sum_{l=1}^{N_g} \left( \alpha_{ik} - \alpha_{jk} \right) \left( \alpha_{il} - \alpha_{jl} \right) A_{kl} \times \left( \frac{298.15}{T/K} \right) \left( \frac{B_{kl}}{A_{kl}} - 1 \right) \right] - \left( \frac{\sqrt{a_i(T)}}{b_i} - \frac{\sqrt{a_j(T)}}{b_j} \right)^2 + }{ + 2 \sqrt{\frac{a_i(T) \cdot a_j(T)}{b_i \cdot b_j}} + } + + .. math:: + b_i = 0.0777960739 \frac{RT_{c,i}}{P_{c,i}} + + .. math:: + a_i = 0.457235529 \frac{R^2T_{c,i}^2}{P_{c,i}} \left[1 + m_i\left(1 - \sqrt{\frac{T}{T_{c,i}}}\right)\right]^2 + + .. math:: + m_i = \begin{cases} + 0.37464 + 1.54226\omega_i - 0.26992\omega_i^2 & \text{if } \omega_i \leq 0.491 \\ + 0.379642 + 1.48503\omega_i - 0.164423\omega_i^2 + 0.016666\omega_i^3 & \text{if } \omega_i > 0.491 + \end{cases} + + Parameters + ---------- + T : float + Temperature [K] + molecule1_groups : dict + Dictionary of group counts for molecule 1 {group: count} + molecule2_groups : dict + Dictionary of group counts for molecule 2 {group: count} + Tc1 : float + Critical temperature of molecule 1 [K] + Pc1 : float + Critical pressure of molecule 1 [Pa] + omega1 : float + Acentric factor of molecule 1 [-] + Tc2 : float + Critical temperature of molecule 2 [K] + Pc2 : float + Critical pressure of molecule 2 [Pa] + omega2 : float + Acentric factor of molecule 2 [-] + + Returns + ------- + float + Binary interaction parameter kij [-] + + Examples + -------- + >>> # Example for methane-ethane system + >>> PPR78_kij(298.15, {"CH3": 1}, {"CH3": 2}, Tc1=190.564, Pc1=4599200, omega1=0.01142, Tc2=305.322, Pc2=4872200, omega2=0.0995) + -0.0096176 + + Notes + ----- + Confirmed with an example in [2]_. + + References + ---------- + .. [1] Jaubert, Jean-Noël, Romain Privat, and Fabrice Mutelet. "Predicting + the Phase Equilibria of Synthetic Petroleum Fluids with the PPR78 + Approach." AIChE Journal 56, no. 12 (2010): 3225-35. + https://doi.org/10.1002/aic.12232. + .. [2] Jaubert, Jean-Noël, and Fabrice Mutelet. "VLE Predictions with the + Peng-Robinson Equation of State and Temperature Dependent Kij Calculated + through a Group Contribution Method." Fluid Phase Equilibria 224, + no. 2 (October 1, 2004): 285-304. doi:10.1016/j.fluid.2004.06.059. + ''' + OMEGA_A = 0.4572355289213821893834601962251837888504 + OMEGA_B = 0.0777960739038884559718447100373331839711 + + # Calculate m parameters based on acentric factors + def calculate_m(omega): + if omega <= 0.491: + return 0.37464 + 1.54226*omega - 0.26992*omega**2 + else: + return 0.379642 + 1.48503*omega - 0.164423*omega**2 + 0.016666*omega**3 + + # Calculate b parameters + bi_1 = OMEGA_B * (R * Tc1 / Pc1) + bi_2 = OMEGA_B * (R * Tc2 / Pc2) + + # Calculate a parameters + m1 = calculate_m(omega1) + m2 = calculate_m(omega2) + + # a_alpha in thermo, matches PR78 + ai_T1 = (OMEGA_A * R**2 * Tc1**2 / Pc1) * (1 + m1 * (1 - sqrt(T/Tc1)))**2 + ai_T2 = (OMEGA_A * R**2 * Tc2**2 / Pc2) * (1 + m2 * (1 - sqrt(T/Tc2)))**2 + + # Calculate group fractions + total_groups1 = sum(molecule1_groups.values()) + total_groups2 = sum(molecule2_groups.values()) + + alpha_i = {group: count/total_groups1 for group, count in molecule1_groups.items()} + alpha_j = {group: count/total_groups2 for group, count in molecule2_groups.items()} + + # Calculate first term (group contribution) + term1 = 0.0 + for group_k in set(alpha_i.keys()) | set(alpha_j.keys()): + for group_l in set(alpha_i.keys()) | set(alpha_j.keys()): + alpha_ik = alpha_i.get(group_k, 0.0) + alpha_jk = alpha_j.get(group_k, 0.0) + alpha_il = alpha_i.get(group_l, 0.0) + alpha_jl = alpha_j.get(group_l, 0.0) + + A_kl, B_kl = PPR78_INTERACTIONS_BY_STR[(group_k, group_l)] + + if A_kl != 0: + delta_k = alpha_ik - alpha_jk + delta_l = alpha_il - alpha_jl + term1 += delta_k * delta_l * A_kl * (298.15/T)**(B_kl/A_kl - 1) + term1 *= -0.5 + term1 *= 1e6 # Didn't catch that the first time around + + # Calculate second term (EOS parameters) + sqrt_ai_T1 = sqrt(ai_T1) + sqrt_ai_T2 = sqrt(ai_T2) + term2 = ((sqrt_ai_T1/bi_1) - (sqrt_ai_T2/bi_2))**2 + + # Calculate denominator + denominator = 2 * sqrt(ai_T1 * ai_T2)/(bi_1 * bi_2) + + # Final calculation + kij_value = (term1 - term2)/denominator + return kij_value + +def PPR78_kijs(T, groups, Tcs, Pcs, omegas): + r"""Calculate the binary interaction parameter (kij) matrix for a mixture of components + at a specified temperature using the PPR78 method at a specified temperature. + + Parameters + ---------- + T : float + System temperature [K] + groups : list[dict] + List of dictionaries containing group counts for each component + Each dict has format {group_name: count} + Tcs : list[float] + Critical temperatures for each component [K] + Pcs : list[float] + Critical pressures for each component [Pa] + omegas : list[float] + Acentric factors for each component [-] + + Returns + ------- + list[list[float]] + Square matrix of kij values where matrix[i][j] gives the interaction + parameter between components i and j + + Examples + -------- + >>> # Calculate kij matrix for methane-ethane-propane mixture + >>> groups = [ + ... {"CH3": 1}, # methane + ... {"CH3": 2}, # ethane + ... {"CH3": 2, "CH2": 1} # propane + ... ] + >>> Tc = [190.564, 305.322, 369.83] + >>> Pc = [4599200, 4872200, 4248000] + >>> omega = [0.01142, 0.0995, 0.1523] + >>> matrix = PPR78_kijs(298.15, groups, Tc, Pc, omega) + """ + n_components = len(groups) + kij_matrix = [[0.0 for _ in range(n_components)] for _ in range(n_components)] + + # Calculate upper triangle + for i in range(n_components): + for j in range(i+1, n_components): + kij = PPR78_kij( + T, + groups[i], + groups[j], + Tcs[i], + Pcs[i], + omegas[i], + Tcs[j], + Pcs[j], + omegas[j] + ) + # Set both (i,j) and (j,i) due to symmetry + kij_matrix[i][j] = kij + kij_matrix[j][i] = kij + + return kij_matrix From 8352d623d1e2e944895e1627fa9fd149d68f9616 Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 11:44:23 -0700 Subject: [PATCH 04/10] Known fragments --- tests/Data/EPPR_known_fraagmentations.csv | 440 ++++++++++++++++++++++ 1 file changed, 440 insertions(+) create mode 100644 tests/Data/EPPR_known_fraagmentations.csv diff --git a/tests/Data/EPPR_known_fraagmentations.csv b/tests/Data/EPPR_known_fraagmentations.csv new file mode 100644 index 00000000..19417ef3 --- /dev/null +++ b/tests/Data/EPPR_known_fraagmentations.csv @@ -0,0 +1,440 @@ +CAS Name CH3 CH2 CH C CH4 C2H6 CHaro Caro Cfused_aromatic CH2cyclic CHcyclic CO2 N2 H2S SH H2O C2H4 CH2CHalkenic Calkenic CHCcycloalkenic H2 C2F6 CF3 CF2 CF2CFdouble C2H4F2 C2H2F4 CO He Ar SO2 O2 NO COS NH3 NO2N2O4 N2O C2H2 HC≡C C≡C +106-97-8 n-BUTANE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +75-83-2 2,2-DIMETHYLBUTANE 4 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +79-29-8 2,3-DIMETHYLBUTANE 4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +463-82-1 NEOPENTANE 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +74-84-0 ETHANE 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +110-54-3 n-HEXANE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +75-28-5 ISOBUTANE 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +78-78-4 ISOPENTANE 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +74-82-8 METHANE 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +107-83-5 2-METHYLPENTANE 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +96-14-0 3-METHYLPENTANE 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +109-66-0 n-PENTANE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +74-98-6 PROPANE 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +590-73-8 2,2-DIMETHYLHEXANE 4 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +584-94-1 2,3-DIMETHYLHEXANE 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +589-43-5 2,4-DIMETHYLHEXANE 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-13-2 2,5-DIMETHYLHEXANE 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +563-16-6 3,3-DIMETHYLHEXANE 4 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +583-48-2 3,4-DIMETHYLHEXANE 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +590-35-2 2,2-DIMETHYLPENTANE 4 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +565-59-3 2,3-DIMETHYLPENTANE 4 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-08-7 2,4-DIMETHYLPENTANE 4 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +562-49-2 3,3-DIMETHYLPENTANE 4 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +619-99-8 3-ETHYLHEXANE 3 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +617-78-7 3-ETHYLPENTANE 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +142-82-5 n-HEPTANE 2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +609-26-7 2-METHYL-3-ETHYLPENTANE 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1067-08-9 3-METHYL-3-ETHYLPENTANE 4 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-27-8 2-METHYLHEPTANE 3 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +589-81-1 3-METHYLHEPTANE 3 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +589-53-7 4-METHYLHEPTANE 3 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +591-76-4 2-METHYLHEXANE 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +589-34-4 3-METHYLHEXANE 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-65-9 n-OCTANE 2 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +594-82-1 2,2,3,3-TETRAMETHYLBUTANE 6 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +464-06-2 2,2,3-TRIMETHYLBUTANE 5 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +564-02-3 2,2,3-TRIMETHYLPENTANE 5 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +540-84-1 2,2,4-TRIMETHYLPENTANE 5 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +560-21-4 2,3,3-TRIMETHYLPENTANE 5 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +565-75-3 2,3,4-TRIMETHYLPENTANE 5 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1067-20-5 3,3-DIETHYLPENTANE 4 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16747-32-3 2,2-DIMETHYL-3-ETHYLPENTANE 5 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1068-87-7 2,4-DIMETHYL-3-ETHYLPENTANE 5 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1071-26-7 2,2-DIMETHYLHEPTANE 4 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1072-05-5 2,6-DIMETHYLHEPTANE 4 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +15869-80-4 3-ETHYLHEPTANE 3 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3221-61-2 2-METHYLOCTANE 3 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2216-33-3 3-METHYLOCTANE 3 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2216-34-4 4-METHYLOCTANE 3 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-84-2 n-NONANE 2 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7154-79-2 2,2,3,3-TETRAMETHYLPENTANE 6 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1186-53-4 2,2,3,4-TETRAMETHYLPENTANE 6 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1070-87-7 2,2,4,4-TETRAMETHYLPENTANE 6 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16747-38-9 2,3,3,4-TETRAMETHYLPENTANE 6 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3522-94-9 2,2,5-TRIMETHYLHEXANE 5 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16747-30-1 2,4,4-TRIMETHYLHEXANE 5 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +124-18-5 n-DECANE 2 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +871-83-0 2-METHYLNONANE 3 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1465084 3-METHYLNONANE 3 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +17301-94-9 4-METHYLNONANE 3 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +15869-85-9 5-METHYLNONANE 3 6 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7154-80-5 3,3,5-TRIMETHYLHEPTANE 5 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13475-81-5 2,2,3,3-TETRAMETHYLHEXANE 6 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +15869-87-1 2,2-DIMETHYLOCTANE 4 5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7146-60-3 2,3-DIMETHYLOCTANE 4 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4032-94-4 2,4-DIMETHYLOCTANE 4 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +15869-89-3 2,5-DIMETHYLOCTANE 4 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2051-30-1 2,6-DIMETHYLOCTANE 4 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1072-16-8 2,7-DIMETHYLOCTANE 4 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112-40-3 n-DODECANE 2 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-59-4 n-TETRADECANE 2 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-50-5 n-TRIDECANE 2 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1120-21-4 n-UNDECANE 2 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-97-0 n-DOCOSANE 2 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112-95-8 n-EICOSANE 2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-94-7 n-HENEICOSANE 2 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-78-7 n-HEPTADECANE 2 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +544-76-3 n-HEXADECANE 2 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-92-5 n-NONADECANE 2 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +593-45-3 n-OCTADECANE 2 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-62-9 n-PENTADECANE 2 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +646-31-1 n-TETRACOSANE 2 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +638-67-5 n-TRICOSANE 2 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-99-2 n-PENTACOSANE 2 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +630-01-3 n-HEXACOSANE 2 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +593-49-7 n-HEPTACOSANE 2 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +630-02-4 n-OCTACOSANE 2 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +630-03-5 n-NONACOSANE 2 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +638-68-6 n-TRIACONTANE 2 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-01-3 SQUALANE 8 16 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +544-85-4 n-DOTRIACONTANE 2 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +630-06-8 n-HEXATRIACONTANE 2 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1071-81-4 2,2,5,5-TETRAMETHYLHEXANE 6 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4390-04-09 2,2,4,4,6,8,8-HEPTAMETHYLNONANE 9 3 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1002-43-3 3-METHYLUNDECANE 3 8 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +75-19-4 CYCLOPROPANE 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +287-23-0 CYCLOBUTANE 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2040-95-1 n-BUTYLCYCLOPENTANE 1 3 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +287-92-3 CYCLOPENTANE 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1638-26-2 1,1-DIMETHYLCYCLOPENTANE 2 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1192-18-3 cis-1,2-DIMETHYLCYCLOPENTANE 2 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +822-50-4 trans-1,2-DIMETHYLCYCLOPENTANE 2 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2532-58-3 cis-1,3-DIMETHYLCYCLOPENTANE 2 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1759-58-6 trans-1,3-DIMETHYLCYCLOPENTANE 2 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1640-89-7 ETHYLCYCLOPENTANE 1 1 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3875-51-2 ISOPROPYLCYCLOPENTANE 2 0 1 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +96-37-7 METHYLCYCLOPENTANE 1 0 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16747-50-5 1-METHYL-1-ETHYLCYCLOPENTANE 2 1 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2040-96-2 n-PROPYLCYCLOPENTANE 1 2 0 0 0 0 0 0 0 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +696-29-7 ISOPROPYLCYCLOHEXANE 2 1 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +110-82-7 CYCLOHEXANE 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1678-92-8 n-PROPYLCYCLOHEXANE 1 2 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1678-93-9 n-BUTYLCYCLOHEXANE 1 3 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1883929 sec-BUTYLCYCLOHEXANE 2 1 1 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3178-22-1 tert-BUTYLCYCLOHEXANE 3 0 0 1 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +590-66-9 1,1-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112134 cis-1,2-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6876-23-9 trans-1,2-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +638-04-0 cis-1,3-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112195 trans-1,3-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +624-29-3 cis-1,4-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112227 trans-1,4-DIMETHYLCYCLOHEXANE 2 0 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1678-91-7 ETHYLCYCLOHEXANE 1 1 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-87-2 METHYLCYCLOHEXANE 1 0 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1795-26-2 1-trans-3,5-TRIMETHYLCYCLOHEXANE 3 0 0 0 0 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1795-16-0 n-DECYLCYCLOHEXANE 1 9 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +291-64-5 CYCLOHEPTANE 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +292-64-8 CYCLOOCTANE 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +493-01-6 cis-DECAHYDRONAPHTHALENE 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +493-02-7 trans-DECAHYDRONAPHTHALENE 0 0 0 0 0 0 0 0 0 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2292-79-7 DIAMANTANE 0 0 0 0 0 0 0 0 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +80-56-8 alpha-PINENE 3 0 0 0 0 0 0 0 0 2 3 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127-91-3 beta-PINENE 2 0 0 0 0 0 0 0 0 3 3 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +281-23-2 ADAMANTANE 0 0 0 0 0 0 0 0 0 6 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +92-51-3 BICYCLOHEXYL 0 0 0 0 0 0 0 0 0 10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3726-45-2 1,2,3,4-TETRAMETHYLCYCLOHEXANE 4 0 0 0 0 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +78-01-3 1,1-DIETHYLCYCLOHEXANE 2 2 0 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13990-93-7 trans-1,4-DIETHYLCYCLOHEXANE 2 2 0 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +702-79-4 1,3-DIMETHYLADAMANTANE 2 0 0 0 0 0 0 0 0 6 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +106-98-9 1-BUTENE 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +590-18-1 cis-2-BUTENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +624-64-6 trans-2-BUTENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +563-78-0 2,3-DIMETHYL-1-BUTENE 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +563-79-1 2,3-DIMETHYL-2-BUTENE 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +558-37-2 3,3-DIMETHYL-1-BUTENE 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +760-21-4 2-ETHYL-1-BUTENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +74-85-1 ETHYLENE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-41-6 1-HEXENE 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7688-21-3 cis-2-HEXENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4050-45-7 trans-2-HEXENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2097470 cis-3-HEXENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13269-52-8 trans-3-HEXENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +115-11-7 ISOBUTENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +563-46-2 2-METHYL-1-BUTENE 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +563-45-1 3-METHYL-1-BUTENE 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +513-35-9 2-METHYL-2-BUTENE 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +763-29-1 2-METHYL-1-PENTENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +760-20-3 3-METHYL-1-PENTENE 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +691-37-2 4-METHYL-1-PENTENE 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +691-38-3 4-METHYL-cis-2-PENTENE 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +674-76-0 4-METHYL-trans-2-PENTENE 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +625-27-4 2-METHYL-2-PENTENE 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +922-62-3 3-METHYL-cis-2-PENTENE 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +616-12-6 3-METHYL-trans-2-PENTENE 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +109-67-1 1-PENTENE 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +627-20-3 cis-2-PENTENE 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +646-04-8 trans-2-PENTENE 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +115-07-1 PROPYLENE 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-76-7 1-HEPTENE 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2097503 cis-3-HEPTENE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6443-92-1 cis-2-HEPTENE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +14686-13-6 trans-2-HEPTENE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3404-71-5 2-ETHYL-1-PENTENE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3769-23-1 4-METHYL-1-HEXENE 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3404-61-3 3-METHYL-1-HEXENE 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1531866 2-METHYL-1-HEXENE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +780984 3-ETHYL-1-PENTENE 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +14686-14-7 trans-3-HEPTENE 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +594-56-9 2,3,3-TRIMETHYL-1-BUTENE 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1632-16-2 2-ETHYL-1-HEXENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2097322 cis-2-OCTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +14850-22-7 cis-3-OCTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7642-15-1 cis-4-OCTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-66-0 1-OCTENE 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13389-42-9 trans-2-OCTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +14919-01-8 trans-3-OCTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +14850-23-8 trans-4-OCTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +107-39-1 2,4,4-TRIMETHYL-1-PENTENE 4 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +107-40-4 2,4,4-TRIMETHYL-2-PENTENE 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16746-86-4 2,3-DIMETHYL-1-HEXENE 3 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +15870-10-7 2-METHYL-1-HEPTENE 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +872-05-9 1-DECENE 1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112-41-4 1-DODECENE 1 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-73-2 1-HEXADECENE 1 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6765-39-5 1-HEPTADECENE 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +124-11-8 1-NONENE 1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2437-56-1 1-TRIDECENE 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1120-36-1 1-TETRADECENE 1 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13360-61-7 1-PENTADECENE 1 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +18435-45-5 1-NONADECENE 1 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +567040 1-EICOSENE 1 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112-88-9 1-OCTADECENE 1 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +821-95-4 1-UNDECENE 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +931-88-4 CYCLOOCTENE 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +590-19-2 1,2-BUTADIENE 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +106-99-0 1,3-BUTADIENE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5194-51-4 trans,trans-2,4-HEXADIENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-42-7 1,5-HEXADIENE 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-44-9 1,2-HEXADIENE 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-45-0 1,4-HEXADIENE 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +78-79-5 ISOPRENE 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +598-25-4 3-METHYL-1,2-BUTADIENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1574-41-0 cis-1,3-PENTADIENE 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +591-95-7 1,2-PENTADIENE 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2004-70-8 trans-1,3-PENTADIENE 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +591-93-5 1,4-PENTADIENE 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +591-96-8 2,3-PENTADIENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +463-49-0 PROPADIENE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5194-50-3 cis,trans-2,4-HEXADIENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +513-81-5 2,3-DIMETHYL-1,3-BUTADIENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +627-58-7 2,5-DIMETHYL-1,5-HEXADIENE 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +764-13-6 2,5-DIMETHYL-2,4-HEXADIENE 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-78-4 1,5-CYCLOOCTADIENE 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +592-57-4 1,3-CYCLOHEXADIENE 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +628-41-1 1,4-CYCLOHEXADIENE 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +628-92-2 CYCLOHEPTENE 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +110-83-8 CYCLOHEXENE 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +542-92-7 CYCLOPENTADIENE 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +77-73-6 DICYCLOPENTADIENE 0 0 0 0 0 0 0 0 0 2 4 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +26519-91-5 METHYLCYCLOPENTADIENE 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +142-29-0 CYCLOPENTENE 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +693-89-0 1-METHYLCYCLOPENTENE 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1120-62-3 3-METHYLCYCLOPENTENE 1 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1759-81-5 4-METHYLCYCLOPENTENE 1 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +100-40-3 VINYLCYCLOHEXENE 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +498-66-8 2-NORBORNENE 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +79-92-5 CAMPHENE 2 0 0 0 0 0 0 0 0 3 3 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +99-83-2 alpha-PHELLANDRENE 3 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +555-10-2 beta-PHELLANDRENE 2 0 1 0 0 0 0 0 0 2 1 0 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +99-86-5 alpha-TERPINENE 3 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +99-85-4 gamma-TERPINENE 3 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5989-27-5 d-LIMONENE 2 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +586-62-9 TERPINOLENE 3 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1961-96-2 1-PHENYLINDENE 0 0 0 0 0 0 9 3 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3048-64-4 VINYLNORBORNENE 0 0 0 0 0 0 0 0 0 2 3 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +18435-53-5 1-TRIACONTENE 1 27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3404-58-8 3-ETHYL-1-HEXENE 2 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13151-05-8 4-METHYL-1-HEPTENE 2 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +61868-18-6 1-TETRACONTENE 1 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6434-77-1 cis-2-NONENE 2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6434-78-2 trans-2-NONENE 2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5026-76-6 6-METHYL-1-HEPTENE 2 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +42448-85-1 trans-2-EICOSENE 2 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +74392-36-2 trans-2-PENTADECENE 2 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1115-08-8 3-METHYL-1,4-PENTADIENE 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +706-31-0 1,5,9-CYCLODODECATRIENE 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +20237-34-7 trans-1,3-HEXADIENE 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +926-54-5 trans-2-METHYL-1,3-PENTADIENE 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1647-16-1 1,9-DECADIENE 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +629-20-9 1,3,5,7-CYCLOOCTATETRAENE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +694-92-8 METHYLNORBORNENE 1 0 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +15403-89-1 ETHYLNORBORNENE 1 1 0 0 0 0 0 0 0 2 3 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16219-75-3 5-ETHYLIDENE-2-NORBORNENE 1 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3524-73-0 5-METHYL-1-HEXENE 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4588-18-5 2-METHYL-1-OCTENE 2 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +17699-86-4 1-METHYL-4-VINYLCYCLOHEXENE 1 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +13151-06-9 7-METHYL-1-OCTENE 2 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2980-71-4 2-METHYL-1-NONENE 2 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +26741-24-2 8-METHYL-1-NONENE 2 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +20348-51-0 cis-2-DECENE 2 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +20063-97-2 trans-2-DECENE 2 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7206-26-0 cis-2-DODECENE 2 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7206-13-5 trans-2-DODECENE 2 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +71-43-2 BENZENE 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +98-82-8 CUMENE 2 0 1 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +100-41-4 ETHYLBENZENE 1 1 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +98-83-9 alpha-METHYLSTYRENE 1 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +611-15-4 o-METHYLSTYRENE 1 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +766-90-5 cis-1-PROPENYLBENZENE 1 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +103-65-1 n-PROPYLBENZENE 1 2 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +100-80-1 m-METHYLSTYRENE 1 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +100-42-5 STYRENE 0 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-88-3 TOLUENE 1 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +526-73-8 1,2,3-TRIMETHYLBENZENE 3 0 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +95-63-6 1,2,4-TRIMETHYLBENZENE 3 0 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-67-8 MESITYLENE 3 0 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-38-3 m-XYLENE 2 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +95-47-6 o-XYLENE 2 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +106-42-3 p-XYLENE 2 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +488-23-3 1,2,3,4-TETRAMETHYLBENZENE 4 0 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +16262-48-9 p-ISOPROPENYLSTYRENE 1 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +104-51-8 n-BUTYLBENZENE 1 3 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +827-52-1 CYCLOHEXYLBENZENE 0 0 0 0 0 0 5 1 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +141-93-5 m-DIETHYLBENZENE 2 2 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +135-01-3 o-DIETHYLBENZENE 2 2 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +101-81-5 DIPHENYLMETHANE 0 1 0 0 0 0 10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1074-17-5 1-METHYL-2-n-PROPYLBENZENE 2 2 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1074-43-7 1-METHYL-3-n-PROPYLBENZENE 2 2 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1074-55-1 1-METHYL-4-n-PROPYLBENZENE 2 2 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +135-98-8 sec-BUTYLBENZENE 2 1 1 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +934-74-7 5-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +933-98-2 3-ETHYL-o-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +934-80-5 4-ETHYL-o-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +354381 2-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1758-88-9 2-ETHYL-p-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +874-41-9 4-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +98-06-6 tert-BUTYLBENZENE 3 0 0 1 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +123-01-3 n-DODECYLBENZENE 1 11 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +612-00-0 1,1-DIPHENYLETHANE 1 0 1 0 0 0 10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +535-77-3 m-CYMENE 3 0 1 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +104-72-3 n-DECYLBENZENE 1 9 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +527-84-4 o-CYMENE 3 0 1 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +123-02-4 n-TRIDECYLBENZENE 1 12 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +99-87-6 p-CYMENE 3 0 1 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +58-72-0 TRIPHENYLETHYLENE 0 0 0 0 0 0 15 3 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +105-05-5 p-DIETHYLBENZENE 2 2 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1077-16-3 n-HEXYLBENZENE 1 5 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1078-71-3 n-HEPTYLBENZENE 1 6 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2189-60-8 n-OCTYLBENZENE 1 7 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1081-77-2 n-NONYLBENZENE 1 8 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +538-93-2 ISOBUTYLBENZENE 2 1 1 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6742-54-7 n-UNDECYLBENZENE 1 10 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2039-93-2 2-PHENYLBUTENE-1 1 1 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +611-14-3 o-ETHYLTOLUENE 2 1 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-57-6 m-DIVINYLBENZENE 0 0 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +620-14-4 m-ETHYLTOLUENE 2 1 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +622-96-8 p-ETHYLTOLUENE 2 1 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +768-00-3 cis-2-PHENYLBUTENE-2 2 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +767-99-7 trans-2-PHENYLBUTENE-2 2 0 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +538-68-1 n-PENTYLBENZENE 1 4 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +84-15-1 o-TERPHENYL 0 0 0 0 0 0 14 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +92-06-8 m-TERPHENYL 0 0 0 0 0 0 14 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +92-94-4 p-TERPHENYL 0 0 0 0 0 0 14 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1746-23-2 p-tert-BUTYLSTYRENE 3 0 0 1 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +63444-56-4 4-ISOBUTYLSTYRENE 2 1 1 0 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7364-19-4 p-tert-BUTYL ETHYLBENZENE 4 1 0 1 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +95-93-2 1,2,4,5-TETRAMETHYLBENZENE 4 0 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +527-53-7 1,2,3,5-TETRAMETHYLBENZENE 4 0 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +103-29-7 1,2-DIPHENYLETHANE 0 2 0 0 0 0 10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +103-30-0 trans-STILBENE 0 0 0 0 0 0 10 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +645-49-8 cis-STILBENE 0 0 0 0 0 0 10 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +99-62-7 m-DIISOPROPYLBENZENE 4 0 2 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +100-18-5 p-DIISOPROPYLBENZENE 4 0 2 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +632-51-9 TETRAPHENYLETHYLENE 0 0 0 0 0 0 20 4 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1459-10-5 n-TETRADECYLBENZENE 1 13 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2131-18-2 n-PENTADECYLBENZENE 1 14 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1459-09-2 n-HEXADECYLBENZENE 1 15 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +14752-75-1 n-HEPTADECYLBENZENE 1 16 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +929727 n-OCTADECYLBENZENE 1 17 0 0 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +92-52-4 BIPHENYL 0 0 0 0 0 0 10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +83-32-9 ACENAPHTHENE 0 0 0 0 0 0 6 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +206-44-0 FLUORANTHENE 0 0 0 0 0 0 10 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1634-09-9 1-n-BUTYLNAPHTHALENE 1 3 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +86-89-5 1-n-PENTYLNAPHTHALENE 1 4 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +605-02-7 1-PHENYLNAPHTHALENE 0 0 0 0 0 0 12 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1127-76-0 1-ETHYLNAPHTHALENE 1 1 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +59919-41-4 2,6-DIETHYLNAPHTHALENE 2 2 0 0 0 0 6 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +26438-27-7 1-n-DECYLNAPHTHALENE 1 9 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +939-27-5 2-ETHYLNAPHTHALENE 1 1 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2876-53-1 1-n-HEXYLNAPHTHALENE 1 5 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +90-12-0 1-METHYLNAPHTHALENE 1 0 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +91-57-6 2-METHYLNAPHTHALENE 1 0 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +581-42-0 2,6-DIMETHYLNAPHTHALENE 2 0 0 0 0 0 6 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +582-16-1 2,7-DIMETHYLNAPHTHALENE 2 0 0 0 0 0 6 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +91-20-3 NAPHTHALENE 0 0 0 0 0 0 8 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1889-67-4 2,3-DIMETHYL-2,3-DIPHENYLBUTANE 4 0 0 2 0 0 10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +26438-26-6 1-n-NONYLNAPHTHALENE 1 8 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2765-18-6 1-n-PROPYLNAPHTHALENE 1 2 0 0 0 0 7 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +66325-11-9 1-n-HEXYL-1,2,3,4-TETRAHYDRONAPHTHALENE 1 5 0 0 0 0 4 2 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6362-80-7 2,4-DIPHENYL-4-METHYLPENTENE-1 2 1 0 1 0 0 10 2 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +519-73-3 TRIPHENYLMETHANE 0 0 1 0 0 0 15 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +630-76-2 TETRAPHENYLMETHANE 0 0 0 1 0 0 20 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1520-42-9 1,1,2-TRIPHENYLETHANE 0 1 1 0 0 0 15 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +632-50-8 1,1,2,2-TETRAPHENYLETHANE 0 0 2 0 0 0 20 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +120-12-7 ANTHRACENE 0 0 0 0 0 0 10 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +85-01-8 PHENANTHRENE 0 0 0 0 0 0 10 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +218-01-9 CHRYSENE 0 0 0 0 0 0 12 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +129-00-0 PYRENE 0 0 0 0 0 0 10 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +496-11-7 INDANE 0 0 0 0 0 0 4 2 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +208-96-8 ACENAPHTHALENE 0 0 0 0 0 0 6 2 2 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +86-73-7 FLUORENE 0 0 0 0 0 0 8 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +95-13-6 INDENE 0 0 0 0 0 0 4 2 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +767-59-9 1-METHYLINDENE 1 0 0 0 0 0 4 2 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +4773-83-5 1,2,3-TRIMETHYLINDENE 3 0 0 0 0 0 4 2 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2177-47-1 2-METHYLINDENE 1 0 0 0 0 0 4 2 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1012-72-2 1,4-DI-tert-BUTYLBENZENE 6 0 0 2 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1460-02-2 1,3,5-TRI-tert-BUTYLBENZENE 9 0 0 3 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +717-74-8 1,3,5-TRIISOPROPYLBENZENE 6 0 3 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +700-12-9 PENTAMETHYLBENZENE 5 0 0 0 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +877-44-1 1,2,4-TRIETHYLBENZENE 3 3 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +87-85-4 HEXAMETHYLBENZENE 6 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +42205-08-3 1,2,3-TRIETHYLBENZENE 3 3 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +38842-05-6 1,2,3,5-TETRAETHYLBENZENE 4 4 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +605-01-6 PENTAETHYLBENZENE 5 5 0 0 0 0 1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +604-88-6 HEXAETHYLBENZENE 6 6 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7439-15-8 1-(4-ETHYLPHENYL)-2-PHENYLETHANE 1 3 0 0 0 0 9 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +17059-44-8 1,2-DIMETHYL-3-PROPYLBENZENE 3 2 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +61827-86-9 1,2,3-TRIMETHYL-4-ETHYLBENZENE 4 1 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +61827-87-0 1,2,4-TRIMETHYL-3-ETHYLBENZENE 4 1 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +17851-27-3 1,2,4-TRIMETHYL-5-ETHYLBENZENE 4 1 0 0 0 0 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +51526-06-8 1-(4-ETHYLPHENYL)-2-(4-ETHYLPHENYL)ETHANE 2 4 0 0 0 0 8 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7564-63-8 o-ETHYLSTYRENE 1 1 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7525-62-4 m-ETHYLSTYRENE 1 1 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +3454-07-07 p-ETHYLSTYRENE 1 1 0 0 0 0 4 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +832-64-4 4-METHYLPHENANTHRENE 1 0 0 0 0 0 9 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +56-55-3 BENZANTHRACENE 0 0 0 0 0 0 12 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +92-24-0 NAPHTHACENE 0 0 0 0 0 0 12 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +18970-44-0 1-ETHYL-2-ISOPROPYLBENZENE 3 1 1 0 0 0 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +102-25-0 1,3,5-TRIETHYLBENZENE 3 3 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +109-79-5 n-BUTYL MERCAPTAN 1 3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +75-08-1 ETHYL MERCAPTAN 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-88-6 n-OCTYL MERCAPTAN 1 7 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1639-09-4 n-HEPTYL MERCAPTAN 1 6 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +111-31-9 n-HEXYL MERCAPTAN 1 5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +74-93-1 METHYL MERCAPTAN 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +110-66-7 n-PENTYL MERCAPTAN 1 4 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +75-66-1 tert-BUTYL MERCAPTAN 3 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +513-53-1 sec-BUTYL MERCAPTAN 2 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +75-33-2 ISOPROPYL MERCAPTAN 2 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +107-03-9 n-PROPYL MERCAPTAN 1 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +141-59-3 tert-OCTYL MERCAPTAN 5 1 0 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1455-21-6 n-NONYL MERCAPTAN 1 8 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +112-55-0 n-DODECYL MERCAPTAN 1 11 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +513-44-0 ISOBUTYL MERCAPTAN 2 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +143-10-2 n-DECYL MERCAPTAN 1 9 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5332-52-5 UNDECYL MERCAPTAN 1 10 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +25103-58-6 tert-DODECYL MERCAPTAN 3 8 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +108-98-5 PHENYL MERCAPTAN 0 0 0 0 0 0 5 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1569-69-3 CYCLOHEXYL MERCAPTAN 0 0 0 0 0 0 0 0 0 5 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +100-53-8 BENZYL MERCAPTAN 0 1 0 0 0 0 5 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +540-63-6 1,2-ETHANEDITHIOL 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +124-38-9 CARBON DIOXIDE 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1333-74-0 HYDROGEN 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2148878 HYDROGEN SULFIDE 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7727-37-9 NITROGEN 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7732-18-5 WATER 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +630-08-0 CO 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 +7440-37-1 Ar 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 +7782-44-7 O2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 From 5b8f4e6b2ff687598b620a217825b77252d1f293 Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 14:33:15 -0700 Subject: [PATCH 05/10] Implementation of Extended PPR78 --- tests/Data/EPPR_known_fraagmentations.csv | 2 +- tests/test_ppr78.py | 488 ++++++++++---- .../group_contribution_base.py | 15 + thermo/group_contribution/ppr78.py | 636 ++++++++++++++++-- 4 files changed, 959 insertions(+), 182 deletions(-) diff --git a/tests/Data/EPPR_known_fraagmentations.csv b/tests/Data/EPPR_known_fraagmentations.csv index 19417ef3..0f9c1c0d 100644 --- a/tests/Data/EPPR_known_fraagmentations.csv +++ b/tests/Data/EPPR_known_fraagmentations.csv @@ -302,7 +302,7 @@ CAS Name CH3 CH2 CH C CH4 C2H6 CHaro Caro Cfused_aromatic CH2cyclic CHcyclic CO2 934-74-7 5-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 933-98-2 3-ETHYL-o-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 934-80-5 4-ETHYL-o-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -354381 2-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +2870-04-4 2-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1758-88-9 2-ETHYL-p-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 874-41-9 4-ETHYL-m-XYLENE 3 1 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 98-06-6 tert-BUTYLBENZENE 3 0 0 1 0 0 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/tests/test_ppr78.py b/tests/test_ppr78.py index 4a522e78..04ac496d 100644 --- a/tests/test_ppr78.py +++ b/tests/test_ppr78.py @@ -25,8 +25,12 @@ from fluids.numerics import * from thermo import Chemical +from chemicals.identifiers import int_to_CAS from thermo.group_contribution.group_contribution_base import smarts_fragment_priority -from thermo.group_contribution.ppr78 import PPR78_kij, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID +from thermo.group_contribution.ppr78 import EPPR78_GROUPS_LIST, EPPR78_GROUPS_BY_ID, PPR78_kij, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS_LIST, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID +import os +import pandas as pd +folder = os.path.join(os.path.dirname(__file__), 'Data') try: import rdkit from rdkit import Chem @@ -124,8 +128,10 @@ def test_ppr78_kijs_matrix(): [0.006933513208806096, 0.000827218293750849, 0.0]], rtol=1e-7) -def readable_assignment(assignment): +def readable_assignment_PPR78(assignment): return {PPR78_GROUPS_BY_ID[i].group : v for i, v in assignment.items()} +def readable_assignment_EPPR78(assignment): + return {EPPR78_GROUPS_BY_ID[i].group : v for i, v in assignment.items()} @pytest.mark.rdkit @pytest.mark.skipif(rdkit is None, reason="requires rdkit") @@ -137,235 +143,235 @@ def test_table_2_2005_paper_compounds(): 193-211. doi:10.1016/j.fluid.2005.09.003. ''' rdkitmol = Chemical('nitrogen').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'N2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'N2': 1} assert success rdkitmol = Chemical('carbon dioxide').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CO2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CO2': 1} assert success rdkitmol = Chemical('hydrogen sulfide').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'H2S': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'H2S': 1} assert success rdkitmol = Chemical('methane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH4': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH4': 1} assert success # Ethane - should use the specific C2H6 group rdkitmol = Chemical('ethane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'C2H6': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'C2H6': 1} assert success # Propane - should be CH3-CH2-CH3 rdkitmol = Chemical('propane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 1} assert success # n-Butane - should be CH3-CH2-CH2-CH3 rdkitmol = Chemical('butane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 2} assert success # n-Pentane (CH3-CH2-CH2-CH2-CH3) rdkitmol = Chemical('pentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 3} assert success # 2-Methyl butane (iso-pentane) (CH3-CH(CH3)-CH2-CH3) rdkitmol = Chemical('2-methylbutane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 1} assert success # 2,2-Dimethyl propane (neo-pentane) ((CH3)4-C) rdkitmol = Chemical('2,2-dimethylpropane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'C': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'C': 1} assert success # n-Hexane (CH3-CH2-CH2-CH2-CH2-CH3) rdkitmol = Chemical('hexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 4} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 4} assert success # 2-Methyl pentane (CH3-CH(CH3)-CH2-CH2-CH3) rdkitmol = Chemical('2-methylpentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} assert success # 3-Methyl pentane (CH3-CH2-CH(CH3)-CH2-CH3) rdkitmol = Chemical('3-methylpentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} assert success # 2,2-Dimethyl butane (CH3-C(CH3)2-CH2-CH3) rdkitmol = Chemical('2,2-dimethylbutane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'C': 1, 'CH2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'C': 1, 'CH2': 1} assert success # 2,3-Dimethyl butane (CH3-CH(CH3)-CH(CH3)-CH3) rdkitmol = Chemical('2,3-dimethylbutane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'CH': 2} assert success # Benzene (C6H6) rdkitmol = Chemical('benzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 6} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 6} assert success # n-Heptane (CH3-CH2-CH2-CH2-CH2-CH2-CH3) rdkitmol = Chemical('heptane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 5} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 5} assert success # 3-Methyl hexane (CH3-CH2-CH(CH3)-CH2-CH2-CH3) rdkitmol = Chemical('3-methylhexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 3} assert success # 2,3-Dimethyl pentane (CH3-CH(CH3)-CH(CH3)-CH2-CH3) rdkitmol = Chemical('2,3-dimethylpentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 1} assert success # 2,4-Dimethyl pentane (CH3-CH(CH3)-CH2-CH(CH3)-CH3) rdkitmol = Chemical('2,4-dimethylpentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 1} assert success # 2,2,3-Trimethyl butane (CH3-C(CH3)2-CH(CH3)-CH3) rdkitmol = Chemical('2,2,3-trimethylbutane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 5, 'CH': 1, 'C': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 5, 'CH': 1, 'C': 1} assert success # 2,2,4-Trimethyl pentane (iso-octane) (CH3-C(CH3)2-CH2-CH(CH3)-CH3) rdkitmol = Chemical('2,2,4-trimethylpentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 5, 'CH': 1, 'C': 1, 'CH2': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 5, 'CH': 1, 'C': 1, 'CH2': 1} assert success # Methyl benzene (toluene) (C6H5-CH3) rdkitmol = Chemical('toluene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'CH3': 1} assert success # n-Octane (CH3-(CH2)6-CH3) rdkitmol = Chemical('octane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 6} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 6} assert success # 2,2,5-Trimethyl hexane (CH3-CH2-CH2-CH(CH3)-C(CH3)2-CH3) rdkitmol = Chemical('2,2,5-trimethylhexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 5, 'CH': 1, 'C': 1, 'CH2': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 5, 'CH': 1, 'C': 1, 'CH2': 2} assert success # Ethyl benzene (C6H5-CH2-CH3) rdkitmol = Chemical('ethylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 1, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 1, 'CH3': 1} assert success # 1,4-Dimethyl benzene (para-xylene) rdkitmol = Chemical('p-xylene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} assert success # 1,3-Dimethyl benzene (meta-xylene) rdkitmol = Chemical('m-xylene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} assert success # 1,2-Dimethyl benzene (ortho-xylene) rdkitmol = Chemical('o-xylene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 4, 'Caro': 2, 'CH3': 2} assert success # n-Propyl benzene (C6H5-CH2-CH2-CH3) rdkitmol = Chemical('propylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 2, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 2, 'CH3': 1} assert success # Isopropyl benzene (cumene) (C6H5-CH(CH3)2) rdkitmol = Chemical('isopropylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH': 1, 'CH3': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'CH': 1, 'CH3': 2} assert success # 1,3,5-Trimethyl benzene (mesitylene) rdkitmol = Chemical('1,3,5-trimethylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} assert success # 1,2,4-Trimethyl benzene rdkitmol = Chemical('1,2,4-trimethylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} assert success # Naphthalene (C10H8) rdkitmol = Chemical('naphthalene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 8, 'Cfused_aromatic': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 8, 'Cfused_aromatic': 2} assert success # n-Nonane (CH3-(CH2)7-CH3) rdkitmol = Chemical('nonane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 7} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 7} assert success # 2,2-Dimethyl heptane (CH3-CH2-CH2-CH2-CH2-C(CH3)2-CH3) rdkitmol = Chemical('2,2-dimethylheptane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'C': 1, 'CH2': 4} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'C': 1, 'CH2': 4} assert success # Butyl benzene (C6H5-CH2-CH2-CH2-CH3) rdkitmol = Chemical('butylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 3, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 3, 'CH3': 1} assert success # Tertiobutyl benzene (C6H5-C(CH3)3) rdkitmol = Chemical('t-butylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'C': 1, 'CH3': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'C': 1, 'CH3': 3} assert success # 1-Methyl naphthalene rdkitmol = Chemical('1-methylnaphthalene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 7, 'Cfused_aromatic': 2, 'Caro': 1, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 7, 'Cfused_aromatic': 2, 'Caro': 1, 'CH3': 1} assert success # Long chain n-alkanes @@ -381,14 +387,14 @@ def test_table_2_2005_paper_compounds(): for name, expected in alkanes.items(): rdkitmol = Chemical(name).rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == expected + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == expected assert success # Phenanthrene (C14H10) rdkitmol = Chemical('phenanthrene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 10, 'Cfused_aromatic': 4} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 10, 'Cfused_aromatic': 4} assert success @@ -402,110 +408,110 @@ def test_extension_naphtenic(): ''' # 1,2,3-Trimethyl benzene rdkitmol = Chemical('1,2,3-trimethylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 3, 'Caro': 3, 'CH3': 3} assert success # 2,2,4,4,6,8,8-Heptamethyl nonane rdkitmol = Chemical('2,2,4,4,6,8,8-heptamethylnonane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 9, 'CH': 1, 'C': 3, 'CH2': 3} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 9, 'CH': 1, 'C': 3, 'CH2': 3} assert success # 3,4-Dimethyl hexane rdkitmol = Chemical('3,4-dimethylhexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 4, 'CH': 2, 'CH2': 2} assert success # 3-Methyl pentane (already covered in previous tests, but including for completeness) rdkitmol = Chemical('3-methylpentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 2} assert success # 4-Methyl heptane rdkitmol = Chemical('4-methylheptane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 4} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'CH': 1, 'CH2': 4} assert success # Biphenyl (phenyl benzene) rdkitmol = Chemical('biphenyl').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 10, 'Caro': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 10, 'Caro': 2} assert success # Cis-decalin rdkitmol = Chemical('cis-decalin').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 8, 'CHcyclic': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 8, 'CHcyclic': 2} assert success # Cycloheptane rdkitmol = Chemical('cycloheptane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 7} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 7} assert success # Cyclohexane rdkitmol = Chemical('cyclohexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 6} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 6} assert success # Cyclooctane rdkitmol = Chemical('cyclooctane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 8} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 8} assert success # Cyclopentane rdkitmol = Chemical('cyclopentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 5} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 5} assert success # Ethyl cyclohexane rdkitmol = Chemical('ethylcyclohexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH2': 1, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH2': 1, 'CH3': 1} assert success # Methyl cyclohexane rdkitmol = Chemical('methylcyclohexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH3': 1} assert success # Methyl cyclopentane rdkitmol = Chemical('methylcyclopentane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 4, 'CHcyclic': 1, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 4, 'CHcyclic': 1, 'CH3': 1} assert success # n-Butyl benzene rdkitmol = Chemical('butylbenzene').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 3, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CHaro': 5, 'Caro': 1, 'CH2': 3, 'CH3': 1} assert success # n-Propyl cyclohexane rdkitmol = Chemical('propylcyclohexane').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH2': 2, 'CH3': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 5, 'CHcyclic': 1, 'CH2': 2, 'CH3': 1} assert success # Tetralin (1,2,3,4-tetrahydronaphthalene) rdkitmol = Chemical('tetralin').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'Cfused_aromatic': 2, 'CHaro': 4, 'CH2cyclic': 4} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'Cfused_aromatic': 2, 'CHaro': 4, 'CH2cyclic': 4} assert success # Trans-decalin rdkitmol = Chemical('trans-decalin').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH2cyclic': 8, 'CHcyclic': 2} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH2cyclic': 8, 'CHcyclic': 2} assert success @pytest.mark.rdkit @@ -519,48 +525,256 @@ def test_SH_group(): """ # Methyl mercaptan (CH3-SH) rdkitmol = Chemical('methanethiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 1, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 1, 'SH': 1} assert success # Ethyl mercaptan (CH3-CH2-SH) rdkitmol = Chemical('ethanethiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 1, 'CH2': 1, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 1, 'CH2': 1, 'SH': 1} assert success # Propyl mercaptan (CH3-CH2-CH2-SH) rdkitmol = Chemical('propane-1-thiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 1, 'CH2': 2, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 1, 'CH2': 2, 'SH': 1} assert success # Butyl mercaptan (CH3-CH2-CH2-CH2-SH) rdkitmol = Chemical('butane-1-thiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 1, 'CH2': 3, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 1, 'CH2': 3, 'SH': 1} assert success # Isopropyl mercaptan (CH3-CH(CH3)-SH) rdkitmol = Chemical('propane-2-thiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH': 1, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH': 1, 'SH': 1} assert success # Secbutyl mercaptan (CH3-CH2-CH(CH3)-SH) rdkitmol = Chemical('butane-2-thiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH2': 1, 'CH': 1, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH2': 1, 'CH': 1, 'SH': 1} assert success # Isobutyl mercaptan (CH3-CH(CH3)-CH2-SH) rdkitmol = Chemical('2-methylpropane-1-thiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 2, 'CH': 1, 'CH2': 1, 'SH': 1} + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 2, 'CH': 1, 'CH2': 1, 'SH': 1} assert success # Tertbutyl mercaptan ((CH3)3C-SH) rdkitmol = Chemical('2-methylpropane-2-thiol').rdkitmol - assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS, rdkitmol=rdkitmol) - assert readable_assignment(assignment) == {'CH3': 3, 'C': 1, 'SH': 1} - assert success \ No newline at end of file + assignment, _, _, success, status = smarts_fragment_priority(catalog=PPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 3, 'C': 1, 'SH': 1} + assert success + + +def test_temperature_variation_argon_fluoranthene(): + """Test temperature dependence for Argon/Fluoranthene system.""" + # Test temperatures and expected values + T_k_pairs = [ + (150.00, 0.0329), + (298.99, 0.1241), + (400.00, 0.1149) + ] + + # Create Chemical objects once + argon = Chemical('Ar') + fluoranthene = Chemical('fluoranthene') + + # Get group contributions + groups1, _, _, success1, _ = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=argon.rdkitmol) + + # Convert assignments to readable format + groups1_readable = readable_assignment_EPPR78(groups1) + + # At time of test creation own fragmentation is different + groups2_readable = {'Cfused_aromatic': 6, 'CHaro': 10} + + for T, k_expected in T_k_pairs: + kij = PPR78_kij(T, + groups1_readable, + groups2_readable, + 150.86, 48.98E5, 0, + 905, 26.1E5, 0.587526, + version='extended') + + assert abs(kij - k_expected) < 0.0001, f"At T={T}K: Expected kij={k_expected}, got {kij}" + + +def test_naphthacene_ethanedithiol(): + """Test for Naphthacene/1,2-Ethanedithiol system using extended PPR78 model. + Value verified against author's reference calculator.""" + T = 298.15 # K + + # Create Chemical objects + naphthacene = Chemical('naphthacene') + ethanedithiol = Chemical('1,2-ethanedithiol') + + # Get group contributions from Chemical objects using EPPR78_GROUPS_LIST + groups1, _, _, success1, _ = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=naphthacene.rdkitmol) + groups2, _, _, success2, _ = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=ethanedithiol.rdkitmol) + + assert success1 and success2, "Group contribution analysis failed" + + # Calculate kij using properties from Chemical objects + kij = PPR78_kij(T, + readable_assignment_EPPR78(groups1), + readable_assignment_EPPR78(groups2), + naphthacene.Tc, naphthacene.Pc, naphthacene.omega, + ethanedithiol.Tc, ethanedithiol.Pc, ethanedithiol.omega, + version='extended') + + assert abs(kij - 0.1185) < 0.0001, f"Expected kij=0.1185, got {kij}" + +# Test known assignments from the author's spreadsheet + +@pytest.mark.rdkit +@pytest.mark.skipif(rdkit is None, reason="requires rdkit") +def test_known_fragmentations(): + """Test all known molecular fragmentations against computed ones.""" + + # Propyl mercaptan (CH3-CH2-CH2-SH) + rdkitmol = Chemical('107-03-9').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_PPR78(assignment) == {'CH3': 1, 'CH2': 2, 'SH': 1} + assert success + + rdkitmol = Chemical('CYCLOOCTENE').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_EPPR78(assignment) == {'CH2cyclic': 6, 'CHCcycloalkenic': 2} + assert success + rdkitmol = Chemical('INDENE').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_EPPR78(assignment) == {'CHaro': 4, 'Caro': 2, 'CH2cyclic': 1, 'CHCcycloalkenic': 2} + assert success + rdkitmol = Chemical('NAPHTHACENE').rdkitmol + assignment, _, _, success, status = smarts_fragment_priority(catalog=EPPR78_GROUPS_LIST, rdkitmol=rdkitmol) + assert readable_assignment_EPPR78(assignment) == {'CHaro': 12, 'Cfused_aromatic': 6} + assert success + + # CAS numbers of molecules with known/acceptable differences in fragmentation + FRAGMENTATION_EXCEPTIONS = [ + "696-29-7", # ISOPROPYLCYCLOHEXANE + "79-92-5", # CAMPHENE + "555-10-2", # beta-PHELLANDRENE + "586-62-9", # TERPINOLENE + "1961-96-2", # 1-PHENYLINDENE + "16219-75-3", # 5-ETHYLIDENE-2-NORBORNENE + "83-32-9", # ACENAPHTHENE + "66325-11-9", # 1-n-HEXYL-1,2,3,4-TETRAHYDRONAPHTHALENE + "496-11-7", # INDANE + "208-96-8", # ACENAPHTHALENE + "86-73-7", # FLUORENE + "95-13-6", # INDENE + "767-59-9", # 1-METHYLINDENE + "4773-83-5", # 1,2,3-TRIMETHYLINDENE + "2177-47-1", # 2-METHYLINDENE + "25103-58-6", # tert-DODECYL MERCAPTAN + "206-44-0", + ] + # FRAGMENTATION_EXCEPTIONS = [] + + + # Load known fragmentations + df = pd.read_csv(os.path.join(folder, 'EPPR_known_fraagmentations.csv'), sep='\t') + + # Clean up column names - remove any whitespace + df.columns = df.columns.str.strip() + + # Convert CAS and Name columns to strings, strip whitespace + df['CAS'] = df['CAS'].astype(str).str.strip() + df['Name'] = df['Name'].astype(str).str.strip() + + # Dictionary to store test results + failures = [] + molecule_differences = {} + + # Iterate through each molecule + for idx, row in df.iterrows(): + CAS = row['CAS'] + if '-' not in CAS: + CAS = int_to_CAS(int(CAS)) + name = row['Name'] + + try: + # Create a dictionary of expected non-zero groups + expected_groups = {col: count for col, count in row.items() + if col not in ['CAS', 'Name'] and count != 0} + + # Get molecular structure and compute fragments + try: + mol = Chemical(CAS).rdkitmol + except: + mol = Chemical(name).rdkitmol + assignment, _, _, success, status = smarts_fragment_priority( + catalog=EPPR78_GROUPS_LIST, + rdkitmol=mol + ) + + # Convert assignment IDs to group names + computed_groups = readable_assignment_EPPR78(assignment) + + if not success: + failures.append({ + 'cas': CAS, + 'name': name, + 'error': f"Failed to compute fragments: {status}" + }) + continue + + # Compare all groups and record differences + all_groups = set(expected_groups.keys()) | set(computed_groups.keys()) + differences = {} + for group in all_groups: + expected = expected_groups.get(group, 0) + computed = computed_groups.get(group, 0) + if expected != computed: + differences[group] = { + 'expected': expected, + 'computed': computed + } + + if differences: + if CAS in FRAGMENTATION_EXCEPTIONS: + continue + molecule_differences[f"{name} ({CAS})"] = { + 'expected_structure': expected_groups, + 'computed_structure': computed_groups, + 'differences': differences + } + + except Exception as e: + failures.append({ + 'cas': CAS, + 'name': name, + 'error': str(e) + }) + + # Prepare detailed error messages + failure_message = "" + if failures: + failure_details = [f"{f['name']} ({f['cas']}): {f['error']}" for f in failures] + failure_message = f"{len(failures)} molecules failed fragment computation:\n" + "\n".join(failure_details) + + difference_message = "" + if molecule_differences: + diff_details = [] + for mol_name, diff in molecule_differences.items(): + diff_details.append(f"\n{mol_name}:") + diff_details.append("Expected structure:") + diff_details.append(str(diff['expected_structure'])) + diff_details.append("Computed structure:") + diff_details.append(str(diff['computed_structure'])) + diff_details.append("Differences:") + for group, vals in diff['differences'].items(): + diff_details.append(f" {group}: expected={vals['expected']}, computed={vals['computed']}") + + difference_message = f"{len(molecule_differences)} molecules have structural differences:\n" + "\n".join(diff_details) + + # Assert with detailed messages + assert not failures, failure_message + assert not molecule_differences, difference_message \ No newline at end of file diff --git a/thermo/group_contribution/group_contribution_base.py b/thermo/group_contribution/group_contribution_base.py index 2741e089..0213115c 100644 --- a/thermo/group_contribution/group_contribution_base.py +++ b/thermo/group_contribution/group_contribution_base.py @@ -204,6 +204,21 @@ def smarts_fragment_priority(catalog, rdkitmol=None, smi=None): hits = list(hits) else: hits = list(rdkitmol.GetSubstructMatches(patt)) + if not hits and len(obj.atoms) == 1 and 'H' in obj.atoms: + hits = list(rdkitmol_Hs.GetSubstructMatches(patt)) + # Special handling for H2 molecule + if hits: + # If this is a hydrogen-only group (like H2) and the molecule has only H atoms + num_atoms = rdkitmol_Hs.GetNumAtoms() + if num_atoms == H_count and H_count == obj.atoms['H']: + # For H2, return all expected values + counts = {key: 1} # One instance of this group (H2) + group_assignments = {key: [()]} # Empty tuple as there are no heavy atoms + matched_atoms = set() # No heavy atoms to match + success = True + status = 'OK' + return counts, group_assignments, matched_atoms, success, status + if hits: all_matches[key] = hits counts[key] = len(hits) diff --git a/thermo/group_contribution/ppr78.py b/thermo/group_contribution/ppr78.py index 479c859c..d1464ce8 100644 --- a/thermo/group_contribution/ppr78.py +++ b/thermo/group_contribution/ppr78.py @@ -93,8 +93,189 @@ def __repr__(self): group.priority = priority_from_atoms(group.atoms, group.bonds) PPR78_GROUPS_BY_ID[group.group_id] = group -catalog = PPR78_GROUPS.values() +GROUP_ID_COUNTER = 1 +EPPR78_GROUPS_BY_ID = {} +EPPR78_GROUPS = {} +# The order of these statements is sensitive +EPPR78_GROUPS['CH3'] = PPR78GroupContribution('CH3', smarts='[CX4;H3]', atoms={'C': 1, 'H': 3}, bonds={}) +EPPR78_GROUPS['CH2'] = PPR78GroupContribution('CH2', smarts='[CX4;H2]', atoms={'C': 1, 'H': 2}, bonds={}) +EPPR78_GROUPS['CH'] = PPR78GroupContribution('CH', smarts='[CX4;H1]', atoms={'C': 1, 'H': 1}, bonds={}) +EPPR78_GROUPS['C'] = PPR78GroupContribution('C', smarts='[CX4;H0]', atoms={'C': 1, 'H': 0}, bonds={}) +EPPR78_GROUPS['CH4'] = PPR78GroupContribution('CH4', atoms={'C': 1, 'H': 4}, bonds={}, smarts='[CX4H4]') +EPPR78_GROUPS['C2H6'] = PPR78GroupContribution('C2H6', atoms={'C': 2, 'H': 6}, bonds={}, smarts='[CH3X4]-[CH3X4]') +EPPR78_GROUPS['CHaro'] = PPR78GroupContribution('CHaro', atoms={'C': 1, 'H': 1}, bonds={AROMATIC_BOND: 2}, smarts='[cH]') +EPPR78_GROUPS['Caro'] = PPR78GroupContribution('Caro', atoms={'C': 1}, bonds={AROMATIC_BOND: 2}, smarts='[c]') +EPPR78_GROUPS['Cfused_aromatic'] = PPR78GroupContribution('Cfused_aromatic', atoms={'C': 1}, bonds={AROMATIC_BOND: 3}, + smarts=[ # Unclear definition and assignment - ACENAPHTHENE has 2 fused groups, FLUORANTHENE has 6, NAPHTHACENE, 6, and INDENE 0. + '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r6])]', + '[c;R3,R4,R5,R6;r;H0;$([c;R3])]' + + ], priority=10000) +EPPR78_GROUPS['CH2cyclic'] = PPR78GroupContribution('CH2cyclic', atoms={'C': 1, 'H': 2}, bonds={}, smarts='[CH2R]') +# CHcyclic is not also Ccyclic - major difference +EPPR78_GROUPS['CHcyclic'] = PPR78GroupContribution('CHcyclic', atoms={'C': 1, 'H': 1}, bonds={}, smarts='[C;H1,H0;R]', hydrogen_from_smarts=True) +EPPR78_GROUPS['CO2'] = PPR78GroupContribution('CO2', atoms={'C': 1, 'O': 2}, bonds={DOUBLE_BOND: 2}, smarts='[CX2H0](=[OX1H0])=[OX1H0]') +EPPR78_GROUPS['N2'] = PPR78GroupContribution('N2', atoms={'N': 2}, bonds={TRIPLE_BOND: 1}, smarts='N#N') +EPPR78_GROUPS['H2S'] = PPR78GroupContribution('H2S', atoms={'S': 1, 'H': 2}, bonds={}, smarts='[SH2]') +EPPR78_GROUPS['SH'] = PPR78GroupContribution('SH', atoms={'S': 1, 'H': 1}, bonds={}, smarts='[S;H1]') + +# Water +EPPR78_GROUPS['H2O'] = PPR78GroupContribution('H2O', + atoms={'O': 1, 'H': 2}, + bonds={}, + smarts='[OH2]') + +# Ethylene +EPPR78_GROUPS['C2H4'] = PPR78GroupContribution('C2H4', + atoms={'C': 2, 'H': 4}, + bonds={DOUBLE_BOND: 1}, priority=10000, + smarts='[CH2]=[CH2]') + +# Combined alkenic CH2/CH group +EPPR78_GROUPS['CH2CHalkenic'] = PPR78GroupContribution('CH2CHalkenic', + atoms={'C': 1, 'H': 1}, # Average values + bonds={DOUBLE_BOND: 1}, hydrogen_from_smarts=True, + smarts=['[C;!R;H1,H2;$(C=[C])]'], + priority=1000) + +# Alkenic carbon without hydrogen +EPPR78_GROUPS['Calkenic'] = PPR78GroupContribution('Calkenic', + atoms={'C': 1}, + bonds={DOUBLE_BOND: 1}, + smarts='[C;!R;H0;$(C=[C])]') + +# Combined cycloalkenic CH/C group +EPPR78_GROUPS['CHCcycloalkenic'] = PPR78GroupContribution('CHCcycloalkenic', + atoms={'C': 1, 'H': 0.5}, # Average values + bonds={DOUBLE_BOND: 1}, hydrogen_from_smarts=True, + smarts=['[C;R;H1,H0;$(C=[C])]'], + priority=5000) + +# Hydrogen molecule +EPPR78_GROUPS['H2'] = PPR78GroupContribution('H2', + atoms={'H': 2}, + bonds={SINGLE_BOND: 1}, + smarts='[H][H]', hydrogen_from_smarts=True) + +# Fluorinated compounds +EPPR78_GROUPS['C2F6'] = PPR78GroupContribution('C2F6', + atoms={'C': 2, 'F': 6}, + bonds={SINGLE_BOND: 7}, # 1 C-C + 6 C-F + smarts='[C;X4;H0;F3]-[C;X4;H0;F3]') + +EPPR78_GROUPS['CF3'] = PPR78GroupContribution('CF3', + atoms={'C': 1, 'F': 3}, + bonds={}, + smarts='[C;X4;H0;F3]') + +EPPR78_GROUPS['CF2'] = PPR78GroupContribution('CF2', + atoms={'C': 1, 'F': 2}, + bonds={}, + smarts='[C;X4;H0;F2]') + +# Combined fluorinated alkenic CF2/CF group +EPPR78_GROUPS['CF2CFdouble'] = PPR78GroupContribution('CF2CFdouble', + atoms={'C': 1, 'F': 1.5}, # Average values + bonds={DOUBLE_BOND: 1}, + smarts=['[C;H0;F2]=[C]', '[C;H0;F1]=[C]'], + priority=1000) + +# Partially fluorinated ethanes +EPPR78_GROUPS['C2H4F2'] = PPR78GroupContribution('C2H4F2', + atoms={'C': 2, 'H': 4, 'F': 2}, + bonds={SINGLE_BOND: 7}, # 1 C-C + 4 C-H + 2 C-F + smarts='[C;X4;H2;F1]-[C;X4;H2;F1]') + +EPPR78_GROUPS['C2H2F4'] = PPR78GroupContribution('C2H2F4', + atoms={'C': 2, 'H': 2, 'F': 4}, + bonds={SINGLE_BOND: 7}, # 1 C-C + 2 C-H + 4 C-F + smarts='[C;X4;H1;F2]-[C;X4;H1;F2]') + +# Carbon monoxide +EPPR78_GROUPS['CO'] = PPR78GroupContribution('CO', + atoms={'C': 1, 'O': 1}, + bonds={TRIPLE_BOND: 1}, + smarts='[C]#[O]') + +# Noble gases +EPPR78_GROUPS['He'] = PPR78GroupContribution('He', + atoms={'He': 1}, + bonds={}, + smarts='[He]') + +EPPR78_GROUPS['Ar'] = PPR78GroupContribution('Ar', + atoms={'Ar': 1}, + bonds={}, + smarts='[Ar]') + +# Sulfur dioxide +EPPR78_GROUPS['SO2'] = PPR78GroupContribution('SO2', + atoms={'S': 1, 'O': 2}, + bonds={DOUBLE_BOND: 2}, + smarts='[SX4](=[OX1])(=[OX1])') + +# Oxygen molecule +EPPR78_GROUPS['O2'] = PPR78GroupContribution('O2', + atoms={'O': 2}, + bonds={DOUBLE_BOND: 1}, + smarts='[O]=[O]') + +# Nitric oxide +EPPR78_GROUPS['NO'] = PPR78GroupContribution('NO', + atoms={'N': 1, 'O': 1}, + bonds={DOUBLE_BOND: 1}, + smarts='[N]=[O]') + +# Carbonyl sulfide +EPPR78_GROUPS['COS'] = PPR78GroupContribution('COS', + atoms={'C': 1, 'O': 1, 'S': 1}, + bonds={DOUBLE_BOND: 2}, + smarts='[O]=[C]=[S]') + +# Ammonia +EPPR78_GROUPS['NH3'] = PPR78GroupContribution('NH3', + atoms={'N': 1, 'H': 3}, + bonds={}, + smarts='[NH3]') + +# Combined NO2/N2O4 group +EPPR78_GROUPS['NO2N2O4'] = PPR78GroupContribution('NO2N2O4', + atoms={'N': 1.5, 'O': 2}, # Average values + bonds={DOUBLE_BOND: 1, SINGLE_BOND: 1}, + smarts=['[N](=[O])[O]', '[N]([O])[O]-[N]([O])[O]'], + priority=1000) + +# Nitrous oxide +EPPR78_GROUPS['N2O'] = PPR78GroupContribution('N2O', + atoms={'N': 2, 'O': 1}, + bonds={DOUBLE_BOND: 2}, + smarts='[N]=[N]=[O]') + +# Acetylene +EPPR78_GROUPS['C2H2'] = PPR78GroupContribution('C2H2', + atoms={'C': 2, 'H': 2}, + bonds={TRIPLE_BOND: 1}, + smarts='[CH]#[CH]') + +# Terminal acetylenic group +EPPR78_GROUPS['HC≡C'] = PPR78GroupContribution('HC≡C', + atoms={'C': 1, 'H': 1}, + bonds={TRIPLE_BOND: 1}, + smarts='[CH]#[C]') + +# Internal acetylenic group +EPPR78_GROUPS['C≡C'] = PPR78GroupContribution('C≡C', + atoms={'C': 1}, + bonds={TRIPLE_BOND: 1}, + smarts='[C]#[C]') + +# Populate EPPR78_GROUPS_BY_ID for easy lookup +for group in EPPR78_GROUPS.values(): + if group.priority is None: + if group.atoms is not None: + group.priority = priority_from_atoms(group.atoms, group.bonds) + EPPR78_GROUPS_BY_ID[group.group_id] = group # format A, B value indexed by tuple of groups PPR78_INTERACTIONS = {} @@ -225,31 +406,396 @@ def __repr__(self): PPR78_INTERACTIONS[(PPR78_GROUPS['H2S'], PPR78_GROUPS['SH'])] = (-77.21, 156.1) -# Symmetrize and fill missing interactions -PPR78_ZERO_PARAMETER = (0.0, 0.0) -# Symmetrize the PPR78_INTERACTIONS -groups = list(PPR78_GROUPS.values()) -# Loop through all pairs of groups to ensure symmetry and fill defaults -for group1 in groups: - for group2 in groups: - key = (group1, group2) - reverse_key = (group2, group1) - # Symmetrize: if key exists but reverse_key does not, copy the value - if key in PPR78_INTERACTIONS and reverse_key not in PPR78_INTERACTIONS: - PPR78_INTERACTIONS[reverse_key] = PPR78_INTERACTIONS[key] - # Missing parameters are zero - if key not in PPR78_INTERACTIONS and reverse_key not in PPR78_INTERACTIONS: - PPR78_INTERACTIONS[key] = PPR78_ZERO_PARAMETER - PPR78_INTERACTIONS[reverse_key] = PPR78_ZERO_PARAMETER + +PPR78_GROUP_IDS = [k.group_id for k in PPR78_GROUPS.values()] +PPR78_GROUPS_LIST = list(PPR78_GROUPS.values()) + +EPPR78_GROUP_IDS = [k.group_id for k in EPPR78_GROUPS.values()] +EPPR78_GROUPS_LIST = list(EPPR78_GROUPS.values()) + + +EPPR78_INTERACTIONS = {} +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CH2'])] = (65.5, 105.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CH'])] = (214.9, 294.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CH'])] = (39.0, 41.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C'])] = (431.6, 575.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C'])] = (134.5, 183.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['C'])] = (-86.1, 85.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CH4'])] = (28.5, 20.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CH4'])] = (37.7, 74.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CH4'])] = (131.4, 157.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CH4'])] = (309.5, 35.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C2H6'])] = (3.8, 8.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C2H6'])] = (29.9, 65.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['C2H6'])] = (156.1, 96.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['C2H6'])] = (388.1, -224.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['C2H6'])] = (10.0, 13.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CHaro'])] = (98.8, 136.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CHaro'])] = (25.0, 64.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CHaro'])] = (56.6, 129.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CHaro'])] = (170.5, 284.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['CHaro'])] = (67.3, 167.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CHaro'])] = (41.2, 50.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['Caro'])] = (103.6, 103.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['Caro'])] = (5.1, -7.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['Caro'])] = (48.7, -89.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['Caro'])] = (128.3, 189.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['Caro'])] = (106.7, 190.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['Caro'])] = (67.9, 210.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['Caro'])] = (-16.5, 16.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['Cfused_aromatic'])] = (624.9, 774.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['Cfused_aromatic'])] = (-17.8, -4.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['Cfused_aromatic'])] = (249.1, 408.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['Cfused_aromatic'])] = (52.5, 251.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['Cfused_aromatic'])] = (-328.0, -569.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CH2cyclic'])] = (43.6, 60.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CH2cyclic'])] = (8.6, 27.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CH2cyclic'])] = (73.1, 71.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CH2cyclic'])] = (208.6, 294.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['CH2cyclic'])] = (34.0, 5.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CH2cyclic'])] = (12.7, 73.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CH2cyclic'])] = (28.8, 65.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CH2cyclic'])] = (37.4, 53.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['CH2cyclic'])] = (140.7, 277.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CHcyclic'])] = (293.4, 170.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CHcyclic'])] = (63.5, -74.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CHcyclic'])] = (-120.8, 18.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CHcyclic'])] = (25.0, 81.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['CHcyclic'])] = (188.0, 473.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CHcyclic'])] = (118.0, -212.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CHcyclic'])] = (129.0, 36.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CHcyclic'])] = (-99.2, -193.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['CHcyclic'])] = (-99.2, -193.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CHcyclic'])] = (139.0, 35.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CO2'])] = (144.8, 401.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CO2'])] = (141.4, 237.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CO2'])] = (191.8, 380.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CO2'])] = (377.5, 162.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['CO2'])] = (136.6, 214.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CO2'])] = (136.2, 235.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CO2'])] = (98.5, 253.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CO2'])] = (154.4, 374.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['CO2'])] = (331.1, 276.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CO2'])] = (144.1, 354.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['CO2'])] = (216.2, -132.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['N2'])] = (38.1, 88.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['N2'])] = (83.7, 188.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['N2'])] = (383.6, 375.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['N2'])] = (341.8, 635.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['N2'])] = (30.9, 37.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['N2'])] = (61.6, 84.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['N2'])] = (185.3, 490.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['N2'])] = (343.8, 1712.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['N2'])] = (702.4, 1888.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['N2'])] = (179.5, 546.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['N2'])] = (331.5, 389.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['N2'])] = (113.9, 212.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['H2S'])] = (159.6, 227.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['H2S'])] = (136.6, 124.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['H2S'])] = (192.5, 562.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['H2S'])] = (330.8, -297.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['H2S'])] = (190.1, 307.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['H2S'])] = (157.2, 217.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['H2S'])] = (21.3, 6.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['H2S'])] = (9.6, -36.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['H2S'])] = (9.6, -36.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['H2S'])] = (117.4, 166.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['H2S'])] = (71.4, -127.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['H2S'])] = (135.2, 199.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['H2S'])] = (319.5, 550.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['SH'])] = (789.6, 1829.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['SH'])] = (439.9, 504.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['SH'])] = (374.0, 520.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['SH'])] = (685.9, 1546.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['SH'])] = (701.7, 1318.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['SH'])] = (277.6, 449.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['SH'])] = (1002.0, -736.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['SH'])] = (1002.0, -736.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['SH'])] = (493.1, 832.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['SH'])] = (463.2, -337.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2S'], EPPR78_GROUPS['SH'])] = (-157.8, 153.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['H2O'])] = (3557.4, 11194.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['H2O'])] = (4324.3, 12126.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['H2O'])] = (971.4, 567.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['H2O'])] = (2277.1, 4719.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['H2O'])] = (2333.4, 5147.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['H2O'])] = (2267.5, 6218.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['H2O'])] = (543.5, 411.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['H2O'])] = (1340.3, -65.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['H2O'])] = (4210.7, 13031.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['H2O'])] = (244.0, -60.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['H2O'])] = (559.3, 277.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['H2O'])] = (2573.6, 5490.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2S'], EPPR78_GROUPS['H2O'])] = (603.9, 599.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['SH'], EPPR78_GROUPS['H2O'])] = (30.9, -113.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C2H4'])] = (7.9, 35.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C2H4'])] = (59.7, 82.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['C2H4'])] = (147.9, -55.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['C2H4'])] = (366.8, -219.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['C2H4'])] = (19.2, 33.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['C2H4'])] = (7.5, 20.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['C2H4'])] = (25.7, 78.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['C2H4'])] = (97.8, 67.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['C2H4'])] = (209.7, 3818.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['C2H4'])] = (35.3, 52.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['C2H4'])] = (297.2, -647.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['C2H4'])] = (73.1, 106.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['C2H4'])] = (45.3, 92.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['C2H4'])] = (1650.2, 1660.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CH2CHalkenic'])] = (48.7, 44.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CH2CHalkenic'])] = (9.6, 50.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CH2CHalkenic'])] = (84.8, 193.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CH2CHalkenic'])] = (181.2, 419.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['CH2CHalkenic'])] = (48.7, 68.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CH2CHalkenic'])] = (26.8, -5.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CH2CHalkenic'])] = (10.0, 19.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CH2CHalkenic'])] = (-48.4, 27.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['CH2CHalkenic'])] = (669.8, 589.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CH2CHalkenic'])] = (-15.4, 24.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['CH2CHalkenic'])] = (260.1, 134.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['CH2CHalkenic'])] = (60.7, 183.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['CH2CHalkenic'])] = (59.7, 227.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['CH2CHalkenic'])] = (2243.5, 5199.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['CH2CHalkenic'])] = (14.8, 11.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['Calkenic'])] = (102.6, 260.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['Calkenic'])] = (64.9, 51.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['Calkenic'])] = (91.6, 54.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['Calkenic'])] = (-16.5, 61.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['Calkenic'])] = (343.1, 880.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['Calkenic'])] = (159.6, 140.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['Calkenic'])] = (74.8, -266.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['Calkenic'])] = (541.5, 94.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['Calkenic'])] = (-518.2, 6814.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['Calkenic'])] = (24.7, 121.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CHCcycloalkenic'])] = (47.0, 169.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CHCcycloalkenic'])] = (34.3, 51.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CHCcycloalkenic'])] = (3.8, 1.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CHCcycloalkenic'])] = (242.9, -7.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CHCcycloalkenic'])] = (31.9, 69.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['CHCcycloalkenic'])] = (151.3, 2.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['CHCcycloalkenic'])] = (87.8, 66.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['CHCcycloalkenic'])] = (-98.8, 1809.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['CHCcycloalkenic'])] = (14.1, -12.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Calkenic'], EPPR78_GROUPS['CHCcycloalkenic'])] = (23.7, 87.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['H2'])] = (174.0, 239.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['H2'])] = (155.4, 240.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['H2'])] = (326.0, 287.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['H2'])] = (548.3, 2343.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['H2'])] = (156.1, 93.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['H2'])] = (137.6, 150.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['H2'])] = (288.9, 189.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['H2'])] = (400.1, 1201.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['H2'])] = (602.9, 1463.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['H2'])] = (236.1, 192.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['H2'])] = (-51.8, 34.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['H2'])] = (261.1, 300.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['H2'])] = (65.2, 70.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2S'], EPPR78_GROUPS['H2'])] = (145.8, 823.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['H2'])] = (830.8, -137.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['H2'])] = (151.3, 165.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['H2'])] = (175.7, 373.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Calkenic'], EPPR78_GROUPS['H2'])] = (621.4, 873.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHCcycloalkenic'], EPPR78_GROUPS['H2'])] = (460.8, 2167.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C2F6'])] = (119.1, 118.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C2F6'])] = (105.0, 130.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['C2F6'])] = (96.1, 123.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['C2F6'])] = (126.6, 241.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['C2F6'])] = (124.9, 219.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CF3'])] = (123.2, 133.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CF3'])] = (195.6, 199.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CF3'])] = (531.5, -1945.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CF3'])] = (413.1, 975.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CF3'])] = (87.2, 143.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CF3'])] = (680.1, 421.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CF3'])] = (733.0, 866.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CF3'])] = (216.2, 343.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['CF3'])] = (156.5, -116.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['CF3'])] = (453.0, -611.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['CF3'])] = (155.4, 154.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHCcycloalkenic'], EPPR78_GROUPS['CF3'])] = (1231.9, -495.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2F6'], EPPR78_GROUPS['CF3'])] = (-14.5, -87.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CF2'])] = (58.3, 65.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CF2'])] = (58.3, 68.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['CF2'])] = (-122.8, 458.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['CF2'])] = (479.0, 1430.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CF2'])] = (79.3, 15.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CF2'])] = (-31.6, 43.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CF2'])] = (-8.9, 5.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CF2'])] = (42.6, -68.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['CF2'])] = (125.2, 340.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['CF2'])] = (155.4, 154.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CF2CFdouble'])] = (-12.3, 16.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CF2CFdouble'])] = (95.5, -231.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CF2CFdouble'])] = (-274.3, -411.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CF2CFdouble'])] = (78.6, -108.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['CF2CFdouble'])] = (36.2, 63.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['CF2CFdouble'])] = (-132.7, 548.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['CF2CFdouble'])] = (88.2, 12.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2F6'], EPPR78_GROUPS['CF2CFdouble'])] = (55.9, -193.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CF3'], EPPR78_GROUPS['CF2CFdouble'])] = (17.5, -93.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C2H4F2'])] = (128.3, 292.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C2H4F2'])] = (107.1, 119.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['C2H4F2'])] = (143.8, 15.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['C2H4F2'])] = (48.7, 751.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['C2H4F2'])] = (76.9, -145.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CF3'], EPPR78_GROUPS['C2H4F2'])] = (113.2, 247.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CF2'], EPPR78_GROUPS['C2H4F2'])] = (120.1, 264.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C2H2F4'])] = (158.5, 356.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C2H2F4'])] = (86.5, -40.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['C2H2F4'])] = (121.5, -44.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['C2H2F4'])] = (72.4, -305.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['C2H2F4'])] = (29.5, 89.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['C2H2F4'])] = (64.5, -41.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2F6'], EPPR78_GROUPS['C2H2F4'])] = (60.7, 217.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CF3'], EPPR78_GROUPS['C2H2F4'])] = (28.1, 8.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CF2'], EPPR78_GROUPS['C2H2F4'])] = (229.9, 259.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4F2'], EPPR78_GROUPS['C2H2F4'])] = (-4.1, 4.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['CO'])] = (91.2, 94.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['CO'])] = (44.0, 45.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['CO'])] = (14.4, 20.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['CO'])] = (15.4, 33.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['CO'])] = (153.4, 153.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['CO'])] = (125.8, -231.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['CO'])] = (197.0, -238.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['CO'])] = (113.1, 143.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['CO'])] = (87.8, 190.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['CO'])] = (23.3, -25.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2S'], EPPR78_GROUPS['CO'])] = (278.6, 404.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['CO'])] = (715.1, -89.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['CO'])] = (84.6, -7.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2'], EPPR78_GROUPS['CO'])] = (75.8, 74.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['He'])] = (416.3, 513.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['He'])] = (520.5, 673.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['He'])] = (728.1, 750.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['He'])] = (394.5, 378.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['He'])] = (581.3, 517.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['He'])] = (753.6, 590.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['He'])] = (753.6, 590.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Cfused_aromatic'], EPPR78_GROUPS['He'])] = (753.6, 590.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['He'])] = (685.9, 559.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['He'])] = (204.7, 222.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4'], EPPR78_GROUPS['He'])] = (569.6, 536.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['He'])] = (644.3, 687.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2'], EPPR78_GROUPS['He'])] = (138.7, 95.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO'], EPPR78_GROUPS['He'])] = (260.1, 259.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['Ar'])] = (11.3, 55.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['Ar'])] = (113.6, 231.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['Ar'])] = (185.8, 634.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C'], EPPR78_GROUPS['Ar'])] = (899.0, 4654.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['Ar'])] = (16.0, 24.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['Ar'])] = (43.8, 53.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['Ar'])] = (195.6, 361.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['Ar'])] = (1268.7, 18665.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['Ar'])] = (177.7, 86.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['Ar'])] = (6.5, 8.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['Ar'])] = (1197.2, 1211.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['Ar'])] = (203.0, -11.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2'], EPPR78_GROUPS['Ar'])] = (128.2, 102.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO'], EPPR78_GROUPS['Ar'])] = (4.0, 8.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['He'], EPPR78_GROUPS['Ar'])] = (243.1, 305.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['SO2'])] = (322.2, 201.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['SO2'])] = (55.9, -28.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['SO2'])] = (-70.0, 233.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['SO2'])] = (205.9, 323.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['SO2'])] = (37.1, -23.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['SO2'])] = (-196.6, -397.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['SO2'])] = (54.9, 59.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['SO2'])] = (282.4, 362.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['SO2'])] = (374.4, 148.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['SO2'])] = (26.8, 26.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Calkenic'], EPPR78_GROUPS['SO2'])] = (-141.7, -151.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Ar'], EPPR78_GROUPS['SO2'])] = (299.9, 354.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['O2'])] = (86.1, 87.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['O2'])] = (107.4, 200.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['O2'])] = (233.3, 404.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['O2'])] = (216.2, 3826.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['O2'])] = (181.2, 281.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['O2'])] = (102.3, 987.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['O2'])] = (154.4, 109.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['O2'])] = (2.4, 4.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['O2'])] = (1376.0, 1609.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Ar'], EPPR78_GROUPS['O2'])] = (4.8, 7.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['SO2'], EPPR78_GROUPS['O2'])] = (339.9, 665.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['NO'])] = (-27.5, 50.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['NO'])] = (5.1, 48.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['NO'])] = (258.7, 100.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO'], EPPR78_GROUPS['NO'])] = (309.2, 28.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Ar'], EPPR78_GROUPS['NO'])] = (110.8, 155.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['SO2'], EPPR78_GROUPS['NO'])] = (172.3, 1343.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['COS'])] = (44.6, -95.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['COS'])] = (83.0, 165.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2S'], EPPR78_GROUPS['COS'])] = (101.9, 98.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['NH3'])] = (436.1, 958.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['NH3'])] = (585.7, 1011.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['NH3'])] = (-550.1, -1404.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2'], EPPR78_GROUPS['NH3'])] = (701.7, 931.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Ar'], EPPR78_GROUPS['NH3'])] = (630.0, 1794.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['NO2N2O4'])] = (124.9, 241.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['NO2N2O4'])] = (263.5, 256.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Ar'], EPPR78_GROUPS['NO2N2O4'])] = (278.6, 274.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['O2'], EPPR78_GROUPS['NO2N2O4'])] = (271.1, 362.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH4'], EPPR78_GROUPS['N2O'])] = (74.8, 107.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['N2O'])] = (3.8, 14.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['N2'], EPPR78_GROUPS['N2O'])] = (101.6, 230.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['N2O'])] = (568.9, -144.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['O2'], EPPR78_GROUPS['N2O'])] = (120.1, 105.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C2H2'])] = (-6.9, 41.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C2H2'])] = (421.0, 1193.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H6'], EPPR78_GROUPS['C2H2'])] = (137.9, 168.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['C2H2'])] = (29.2, 123.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['C2H2'])] = (436.8, -200.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['C2H2'])] = (165.4, 39.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H4F2'], EPPR78_GROUPS['C2H2'])] = (-58.7, 303.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['NH3'], EPPR78_GROUPS['C2H2'])] = (-56.3, -1.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['HC≡C'])] = (306.1, 1167.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['HC≡C'])] = (303.3, 316.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['HC≡C'])] = (206.9, 3975.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['HC≡C'])] = (96.1, 148.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['HC≡C'])] = (176.0, -459.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['HC≡C'])] = (496.2, 496.2) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHcyclic'], EPPR78_GROUPS['HC≡C'])] = (863.7, 863.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CO2'], EPPR78_GROUPS['HC≡C'])] = (60.1, -81.0) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['H2O'], EPPR78_GROUPS['HC≡C'])] = (-2395.5, -11671.4) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['HC≡C'])] = (134.5, 568.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Calkenic'], EPPR78_GROUPS['HC≡C'])] = (212.8, -2182.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['C2H2'], EPPR78_GROUPS['HC≡C'])] = (122.5, 247.8) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH3'], EPPR78_GROUPS['C≡C'])] = (72.1, 1219.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2'], EPPR78_GROUPS['C≡C'])] = (488.0, 826.6) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH'], EPPR78_GROUPS['C≡C'])] = (4.5, -245.3) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CHaro'], EPPR78_GROUPS['C≡C'])] = (403.9, 403.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Caro'], EPPR78_GROUPS['C≡C'])] = (518.5, 518.5) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2cyclic'], EPPR78_GROUPS['C≡C'])] = (845.9, 845.9) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['CH2CHalkenic'], EPPR78_GROUPS['C≡C'])] = (255.6, 676.7) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['Calkenic'], EPPR78_GROUPS['C≡C'])] = (-874.3, 1040.1) +EPPR78_INTERACTIONS[(EPPR78_GROUPS['HC≡C'], EPPR78_GROUPS['C≡C'])] = (-497.6, -824.2) + + +ZERO_PARAMETER = (0.0, 0.0) + +for interactions_dict, groups_dict in [(PPR78_INTERACTIONS, PPR78_GROUPS), + (EPPR78_INTERACTIONS, EPPR78_GROUPS)]: + groups = list(groups_dict.values()) + for group1 in groups: + for group2 in groups: + key = (group1, group2) + reverse_key = (group2, group1) + # Symmetrize: if key exists but reverse_key does not, copy the value + if key in interactions_dict and reverse_key not in interactions_dict: + interactions_dict[reverse_key] = interactions_dict[key] + # Missing parameters are zero + if key not in interactions_dict and reverse_key not in interactions_dict: + interactions_dict[key] = ZERO_PARAMETER + interactions_dict[reverse_key] = ZERO_PARAMETER PPR78_INTERACTIONS_BY_STR = {} for (group1, group2), value in PPR78_INTERACTIONS.items(): PPR78_INTERACTIONS_BY_STR[(group1.group, group2.group)] = value -PPR78_GROUP_IDS = [k.group_id for k in PPR78_GROUPS.values()] -PPR78_GROUPS = list(PPR78_GROUPS.values()) +EPPR78_INTERACTIONS_BY_STR = {} +for (group1, group2), value in EPPR78_INTERACTIONS.items(): + EPPR78_INTERACTIONS_BY_STR[(group1.group, group2.group)] = value -def PPR78_kij(T, molecule1_groups, molecule2_groups, Tc1, Pc1, omega1, Tc2, Pc2, omega2): +def PPR78_kij(T, molecule1_groups, molecule2_groups, Tc1, Pc1, omega1, Tc2, Pc2, omega2, version='original'): r'''Calculate binary interaction parameter kij(T) between two molecules using the PPR78 method. This function implements the PPR78 (Predictive Peng-Robinson 1978) method to calculate @@ -295,6 +841,8 @@ def PPR78_kij(T, molecule1_groups, molecule2_groups, Tc1, Pc1, omega1, Tc2, Pc2, Critical pressure of molecule 2 [Pa] omega2 : float Acentric factor of molecule 2 [-] + version : str, optional + Version of the method to use ('original' or 'extended'), defaults to 'original' Returns ------- @@ -303,25 +851,20 @@ def PPR78_kij(T, molecule1_groups, molecule2_groups, Tc1, Pc1, omega1, Tc2, Pc2, Examples -------- - >>> # Example for methane-ethane system + >>> # Example for methane-ethane system using original PPR78 >>> PPR78_kij(298.15, {"CH3": 1}, {"CH3": 2}, Tc1=190.564, Pc1=4599200, omega1=0.01142, Tc2=305.322, Pc2=4872200, omega2=0.0995) - -0.0096176 - - Notes - ----- - Confirmed with an example in [2]_. + -0.009617659 - References - ---------- - .. [1] Jaubert, Jean-Noël, Romain Privat, and Fabrice Mutelet. "Predicting - the Phase Equilibria of Synthetic Petroleum Fluids with the PPR78 - Approach." AIChE Journal 56, no. 12 (2010): 3225-35. - https://doi.org/10.1002/aic.12232. - .. [2] Jaubert, Jean-Noël, and Fabrice Mutelet. "VLE Predictions with the - Peng-Robinson Equation of State and Temperature Dependent Kij Calculated - through a Group Contribution Method." Fluid Phase Equilibria 224, - no. 2 (October 1, 2004): 285-304. doi:10.1016/j.fluid.2004.06.059. + >>> # Same system using extended PPR78 + >>> PPR78_kij(298.15, {"CH3": 1}, {"CH3": 2}, Tc1=190.564, Pc1=4599200, omega1=0.01142, Tc2=305.322, Pc2=4872200, omega2=0.0995, version='extended') + -0.009617659 ''' + if version not in ('original', 'extended'): + raise ValueError("version must be either 'original' or 'extended'") + + # Select the appropriate interaction parameters based on version + interactions = EPPR78_INTERACTIONS_BY_STR if version == 'extended' else PPR78_INTERACTIONS_BY_STR + OMEGA_A = 0.4572355289213821893834601962251837888504 OMEGA_B = 0.0777960739038884559718447100373331839711 @@ -340,7 +883,6 @@ def calculate_m(omega): m1 = calculate_m(omega1) m2 = calculate_m(omega2) - # a_alpha in thermo, matches PR78 ai_T1 = (OMEGA_A * R**2 * Tc1**2 / Pc1) * (1 + m1 * (1 - sqrt(T/Tc1)))**2 ai_T2 = (OMEGA_A * R**2 * Tc2**2 / Pc2) * (1 + m2 * (1 - sqrt(T/Tc2)))**2 @@ -360,14 +902,14 @@ def calculate_m(omega): alpha_il = alpha_i.get(group_l, 0.0) alpha_jl = alpha_j.get(group_l, 0.0) - A_kl, B_kl = PPR78_INTERACTIONS_BY_STR[(group_k, group_l)] + A_kl, B_kl = interactions[(group_k, group_l)] if A_kl != 0: delta_k = alpha_ik - alpha_jk delta_l = alpha_il - alpha_jl term1 += delta_k * delta_l * A_kl * (298.15/T)**(B_kl/A_kl - 1) term1 *= -0.5 - term1 *= 1e6 # Didn't catch that the first time around + term1 *= 1e6 # Calculate second term (EOS parameters) sqrt_ai_T1 = sqrt(ai_T1) @@ -381,9 +923,9 @@ def calculate_m(omega): kij_value = (term1 - term2)/denominator return kij_value -def PPR78_kijs(T, groups, Tcs, Pcs, omegas): +def PPR78_kijs(T, groups, Tcs, Pcs, omegas, version='original'): r"""Calculate the binary interaction parameter (kij) matrix for a mixture of components - at a specified temperature using the PPR78 method at a specified temperature. + at a specified temperature using the PPR78 method. Parameters ---------- @@ -398,6 +940,8 @@ def PPR78_kijs(T, groups, Tcs, Pcs, omegas): Critical pressures for each component [Pa] omegas : list[float] Acentric factors for each component [-] + version : str, optional + Version of the method to use ('original' or 'extended'), defaults to 'original' Returns ------- @@ -407,7 +951,7 @@ def PPR78_kijs(T, groups, Tcs, Pcs, omegas): Examples -------- - >>> # Calculate kij matrix for methane-ethane-propane mixture + >>> # Calculate kij matrix for methane-ethane-propane mixture using original PPR78 >>> groups = [ ... {"CH3": 1}, # methane ... {"CH3": 2}, # ethane @@ -418,6 +962,9 @@ def PPR78_kijs(T, groups, Tcs, Pcs, omegas): >>> omega = [0.01142, 0.0995, 0.1523] >>> matrix = PPR78_kijs(298.15, groups, Tc, Pc, omega) """ + if version not in ('original', 'extended'): + raise ValueError("version must be either 'original' or 'extended'") + n_components = len(groups) kij_matrix = [[0.0 for _ in range(n_components)] for _ in range(n_components)] @@ -433,10 +980,11 @@ def PPR78_kijs(T, groups, Tcs, Pcs, omegas): omegas[i], Tcs[j], Pcs[j], - omegas[j] + omegas[j], + version=version ) # Set both (i,j) and (j,i) due to symmetry kij_matrix[i][j] = kij kij_matrix[j][i] = kij - return kij_matrix + return kij_matrix \ No newline at end of file From 4ae72d027ce3183db09700648ead58d9d48f0adc Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 15:25:49 -0700 Subject: [PATCH 06/10] progress --- tests/test_ppr78.py | 2 +- thermo/group_contribution/ppr78.py | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/test_ppr78.py b/tests/test_ppr78.py index 04ac496d..90e2af88 100644 --- a/tests/test_ppr78.py +++ b/tests/test_ppr78.py @@ -676,7 +676,7 @@ def test_known_fragmentations(): "25103-58-6", # tert-DODECYL MERCAPTAN "206-44-0", ] - # FRAGMENTATION_EXCEPTIONS = [] + FRAGMENTATION_EXCEPTIONS = [] # Load known fragmentations diff --git a/thermo/group_contribution/ppr78.py b/thermo/group_contribution/ppr78.py index d1464ce8..85c65c53 100644 --- a/thermo/group_contribution/ppr78.py +++ b/thermo/group_contribution/ppr78.py @@ -108,9 +108,16 @@ def __repr__(self): EPPR78_GROUPS['Caro'] = PPR78GroupContribution('Caro', atoms={'C': 1}, bonds={AROMATIC_BOND: 2}, smarts='[c]') EPPR78_GROUPS['Cfused_aromatic'] = PPR78GroupContribution('Cfused_aromatic', atoms={'C': 1}, bonds={AROMATIC_BOND: 3}, smarts=[ # Unclear definition and assignment - ACENAPHTHENE has 2 fused groups, FLUORANTHENE has 6, NAPHTHACENE, 6, and INDENE 0. - '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r6])]', - '[c;R3,R4,R5,R6;r;H0;$([c;R3])]' - + '[c;r4,r5,r6,r7,r8;H0;R2,R3,R4,R5,R6;a;$([c;r4,r5,r6,r7,r8;H0;R2,R3,R4,R5,R6;a]([c;r4,r5,r6,r7,r8;H0;R2,R3,R4,R5,R6;a])([c;r4,r5,r6,r7,r8;R1,R2,R3,R4,R5,R6;a])([c;r4,r5,r6,r7,r8;R1,R2,R3,R4,R5,R6;a]))]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r5])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r4])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r7])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r6;r5])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r5;r5])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r5;r4])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r5;r7])]', + # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r7;r7])]', + # '[c;R3,R4,R5,R6;r;H0;$([c;R3])]', # this one is bad but I need it for the ], priority=10000) EPPR78_GROUPS['CH2cyclic'] = PPR78GroupContribution('CH2cyclic', atoms={'C': 1, 'H': 2}, bonds={}, smarts='[CH2R]') # CHcyclic is not also Ccyclic - major difference From 5788343dba49aadf2a879d11a15946a81385e6a5 Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 15:34:57 -0700 Subject: [PATCH 07/10] Cleanup --- tests/test_ppr78.py | 2 +- thermo/group_contribution/ppr78.py | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/tests/test_ppr78.py b/tests/test_ppr78.py index 90e2af88..04ac496d 100644 --- a/tests/test_ppr78.py +++ b/tests/test_ppr78.py @@ -676,7 +676,7 @@ def test_known_fragmentations(): "25103-58-6", # tert-DODECYL MERCAPTAN "206-44-0", ] - FRAGMENTATION_EXCEPTIONS = [] + # FRAGMENTATION_EXCEPTIONS = [] # Load known fragmentations diff --git a/thermo/group_contribution/ppr78.py b/thermo/group_contribution/ppr78.py index 85c65c53..97f59d40 100644 --- a/thermo/group_contribution/ppr78.py +++ b/thermo/group_contribution/ppr78.py @@ -107,17 +107,8 @@ def __repr__(self): EPPR78_GROUPS['CHaro'] = PPR78GroupContribution('CHaro', atoms={'C': 1, 'H': 1}, bonds={AROMATIC_BOND: 2}, smarts='[cH]') EPPR78_GROUPS['Caro'] = PPR78GroupContribution('Caro', atoms={'C': 1}, bonds={AROMATIC_BOND: 2}, smarts='[c]') EPPR78_GROUPS['Cfused_aromatic'] = PPR78GroupContribution('Cfused_aromatic', atoms={'C': 1}, bonds={AROMATIC_BOND: 3}, - smarts=[ # Unclear definition and assignment - ACENAPHTHENE has 2 fused groups, FLUORANTHENE has 6, NAPHTHACENE, 6, and INDENE 0. + smarts=[ #ACENAPHTHENE has 2 fused groups, FLUORANTHENE has 6, NAPHTHACENE, 6, and INDENE 0. FLUORENE is supposed to have 0, this finds 2 '[c;r4,r5,r6,r7,r8;H0;R2,R3,R4,R5,R6;a;$([c;r4,r5,r6,r7,r8;H0;R2,R3,R4,R5,R6;a]([c;r4,r5,r6,r7,r8;H0;R2,R3,R4,R5,R6;a])([c;r4,r5,r6,r7,r8;R1,R2,R3,R4,R5,R6;a])([c;r4,r5,r6,r7,r8;R1,R2,R3,R4,R5,R6;a]))]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r5])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r4])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r7])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r6;r6;r5])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r5;r5])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r5;r4])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r5;r7])]', - # '[c;R2,R3,R4,R5,R6;r;H0;$([c;r7;r7])]', - # '[c;R3,R4,R5,R6;r;H0;$([c;R3])]', # this one is bad but I need it for the ], priority=10000) EPPR78_GROUPS['CH2cyclic'] = PPR78GroupContribution('CH2cyclic', atoms={'C': 1, 'H': 2}, bonds={}, smarts='[CH2R]') # CHcyclic is not also Ccyclic - major difference From 12e933c5e720b7c4db92a76618f198d121d6c6c0 Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 16:05:54 -0700 Subject: [PATCH 08/10] Script to estimate parameters as well --- dev/dump_eppr78_parameters.py | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 dev/dump_eppr78_parameters.py diff --git a/dev/dump_eppr78_parameters.py b/dev/dump_eppr78_parameters.py new file mode 100644 index 00000000..1b6dc179 --- /dev/null +++ b/dev/dump_eppr78_parameters.py @@ -0,0 +1,75 @@ +import os +import json +from itertools import combinations +from thermo import Chemical +from thermo.group_contribution.group_contribution_base import smarts_fragment_priority +from thermo.group_contribution.ppr78 import EPPR78_GROUPS_LIST, PPR78_kij +from chemicals.identifiers import dippr_compounds, sorted_CAS_key + +# Load DIPPR compounds +dippr_cmpds = dippr_compounds() +# Or just use the compounds used in making the mehod +dippr_cmpds = ['n-BUTANE', '2,2-DIMETHYLBUTANE', '2,3-DIMETHYLBUTANE', 'NEOPENTANE', 'ETHANE', 'n-HEXANE', 'ISOBUTANE', 'ISOPENTANE', 'METHANE', '2-METHYLPENTANE', '3-METHYLPENTANE', 'n-PENTANE', 'PROPANE', '2,2-DIMETHYLHEXANE', '2,3-DIMETHYLHEXANE', '2,4-DIMETHYLHEXANE', '2,5-DIMETHYLHEXANE', '3,3-DIMETHYLHEXANE', '3,4-DIMETHYLHEXANE', '2,2-DIMETHYLPENTANE', '2,3-DIMETHYLPENTANE', '2,4-DIMETHYLPENTANE', '3,3-DIMETHYLPENTANE', '3-ETHYLHEXANE', '3-ETHYLPENTANE', 'n-HEPTANE', '2-METHYL-3-ETHYLPENTANE', '3-METHYL-3-ETHYLPENTANE', '2-METHYLHEPTANE', '3-METHYLHEPTANE', '4-METHYLHEPTANE', '2-METHYLHEXANE', '3-METHYLHEXANE', 'n-OCTANE', '2,2,3,3-TETRAMETHYLBUTANE', '2,2,3-TRIMETHYLBUTANE', '2,2,3-TRIMETHYLPENTANE', '2,2,4-TRIMETHYLPENTANE', '2,3,3-TRIMETHYLPENTANE', '2,3,4-TRIMETHYLPENTANE', '3,3-DIETHYLPENTANE', '2,2-DIMETHYL-3-ETHYLPENTANE', '2,4-DIMETHYL-3-ETHYLPENTANE', '2,2-DIMETHYLHEPTANE', '2,6-DIMETHYLHEPTANE', '3-ETHYLHEPTANE', '2-METHYLOCTANE', '3-METHYLOCTANE', '4-METHYLOCTANE', 'n-NONANE', '2,2,3,3-TETRAMETHYLPENTANE', '2,2,3,4-TETRAMETHYLPENTANE', '2,2,4,4-TETRAMETHYLPENTANE', '2,3,3,4-TETRAMETHYLPENTANE', '2,2,5-TRIMETHYLHEXANE', '2,4,4-TRIMETHYLHEXANE', 'n-DECANE', '2-METHYLNONANE', '3-METHYLNONANE', '4-METHYLNONANE', '5-METHYLNONANE', '3,3,5-TRIMETHYLHEPTANE', '2,2,3,3-TETRAMETHYLHEXANE', '2,2-DIMETHYLOCTANE', '2,3-DIMETHYLOCTANE', '2,4-DIMETHYLOCTANE', '2,5-DIMETHYLOCTANE', '2,6-DIMETHYLOCTANE', '2,7-DIMETHYLOCTANE', 'n-DODECANE', 'n-TETRADECANE', 'n-TRIDECANE', 'n-UNDECANE', 'n-DOCOSANE', 'n-EICOSANE', 'n-HENEICOSANE', 'n-HEPTADECANE', 'n-HEXADECANE', 'n-NONADECANE', 'n-OCTADECANE', 'n-PENTADECANE', 'n-TETRACOSANE', 'n-TRICOSANE', 'n-PENTACOSANE', 'n-HEXACOSANE', 'n-HEPTACOSANE', 'n-OCTACOSANE', 'n-NONACOSANE', 'n-TRIACONTANE', 'SQUALANE', 'n-DOTRIACONTANE', 'n-HEXATRIACONTANE', '2,2,5,5-TETRAMETHYLHEXANE', '2,2,4,4,6,8,8-HEPTAMETHYLNONANE', '3-METHYLUNDECANE', 'CYCLOPROPANE', 'CYCLOBUTANE', 'n-BUTYLCYCLOPENTANE', 'CYCLOPENTANE', '1,1-DIMETHYLCYCLOPENTANE', 'cis-1,2-DIMETHYLCYCLOPENTANE', 'trans-1,2-DIMETHYLCYCLOPENTANE', 'cis-1,3-DIMETHYLCYCLOPENTANE', 'trans-1,3-DIMETHYLCYCLOPENTANE', 'ETHYLCYCLOPENTANE', 'ISOPROPYLCYCLOPENTANE', 'METHYLCYCLOPENTANE', '1-METHYL-1-ETHYLCYCLOPENTANE', 'n-PROPYLCYCLOPENTANE', 'ISOPROPYLCYCLOHEXANE', 'CYCLOHEXANE', 'n-PROPYLCYCLOHEXANE', 'n-BUTYLCYCLOHEXANE', 'sec-BUTYLCYCLOHEXANE', 'tert-BUTYLCYCLOHEXANE', '1,1-DIMETHYLCYCLOHEXANE', 'cis-1,2-DIMETHYLCYCLOHEXANE', 'trans-1,2-DIMETHYLCYCLOHEXANE', 'cis-1,3-DIMETHYLCYCLOHEXANE', 'trans-1,3-DIMETHYLCYCLOHEXANE', 'cis-1,4-DIMETHYLCYCLOHEXANE', 'trans-1,4-DIMETHYLCYCLOHEXANE', 'ETHYLCYCLOHEXANE', 'METHYLCYCLOHEXANE', '1-trans-3,5-TRIMETHYLCYCLOHEXANE', 'n-DECYLCYCLOHEXANE', 'CYCLOHEPTANE', 'CYCLOOCTANE', 'cis-DECAHYDRONAPHTHALENE', 'trans-DECAHYDRONAPHTHALENE', 'DIAMANTANE', 'alpha-PINENE', 'beta-PINENE', 'ADAMANTANE', 'BICYCLOHEXYL', '1,2,3,4-TETRAMETHYLCYCLOHEXANE', '1,1-DIETHYLCYCLOHEXANE', 'trans-1,4-DIETHYLCYCLOHEXANE', '1,3-DIMETHYLADAMANTANE', '1-BUTENE', 'cis-2-BUTENE', 'trans-2-BUTENE', '2,3-DIMETHYL-1-BUTENE', '2,3-DIMETHYL-2-BUTENE', '3,3-DIMETHYL-1-BUTENE', '2-ETHYL-1-BUTENE', 'ETHYLENE', '1-HEXENE', 'cis-2-HEXENE', 'trans-2-HEXENE', 'cis-3-HEXENE', 'trans-3-HEXENE', 'ISOBUTENE', '2-METHYL-1-BUTENE', '3-METHYL-1-BUTENE', '2-METHYL-2-BUTENE', '2-METHYL-1-PENTENE', '3-METHYL-1-PENTENE', '4-METHYL-1-PENTENE', '4-METHYL-cis-2-PENTENE', '4-METHYL-trans-2-PENTENE', '2-METHYL-2-PENTENE', '3-METHYL-cis-2-PENTENE', '3-METHYL-trans-2-PENTENE', '1-PENTENE', 'cis-2-PENTENE', 'trans-2-PENTENE', 'PROPYLENE', '1-HEPTENE', 'cis-3-HEPTENE', 'cis-2-HEPTENE', 'trans-2-HEPTENE', '2-ETHYL-1-PENTENE', '4-METHYL-1-HEXENE', '3-METHYL-1-HEXENE', '2-METHYL-1-HEXENE', '3-ETHYL-1-PENTENE', 'trans-3-HEPTENE', '2,3,3-TRIMETHYL-1-BUTENE', '2-ETHYL-1-HEXENE', 'cis-2-OCTENE', 'cis-3-OCTENE', 'cis-4-OCTENE', '1-OCTENE', 'trans-2-OCTENE', 'trans-3-OCTENE', 'trans-4-OCTENE', '2,4,4-TRIMETHYL-1-PENTENE', '2,4,4-TRIMETHYL-2-PENTENE', '2,3-DIMETHYL-1-HEXENE', '2-METHYL-1-HEPTENE', '1-DECENE', '1-DODECENE', '1-HEXADECENE', '1-HEPTADECENE', '1-NONENE', '1-TRIDECENE', '1-TETRADECENE', '1-PENTADECENE', '1-NONADECENE', '1-EICOSENE', '1-OCTADECENE', '1-UNDECENE', 'CYCLOOCTENE', '1,2-BUTADIENE', '1,3-BUTADIENE', 'trans,trans-2,4-HEXADIENE', '1,5-HEXADIENE', '1,2-HEXADIENE', '1,4-HEXADIENE', 'ISOPRENE', '3-METHYL-1,2-BUTADIENE', 'cis-1,3-PENTADIENE', '1,2-PENTADIENE', 'trans-1,3-PENTADIENE', '1,4-PENTADIENE', '2,3-PENTADIENE', 'PROPADIENE', 'cis,trans-2,4-HEXADIENE', '2,3-DIMETHYL-1,3-BUTADIENE', '2,5-DIMETHYL-1,5-HEXADIENE', '2,5-DIMETHYL-2,4-HEXADIENE', '1,5-CYCLOOCTADIENE', '1,3-CYCLOHEXADIENE', '1,4-CYCLOHEXADIENE', 'CYCLOHEPTENE', 'CYCLOHEXENE', 'CYCLOPENTADIENE', 'DICYCLOPENTADIENE', 'METHYLCYCLOPENTADIENE', 'CYCLOPENTENE', '1-METHYLCYCLOPENTENE', '3-METHYLCYCLOPENTENE', '4-METHYLCYCLOPENTENE', 'VINYLCYCLOHEXENE', '2-NORBORNENE', 'CAMPHENE', 'alpha-PHELLANDRENE', 'beta-PHELLANDRENE', 'alpha-TERPINENE', 'gamma-TERPINENE', 'd-LIMONENE', 'TERPINOLENE', '1-PHENYLINDENE', 'VINYLNORBORNENE', '1-TRIACONTENE', '3-ETHYL-1-HEXENE', '4-METHYL-1-HEPTENE', '1-TETRACONTENE', 'cis-2-NONENE', 'trans-2-NONENE', '6-METHYL-1-HEPTENE', 'trans-2-EICOSENE', 'trans-2-PENTADECENE', '3-METHYL-1,4-PENTADIENE', '1,5,9-CYCLODODECATRIENE', 'trans-1,3-HEXADIENE', 'trans-2-METHYL-1,3-PENTADIENE', '1,9-DECADIENE', '1,3,5,7-CYCLOOCTATETRAENE', 'METHYLNORBORNENE', 'ETHYLNORBORNENE', '5-ETHYLIDENE-2-NORBORNENE', '5-METHYL-1-HEXENE', '2-METHYL-1-OCTENE', '1-METHYL-4-VINYLCYCLOHEXENE', '7-METHYL-1-OCTENE', '2-METHYL-1-NONENE', '8-METHYL-1-NONENE', 'cis-2-DECENE', 'trans-2-DECENE', 'cis-2-DODECENE', 'trans-2-DODECENE', 'BENZENE', 'CUMENE', 'ETHYLBENZENE', 'alpha-METHYLSTYRENE', 'o-METHYLSTYRENE', 'cis-1-PROPENYLBENZENE', 'n-PROPYLBENZENE', 'm-METHYLSTYRENE', 'STYRENE', 'TOLUENE', '1,2,3-TRIMETHYLBENZENE', '1,2,4-TRIMETHYLBENZENE', 'MESITYLENE', 'm-XYLENE', 'o-XYLENE', 'p-XYLENE', '1,2,3,4-TETRAMETHYLBENZENE', 'p-ISOPROPENYLSTYRENE', 'n-BUTYLBENZENE', 'CYCLOHEXYLBENZENE', 'm-DIETHYLBENZENE', 'o-DIETHYLBENZENE', 'DIPHENYLMETHANE', '1-METHYL-2-n-PROPYLBENZENE', '1-METHYL-3-n-PROPYLBENZENE', '1-METHYL-4-n-PROPYLBENZENE', 'sec-BUTYLBENZENE', '5-ETHYL-m-XYLENE', '3-ETHYL-o-XYLENE', '4-ETHYL-o-XYLENE', '2-ETHYL-m-XYLENE', '2-ETHYL-p-XYLENE', '4-ETHYL-m-XYLENE', 'tert-BUTYLBENZENE', 'n-DODECYLBENZENE', '1,1-DIPHENYLETHANE', 'm-CYMENE', 'n-DECYLBENZENE', 'o-CYMENE', 'n-TRIDECYLBENZENE', 'p-CYMENE', 'TRIPHENYLETHYLENE', 'p-DIETHYLBENZENE', 'n-HEXYLBENZENE', 'n-HEPTYLBENZENE', 'n-OCTYLBENZENE', 'n-NONYLBENZENE', 'ISOBUTYLBENZENE', 'n-UNDECYLBENZENE', '2-PHENYLBUTENE-1', 'o-ETHYLTOLUENE', 'm-DIVINYLBENZENE', 'm-ETHYLTOLUENE', 'p-ETHYLTOLUENE', 'cis-2-PHENYLBUTENE-2', 'trans-2-PHENYLBUTENE-2', 'n-PENTYLBENZENE', 'o-TERPHENYL', 'm-TERPHENYL', 'p-TERPHENYL', 'p-tert-BUTYLSTYRENE', '4-ISOBUTYLSTYRENE', 'p-tert-BUTYL ETHYLBENZENE', '1,2,4,5-TETRAMETHYLBENZENE', '1,2,3,5-TETRAMETHYLBENZENE', '1,2-DIPHENYLETHANE', 'trans-STILBENE', 'cis-STILBENE', 'm-DIISOPROPYLBENZENE', 'p-DIISOPROPYLBENZENE', 'TETRAPHENYLETHYLENE', 'n-TETRADECYLBENZENE', 'n-PENTADECYLBENZENE', 'n-HEXADECYLBENZENE', 'n-HEPTADECYLBENZENE', 'n-OCTADECYLBENZENE', 'BIPHENYL', 'ACENAPHTHENE', 'FLUORANTHENE', '1-n-BUTYLNAPHTHALENE', '1-n-PENTYLNAPHTHALENE', '1-PHENYLNAPHTHALENE', '1-ETHYLNAPHTHALENE', '2,6-DIETHYLNAPHTHALENE', '1-n-DECYLNAPHTHALENE', '2-ETHYLNAPHTHALENE', '1-n-HEXYLNAPHTHALENE', '1-METHYLNAPHTHALENE', '2-METHYLNAPHTHALENE', '2,6-DIMETHYLNAPHTHALENE', '2,7-DIMETHYLNAPHTHALENE', 'NAPHTHALENE', '2,3-DIMETHYL-2,3-DIPHENYLBUTANE', '1-n-NONYLNAPHTHALENE', '1-n-PROPYLNAPHTHALENE', '1-n-HEXYL-1,2,3,4-TETRAHYDRONAPHTHALENE', '2,4-DIPHENYL-4-METHYLPENTENE-1', 'TRIPHENYLMETHANE', 'TETRAPHENYLMETHANE', '1,1,2-TRIPHENYLETHANE', '1,1,2,2-TETRAPHENYLETHANE', 'ANTHRACENE', 'PHENANTHRENE', 'CHRYSENE', 'PYRENE', 'INDANE', 'ACENAPHTHALENE', 'FLUORENE', 'INDENE', '1-METHYLINDENE', '1,2,3-TRIMETHYLINDENE', '2-METHYLINDENE', '1,4-DI-tert-BUTYLBENZENE', '1,3,5-TRI-tert-BUTYLBENZENE', '1,3,5-TRIISOPROPYLBENZENE', 'PENTAMETHYLBENZENE', '1,2,4-TRIETHYLBENZENE', 'HEXAMETHYLBENZENE', '1,2,3-TRIETHYLBENZENE', '1,2,3,5-TETRAETHYLBENZENE', 'PENTAETHYLBENZENE', 'HEXAETHYLBENZENE', '1-(4-ETHYLPHENYL)-2-PHENYLETHANE', '1,2-DIMETHYL-3-PROPYLBENZENE', '1,2,3-TRIMETHYL-4-ETHYLBENZENE', '1,2,4-TRIMETHYL-3-ETHYLBENZENE', '1,2,4-TRIMETHYL-5-ETHYLBENZENE', '1-(4-ETHYLPHENYL)-2-(4-ETHYLPHENYL)ETHANE', 'o-ETHYLSTYRENE', 'm-ETHYLSTYRENE', 'p-ETHYLSTYRENE', '4-METHYLPHENANTHRENE', 'BENZANTHRACENE', 'NAPHTHACENE', '1-ETHYL-2-ISOPROPYLBENZENE', '1,3,5-TRIETHYLBENZENE', 'n-BUTYL MERCAPTAN', 'ETHYL MERCAPTAN', 'n-OCTYL MERCAPTAN', 'n-HEPTYL MERCAPTAN', 'n-HEXYL MERCAPTAN', 'METHYL MERCAPTAN', 'n-PENTYL MERCAPTAN', 'tert-BUTYL MERCAPTAN', 'sec-BUTYL MERCAPTAN', 'ISOPROPYL MERCAPTAN', 'n-PROPYL MERCAPTAN', 'tert-OCTYL MERCAPTAN', 'n-NONYL MERCAPTAN', 'n-DODECYL MERCAPTAN', 'ISOBUTYL MERCAPTAN', 'n-DECYL MERCAPTAN', 'UNDECYL MERCAPTAN', 'tert-DODECYL MERCAPTAN', 'PHENYL MERCAPTAN', 'CYCLOHEXYL MERCAPTAN', 'BENZYL MERCAPTAN', '1,2-ETHANEDITHIOL', 'CARBON DIOXIDE', 'HYDROGEN', 'HYDROGEN SULFIDE', 'NITROGEN', 'WATER', 'CO', 'Ar', 'O2'] + +# Temperature for all calculations +T = 298.15 # K + +# Dictionary to store results +results = {"data": {}} + +# Track successful fragmentations +successful_chemicals = {} + +# First pass - identify all chemicals that fragment successfully +for cas in dippr_cmpds: + try: + chem = Chemical(cas) + if chem.Tc is None or chem.Pc is None or chem.omega is None or chem.rdkitmol is None: + continue + assignment, _, _, success, _ = smarts_fragment_priority( + catalog=EPPR78_GROUPS_LIST, + rdkitmol=chem.rdkitmol + ) + + if success: + groups = {EPPR78_GROUPS_LIST[i-1].group: v for i, v in assignment.items()} + successful_chemicals[chem.CAS] = { + 'groups': groups, + 'Tc': chem.Tc, + 'Pc': chem.Pc, + 'omega': chem.omega + } + + except Exception as e: + print(e) + continue + +# Second pass - calculate kij for all valid pairs +for (cas1, data1), (cas2, data2) in combinations(successful_chemicals.items(), 2): + kij = PPR78_kij( + T=T, + molecule1_groups=data1['groups'], + molecule2_groups=data2['groups'], + Tc1=data1['Tc'], + Pc1=data1['Pc'], + omega1=data1['omega'], + Tc2=data2['Tc'], + Pc2=data2['Pc'], + omega2=data2['omega'], + version='extended' + ) + + # Store result in the format shown + key = ' '.join(sorted_CAS_key([cas1, cas2])) + results["data"][key] = { + "kij": round(kij, 4), + } +# Save results +output_path = os.path.join(os.path.dirname(__file__), '..', 'thermo', 'Interaction Parameters/eppr78_common.json') +os.makedirs(os.path.dirname(output_path), exist_ok=True) + +with open(output_path, 'w') as f: + json.dump(results, f) + +print(f"Successfully processed {len(successful_chemicals)} chemicals") +print(f"Generated {len(results['data'])} interaction parameters") \ No newline at end of file From 07d0d94c7ec17908debcbcca4465aacd1596b931 Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 16:08:32 -0700 Subject: [PATCH 09/10] Cleanup --- tests/test_ppr78.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_ppr78.py b/tests/test_ppr78.py index 04ac496d..50888678 100644 --- a/tests/test_ppr78.py +++ b/tests/test_ppr78.py @@ -27,7 +27,7 @@ from thermo import Chemical from chemicals.identifiers import int_to_CAS from thermo.group_contribution.group_contribution_base import smarts_fragment_priority -from thermo.group_contribution.ppr78 import EPPR78_GROUPS_LIST, EPPR78_GROUPS_BY_ID, PPR78_kij, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS_LIST, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID +from thermo.group_contribution.ppr78 import EPPR78_GROUPS_LIST, EPPR78_GROUPS_BY_ID, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS_LIST, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID import os import pandas as pd folder = os.path.join(os.path.dirname(__file__), 'Data') @@ -572,6 +572,8 @@ def test_SH_group(): assert success +@pytest.mark.rdkit +@pytest.mark.skipif(rdkit is None, reason="requires rdkit") def test_temperature_variation_argon_fluoranthene(): """Test temperature dependence for Argon/Fluoranthene system.""" # Test temperatures and expected values @@ -605,6 +607,8 @@ def test_temperature_variation_argon_fluoranthene(): assert abs(kij - k_expected) < 0.0001, f"At T={T}K: Expected kij={k_expected}, got {kij}" +@pytest.mark.rdkit +@pytest.mark.skipif(rdkit is None, reason="requires rdkit") def test_naphthacene_ethanedithiol(): """Test for Naphthacene/1,2-Ethanedithiol system using extended PPR78 model. Value verified against author's reference calculator.""" From 798ad1ee46b484c450859cf19b0af84b38760aff Mon Sep 17 00:00:00 2001 From: Caleb Bell Date: Thu, 19 Dec 2024 16:19:59 -0700 Subject: [PATCH 10/10] Fix --- tests/test_ppr78.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ppr78.py b/tests/test_ppr78.py index 50888678..d8759d61 100644 --- a/tests/test_ppr78.py +++ b/tests/test_ppr78.py @@ -27,7 +27,7 @@ from thermo import Chemical from chemicals.identifiers import int_to_CAS from thermo.group_contribution.group_contribution_base import smarts_fragment_priority -from thermo.group_contribution.ppr78 import EPPR78_GROUPS_LIST, EPPR78_GROUPS_BY_ID, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS_LIST, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID +from thermo.group_contribution.ppr78 import EPPR78_GROUPS_LIST, EPPR78_GROUPS_BY_ID, PPR78_kij, PPR78_kijs, PPR78_GROUP_IDS, PPR78_GROUPS_LIST, PPR78_INTERACTIONS, PPR78_GROUPS_BY_ID import os import pandas as pd folder = os.path.join(os.path.dirname(__file__), 'Data')