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