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