Trigger.py revision 435457c8af9d69383ba45e0bd7da022d967a8dea
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
18ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    1. Event
19ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    2. An associated value
20ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    3. A set of filters
21ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh"""
22ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
23ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhimport types
24435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merinofrom trappy.plotter.Utils import listify
25ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
26ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
27ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhclass Trigger(object):
28ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """The tigger is an event relationship which
29ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       accepts a run object to "generate" qualified data
30ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
31ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       The filter can either have a function
32ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
33ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       def function_based_filter(elem):
34ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            if condition:
35ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                return True
36ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            else:
37ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                return False
38ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
39ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      or value
40ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
41ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      f = {}
42ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      f["data_column_a"] = function_based_filter
43ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      f["data_column_b"] = value
44ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """
45ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
46ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    def __init__(self, run, template, filters, value, pivot):
47ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
48ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            Args:
49435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merino                run (trappy.Run): A trappy Run object
50435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merino                template (trappy.Base): A trappy Event to act as a trigger
51ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                filters (dict): Key value filter pairs
52ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                value: Value can be a string or a numeric
53ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                pivot: This is the column around which the data will be
54ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                    pivoted
55ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
56ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
57ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.template = template
58ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self._filters = filters
59ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.value = value
60ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self._pivot = pivot
61ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.run = run
62ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
63ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    def generate(self, pivot_val):
64ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """Generate the trigger data for a given pivot value
65ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh           and a run index
66ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
67ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            Args:
68ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                pivot_val: The pivot to generate data for
69ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
70ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
71ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
72435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merino        trappy_event = getattr(self.run, self.template.name)
73435457c8af9d69383ba45e0bd7da022d967a8deaJavi Merino        data_frame = trappy_event.data_frame
74ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
75ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        mask = (data_frame[self._pivot] == pivot_val)
76ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        for key in self._filters:
77ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
78ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            operator = self._filters[key]
79ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
80ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            if isinstance(operator, types.FunctionType):
81ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                mask = mask & (data_frame[key].apply(operator))
82ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            else:
83ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                value = operator
84ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                mask = apply_filter_kv(key, value, data_frame, mask)
85ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
86ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return data_frame[mask]
87ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
88ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
89ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhdef apply_filter_kv(key, value, data_frame, mask):
90ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """Internal function to apply a key value
91ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       filter to a data_frame and update the initial
92ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       condition provided in mask.
93ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
94ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       Returns:
95ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh           Mask to index the data frame
96ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """
97ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
98ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    value = listify(value)
99ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    if key not in data_frame.columns:
100ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return mask
101ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    else:
102ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        for val in value:
103ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            mask = mask & (data_frame[key] == val)
104ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return mask
105