Source code for safe.postprocessors.age_postprocessor

# -*- coding: utf-8 -*-
"""**Postprocessors package.**

"""

__author__ = 'Marco Bernasocchi <marco@opengis.ch>'
__revision__ = '$Format:%H$'
__date__ = '10/10/2012'
__license__ = "GPL"
__copyright__ = 'Copyright 2012, Australia Indonesia Facility for '
__copyright__ += 'Disaster Reduction'


from safe.postprocessors.abstract_postprocessor import (
    AbstractPostprocessor)

from safe.common.utilities import (get_defaults,
                                   ugettext as tr)


[docs]class AgePostprocessor(AbstractPostprocessor): """ Postprocessor that calculates age related statistics. see the _calculate_* methods to see indicator specific documentation see :mod:`safe.defaults` for default values information """ def __init__(self): """ Constructor for AgePostprocessor postprocessor class, It takes care of defining self.population_total """ AbstractPostprocessor.__init__(self) self.population_total = None
[docs] def setup(self, params): """concrete implementation it takes care of the needed parameters being initialized Args: params: dict of parameters to pass to the post processor Returns: None Raises: None """ AbstractPostprocessor.setup(self, None) if self.population_total is not None: self._raise_error('clear needs to be called before setup') self.population_total = params['population_total'] try: #either all 3 ratio are custom set or we use defaults self.youth_ratio = params['youth_ratio'] self.adult_ratio = params['adult_ratio'] self.elder_ratio = params['elder_ratio'] except KeyError: self._log_message('either all 3 age ratio are custom set or we' ' use defaults') defaults = get_defaults() self.youth_ratio = defaults['YOUTH_RATIO'] self.adult_ratio = defaults['ADULT_RATIO'] self.elder_ratio = defaults['ELDER_RATIO']
[docs] def process(self): """concrete implementation it takes care of the needed parameters being available and performs all the indicators calculations Args: None Returns: None Raises: None """ AbstractPostprocessor.process(self) if self.population_total is None: self._raise_error('setup needs to be called before process') self._calculate_total() self._calculate_youth() self._calculate_adult() self._calculate_elder()
[docs] def clear(self): """concrete implementation it takes care of the needed parameters being properly cleared Args: None Returns: None Raises: None """ AbstractPostprocessor.clear(self) self.population_total = None
def _calculate_total(self): """Indicator that shows total population. this indicator reports the total population Args: None Returns: None Raises: None """ myName = tr('Total') #FIXME (MB) Shameless hack to deal with issue #368 if self.population_total > 8000000000 or self.population_total < 0: self._append_result(myName, self.NO_DATA_TEXT) return myResult = self.population_total try: myResult = int(round(myResult)) except ValueError: myResult = self.NO_DATA_TEXT self._append_result(myName, myResult) def _calculate_youth(self): """Indicator that shows population below 15 years old. this indicator reports the amount of young population according to the set youth_ratio Args: None Returns: None Raises: None """ myName = tr('Youth count') #FIXME (MB) Shameless hack to deal with issue #368 if self.population_total > 8000000000 or self.population_total < 0: self._append_result(myName, self.NO_DATA_TEXT) return myResult = self.population_total * self.youth_ratio try: myResult = int(round(myResult)) except ValueError: myResult = self.NO_DATA_TEXT self._append_result(myName, myResult) def _calculate_adult(self): """Indicator that shows population between 15 and 64 years old. this indicator reports the amount of young population according to the set adult_ratio Args: None Returns: None Raises: None """ myName = tr('Adult count') #FIXME (MB) Shameless hack to deal with issue #368 if self.population_total > 8000000000 or self.population_total < 0: self._append_result(myName, self.NO_DATA_TEXT) return myResult = self.population_total * self.adult_ratio try: myResult = int(round(myResult)) except ValueError: myResult = self.NO_DATA_TEXT self._append_result(myName, myResult) def _calculate_elder(self): """Indicator that shows population above 64 years old. this indicator reports the amount of young population according to the set elder_ratio Args: None Returns: None Raises: None """ myName = tr('Elderly count') #FIXME (MB) Shameless hack to deal with issue #368 if self.population_total > 8000000000 or self.population_total < 0: self._append_result(myName, self.NO_DATA_TEXT) return myResult = self.population_total * self.elder_ratio try: myResult = int(round(myResult)) except ValueError: myResult = self.NO_DATA_TEXT self._append_result(myName, myResult)