Trigger.py revision d8fed2c6e783de0b42606177cd062fa265befff2
1aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino#    Copyright 2015-2015 ARM Limited
2ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh#
3aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# Licensed under the Apache License, Version 2.0 (the "License");
4aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# you may not use this file except in compliance with the License.
5aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# You may obtain a copy of the License at
6aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino#
7aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino#     http://www.apache.org/licenses/LICENSE-2.0
8aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino#
9aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# Unless required by applicable law or agreed to in writing, software
10aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# distributed under the License is distributed on an "AS IS" BASIS,
11aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# See the License for the specific language governing permissions and
13aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino# limitations under the License.
14aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino#
15aace7c0732cac769f1ffe95a89591b6217fa9447Javi Merino
16ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh"""Trigger is a representation of the following:
17ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
18d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    - Event(s) (:mod:`trappy.base.Base`)
19d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    - An associated value
20d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        - scalar
21d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        - vector
22d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    - A set of filters
23d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        - value based
24d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        - function based
25ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh"""
26ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
27ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhimport types
28435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merinofrom trappy.plotter.Utils import listify
29ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
30ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
31ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhclass Trigger(object):
32d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    """Trigger is an event-value relationship which
33d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    accepts a run object to "generate" qualified data
34ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
35d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param run: A trappy Run object
36d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type run: :mod:`trappy.run.Run`
37ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
38d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param template: A trappy Event to act as a trigger
39d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type template: trappy.Base
40d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
41d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param filters: Key value filter pairs
42d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type filters: dict
43d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
44d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    The filter can either have a function:
45d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    ::
46d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
47d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        def function_based_filter(elem):
48ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            if condition:
49ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                return True
50ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            else:
51ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                return False
52ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
53d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    or a value/list of values
54d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    ::
55ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
56d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        f = {}
57d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        f["data_column_a"] = function_based_filter
58d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        f["data_column_b"] = value
59d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
60d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param value: Value can be a string or a numeric
61d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type value: str, int, float
62d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
63d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param pivot: This is the column around which the data will be
64d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        pivoted
65d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type pivot: str
66ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """
67ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
68ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    def __init__(self, run, template, filters, value, pivot):
69ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
70ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.template = template
71ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self._filters = filters
72ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.value = value
73ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self._pivot = pivot
74ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.run = run
75ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
76ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    def generate(self, pivot_val):
77ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """Generate the trigger data for a given pivot value
78d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        and a run index
79ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
80d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        :param pivot_val: The pivot to generate data for
81d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh        :type pivot_val: hashable
82ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
83ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
84435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merino        trappy_event = getattr(self.run, self.template.name)
85435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merino        data_frame = trappy_event.data_frame
86ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
87ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        mask = (data_frame[self._pivot] == pivot_val)
88ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        for key in self._filters:
89ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
90ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            operator = self._filters[key]
91ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
92ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            if isinstance(operator, types.FunctionType):
93ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                mask = mask & (data_frame[key].apply(operator))
94ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            else:
95ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                value = operator
96ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                mask = apply_filter_kv(key, value, data_frame, mask)
97ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
98ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return data_frame[mask]
99ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
100ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
101ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhdef apply_filter_kv(key, value, data_frame, mask):
102ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """Internal function to apply a key value
103d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    filter to a data_frame and update the initial
104d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    condition provided in mask.
105d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
106d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param value: The value to checked for
107d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
108d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param data_frame: The data to be filtered
109d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type data_frame: :mod:`pandas.DataFrame`
110d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh
111d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :param mask: Initial Condition Mask
112d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :type mask: :mod:`pandas.Series`
113ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
114d8fed2c6e783de0b42606177cd062fa265befff2Kapileshwar Singh    :return: A **mask** to index the data frame
115ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """
116ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
117ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    value = listify(value)
118ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    if key not in data_frame.columns:
119ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return mask
120ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    else:
121ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        for val in value:
122ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            mask = mask & (data_frame[key] == val)
123ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return mask
124