From 7eea7915144d721f93e6646558856e635fdd5c85 Mon Sep 17 00:00:00 2001 From: Connie Gao Date: Mon, 1 Aug 2016 15:20:05 -0400 Subject: [PATCH 1/2] Re-add verbose logging for kinetics rate rules by adding the verbose argument to fillKineticsRulesByAveragingUp Set this to False by default, or to the method preferred in the input file's options: verboseComments --- rmgpy/data/kinetics/family.py | 4 ++-- rmgpy/data/kinetics/rules.py | 29 ++++++++++++++++------------- rmgpy/rmg/main.py | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/rmgpy/data/kinetics/family.py b/rmgpy/data/kinetics/family.py index 15e62da1ca..e9ce492501 100644 --- a/rmgpy/data/kinetics/family.py +++ b/rmgpy/data/kinetics/family.py @@ -1037,13 +1037,13 @@ def getRootTemplate(self): else: return self.groups.top - def fillKineticsRulesByAveragingUp(self): + def fillKineticsRulesByAveragingUp(self, verbose=False): """ Fill in gaps in the kinetics rate rules by averaging child nodes recursively starting from the top level root template. """ - self.rules.fillRulesByAveragingUp(self.getRootTemplate(), {}) + self.rules.fillRulesByAveragingUp(self.getRootTemplate(), {}, verbose) diff --git a/rmgpy/data/kinetics/rules.py b/rmgpy/data/kinetics/rules.py index 7e70cb764e..b989170389 100644 --- a/rmgpy/data/kinetics/rules.py +++ b/rmgpy/data/kinetics/rules.py @@ -440,9 +440,11 @@ def getAllRules(self, template): return entries - def fillRulesByAveragingUp(self, rootTemplate, alreadyDone): + def fillRulesByAveragingUp(self, rootTemplate, alreadyDone, verbose=False): """ Fill in gaps in the kinetics rate rules by averaging child nodes. + If verbose is set to True, then exact sources of kinetics are saved in the kinetics comments + (warning: this uses up a lot of memory due to the extensively long comments) """ rootLabel = ';'.join([g.label for g in rootTemplate]) @@ -472,7 +474,7 @@ def fillRulesByAveragingUp(self, rootTemplate, alreadyDone): if label in alreadyDone: kinetics = alreadyDone[label] else: - kinetics = self.fillRulesByAveragingUp(template, alreadyDone) + kinetics = self.fillRulesByAveragingUp(template, alreadyDone, verbose) if kinetics is not None: kineticsList.append([kinetics, template]) @@ -494,26 +496,27 @@ def fillRulesByAveragingUp(self, rootTemplate, alreadyDone): if len(kineticsList) > 1: # We found one or more results! Let's average them together kinetics = self.__getAverageKinetics([k for k, t in kineticsList]) - kinetics.comment = 'Average of ({0})'.format( - ' + '.join(';'.join(g.label for g in t) for k, t in kineticsList)) - # For debug mode: uncomment the following kinetics commenting - # lines and use them instead of the lines above. Caution: large memory usage. - - # kinetics.comment += 'Average of ({0})'.format( - # ' + '.join(k.comment if k.comment != '' else ';'.join(g.label for g in t) for k, t in kineticsList)) + if verbose: + kinetics.comment = 'Average of ({0})'.format( + ' + '.join(k.comment if k.comment != '' else ';'.join(g.label for g in t) for k, t in kineticsList)) + + else: + kinetics.comment = 'Average of ({0})'.format( + ' + '.join(';'.join(g.label for g in t) for k, t in kineticsList)) else: k,t = kineticsList[0] kinetics = deepcopy(k) # Even though we are using just a single set of kinetics, it's still considered # an average. It just happens that the other distance 1 children had no data. - kinetics.comment = 'Average of ({0})'.format(';'.join(g.label for g in t)) - # For debug mode: uncomment the following kinetics commenting - # lines and use them instead of the lines above. Caution: large memory usage. + if verbose: + kinetics.comment = 'Average of ({0})'.format(k.comment if k.comment != '' else ';'.join(g.label for g in t)) + else: + kinetics.comment = 'Average of ({0})'.format(';'.join(g.label for g in t)) + - # kinetics.comment += 'Average of ({0}).format(k.comment if k.comment != '' else ';'.join(g.label for g in t)) entry = Entry( index = 0, diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index bc44566c63..1c1e27c36b 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -322,7 +322,7 @@ def loadDatabase(self): logging.info('Training set explicitly not added to rate rules in kinetics families...') logging.info('Filling in rate rules in kinetics families by averaging...') for family in self.database.kinetics.families.values(): - family.fillKineticsRulesByAveragingUp() + family.fillKineticsRulesByAveragingUp(verbose=self.verboseComments) def initialize(self, **kwargs): """ From b53d9f67619566d953b434de702516f1cabd38ac Mon Sep 17 00:00:00 2001 From: Connie Gao Date: Thu, 4 Aug 2016 16:04:18 -0400 Subject: [PATCH 2/2] Must apply verbose comments to kinetics that are averaged in estimateKinetics() For rate rules that get created during fillRulesByAveragingUp, the kinetics comments retain verbose information about kinetic sources. However, if averaging is performed during the selection of best kinetics in estimateKinetics(), this information was not retained, so it must be added here. --- rmgpy/data/kinetics/rules.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rmgpy/data/kinetics/rules.py b/rmgpy/data/kinetics/rules.py index b989170389..43028bc4a9 100644 --- a/rmgpy/data/kinetics/rules.py +++ b/rmgpy/data/kinetics/rules.py @@ -636,6 +636,13 @@ def getTemplateLabel(template): else: # We found one or more results! Let's average them together kinetics = self.__getAverageKinetics([k for k, t in kineticsList]) + # Unlike in the case of a single rule, the verbose comments for averaging are lost unless they are + # appended in the following lines. Verbose comments are filtered out in + # rmgpy.rmg.model.CoreEdgeReactionModel.generateKinetics + kinetics.comment = 'Average of ({0})'.format( + ' + '.join(k.comment if k.comment != '' else ';'.join(g.label for g in t) for k, t in kineticsList)) + kinetics.comment +='\n' + # Append standard portion of kinetics comments that appear in non-verbose mode. kinetics.comment += 'Estimated using average of templates {0}'.format( ' + '.join([getTemplateLabel(t) for k, t in kineticsList]), )