Esempio n. 1
0
class TreatmentArea:

    def __init__(self, node, treatment, a_index):
        """
        node is the xml node defining the TreatmentArea.
        treatment is the parent Treatment this area is for.
        a_index is the area index used to create the temp map name.
        """
        self.treatment = treatment
        self.node = node
        self.area = None
        self.area_filter_output = None
        self.index = a_index
        # temporary map name
        self.area_temp = "x_t___strategy_"  + self.treatment.strategy.get_name() + \
            "_area_t_" + str(self.treatment.index) + "_" + str(self.index)
        self.init_from_xml()

    def __del__(self):
        if self.area_filter_output is not None:
            grass.get_g().remove_map(self.area_filter_output)

    def init_from_xml(self):
        if self.node.tag == "mfilter":
            self.area = Event(self.node)
        else:
            # If it's not an mfilter it must be a map
            self.area = GrassMap(self.node)

    def is_dynamic(self):
        """
        Return whether this TreatmentArea changes each timestep or not. An area
        if dynamic if it uses an event/mfilter or a GrassMap with refresh==True.
        An example of the latter case is using r.mapcalc.
        """
        if isinstance(self.area, Event):
            return True
        elif isinstance(self.area, GrassMap):
            return self.area.refresh
        else:
            raise Exception("Unknown area type")

    def get_map_resources(self):
        maps = []
        if isinstance(self.area, Event):
            m = self.treatment.strategy.experiment
            maps.extend(self.area.get_map_resources(m))
        elif isinstance(self.area, GrassMap):
            if self.area.xml_map_type == "name":
                g = grass.get_g()
                maps.append((self.area.filename, g.find_mapset(self.area.filename)))
        return maps

    def get_treatment_area(self, replicate, last_area=None):
        """
        Get the map name representing the treatment area, generating it
        dynamically if necessary.
        """
        if isinstance(self.area, Event):
            if self.area_filter_output is not None:
                grass.get_g().remove_map(self.area_filter_output)

            if last_area:
                dist_map = last_area
            else:
                dist_map = replicate.temp_map_names[self.treatment.area_ls][0]

            self.area.run(dist_map, self.area_temp, replicate, False)

            self.area_filter_output = self.area_temp
            return self.area_filter_output
        elif isinstance(self.area, GrassMap):
            replacements = {
                "POP_MAP": replicate.temp_map_names[self.treatment.area_ls][0],
                "START_MAP": replicate.initial_maps[self.treatment.area_ls].get_map_filename()
            }
            return self.area.get_map_filename(replacements)
Esempio n. 2
0
class TreatmentArea:
    def __init__(self, node, treatment, a_index):
        """
        node is the xml node defining the TreatmentArea.
        treatment is the parent Treatment this area is for.
        a_index is the area index used to create the temp map name.
        """
        self.treatment = treatment
        self.node = node
        self.area = None
        self.area_filter_output = None
        self.index = a_index
        # temporary map name
        self.area_temp = "x_t___strategy_"  + self.treatment.strategy.get_name() + \
            "_area_t_" + str(self.treatment.index) + "_" + str(self.index)
        self.init_from_xml()

    def __del__(self):
        if self.area_filter_output is not None:
            grass.get_g().remove_map(self.area_filter_output)

    def init_from_xml(self):
        if self.node.tag == "mfilter":
            self.area = Event(self.node)
        else:
            # If it's not an mfilter it must be a map
            self.area = GrassMap(self.node)

    def is_dynamic(self):
        """
        Return whether this TreatmentArea changes each timestep or not. An area
        if dynamic if it uses an event/mfilter or a GrassMap with refresh==True.
        An example of the latter case is using r.mapcalc.
        """
        if isinstance(self.area, Event):
            return True
        elif isinstance(self.area, GrassMap):
            return self.area.refresh
        else:
            raise Exception("Unknown area type")

    def get_map_resources(self):
        maps = []
        if isinstance(self.area, Event):
            m = self.treatment.strategy.experiment
            maps.extend(self.area.get_map_resources(m))
        elif isinstance(self.area, GrassMap):
            if self.area.xml_map_type == "name":
                g = grass.get_g()
                maps.append(
                    (self.area.filename, g.find_mapset(self.area.filename)))
        return maps

    def get_treatment_area(self, replicate, last_area=None):
        """
        Get the map name representing the treatment area, generating it
        dynamically if necessary.
        """
        if isinstance(self.area, Event):
            if self.area_filter_output is not None:
                grass.get_g().remove_map(self.area_filter_output)

            if last_area:
                dist_map = last_area
            else:
                dist_map = replicate.temp_map_names[self.treatment.area_ls][0]

            self.area.run(dist_map, self.area_temp, replicate, False)

            self.area_filter_output = self.area_temp
            return self.area_filter_output
        elif isinstance(self.area, GrassMap):
            replacements = {
                "POP_MAP":
                replicate.temp_map_names[self.treatment.area_ls][0],
                "START_MAP":
                replicate.initial_maps[
                    self.treatment.area_ls].get_map_filename()
            }
            return self.area.get_map_filename(replacements)