Trigger.py revision ca7994692ab5cf454c5b9742a556f24c5dbd8136
1ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# $Copyright:
2ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# ----------------------------------------------------------------
3ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# This confidential and proprietary software may be used only as
4ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# authorised by a licensing agreement from ARM Limited
5ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh#  (C) COPYRIGHT 2015 ARM Limited
6ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh#       ALL RIGHTS RESERVED
7ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# The entire notice above must be reproduced on all authorised
8ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# copies and copies may only be made to the extent permitted
9ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# by a licensing agreement from ARM Limited.
10ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# ----------------------------------------------------------------
11ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# File:        Trigger.py
12ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# ----------------------------------------------------------------
13ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh# $
14ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh#
15ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh"""Trigger is a representation of the following:
16ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
17ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    1. Event
18ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    2. An associated value
19ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    3. A set of filters
20ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh"""
21ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
22ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhimport types
23ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhfrom cr2.plotter.Utils import listify
24ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
25ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
26ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhclass Trigger(object):
27ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """The tigger is an event relationship which
28ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       accepts a run object to "generate" qualified data
29ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
30ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       The filter can either have a function
31ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
32ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       def function_based_filter(elem):
33ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            if condition:
34ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                return True
35ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            else:
36ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                return False
37ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
38ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      or value
39ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
40ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      f = {}
41ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      f["data_column_a"] = function_based_filter
42ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh      f["data_column_b"] = value
43ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """
44ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
45ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    def __init__(self, run, template, filters, value, pivot):
46ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
47ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            Args:
48ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                run (cr2.Run): A cr2 Run object
49ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                template (cr2.Base): A cr2 Event to act as a trigger
50ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                filters (dict): Key value filter pairs
51ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                value: Value can be a string or a numeric
52ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                pivot: This is the column around which the data will be
53ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                    pivoted
54ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
55ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
56ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.template = template
57ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self._filters = filters
58ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.value = value
59ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self._pivot = pivot
60ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        self.run = run
61ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
62ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    def generate(self, pivot_val):
63ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """Generate the trigger data for a given pivot value
64ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh           and a run index
65ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
66ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            Args:
67ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                pivot_val: The pivot to generate data for
68ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        """
69ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
70ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
71ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        cr2_event = getattr(self.run, self.template.name)
72ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        data_frame = cr2_event.data_frame
73ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
74ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        mask = (data_frame[self._pivot] == pivot_val)
75ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        for key in self._filters:
76ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
77ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            operator = self._filters[key]
78ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
79ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            if isinstance(operator, types.FunctionType):
80ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                mask = mask & (data_frame[key].apply(operator))
81ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            else:
82ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                value = operator
83ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh                mask = apply_filter_kv(key, value, data_frame, mask)
84ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
85ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return data_frame[mask]
86ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
87ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
88ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singhdef apply_filter_kv(key, value, data_frame, mask):
89ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """Internal function to apply a key value
90ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       filter to a data_frame and update the initial
91ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       condition provided in mask.
92ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
93ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh       Returns:
94ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh           Mask to index the data frame
95ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    """
96ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh
97ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    value = listify(value)
98ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    if key not in data_frame.columns:
99ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return mask
100ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh    else:
101ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        for val in value:
102ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh            mask = mask & (data_frame[key] == val)
103ca7994692ab5cf454c5b9742a556f24c5dbd8136Kapileshwar Singh        return mask
104