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