Source code for avl.tools.trace_analysis

#!/usr/bin/env python3

import argparse

import pandas as pd
import tabulate

# HTML + DataTables JavaScript with column filters and fixed header
html_code = """
<html>
<head>
    <link rel="stylesheet"
          href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css">
    <link rel="stylesheet"
          href="https://cdn.datatables.net/fixedheader/3.2.0/css/fixedHeader.dataTables.min.css">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/fixedheader/3.2.0/js/dataTables.fixedHeader.min.js"></script>
    <script>
        $(document).ready(function() {{
            // Add input fields to each column header
            $('#myTable thead tr').clone(true).appendTo('#myTable thead');
            $('#myTable thead tr:eq(1) th').each(function (i) {{
                var title = $(this).text();
                $(this).html('<input type="text" placeholder="Filter ' + title + '" />');

                // Enable per-column filtering
                $('input', this).on('keyup change', function () {{
                    if (table.column(i).search() !== this.value) {{
                        table.column(i).search(this.value).draw();
                    }}
                }});
            }});

            // Initialize DataTable with ordering, fixed header, and per-column search
            var table = $('table').DataTable({{
                orderCellsTop: true,  // Allow column headers to remain fixed
                fixedHeader: true      // Enable the fixed header functionality
            }});
        }});
    </script>
</head>
<body>
    <h2>{query}</h2>
    {html_table}
</body>
</html>
"""

[docs] def main(): parser = argparse.ArgumentParser(description="Analyze and visualize AVL trace data") parser.add_argument("--tracefile", nargs="+", required=True, type=str, help="Trace file(s) to analyze.") parser.add_argument("--query", type=str, help="Query to filter trace data.", default=None) parser.add_argument("--sort", type=str, help="Column to sort by.", default=None) parser.add_argument("--output", type=str, help="Output HTML file name.", default=None) parser.add_argument("--debug", action="store_true", help="Enable debug mode for detailed output.") args = parser.parse_args() # Read in trace files df = pd.concat([pd.read_csv(f) for f in args.tracefile], ignore_index=True) # Run Query if provided if args.query: if args.debug: print(f"Applying query: {args.query}") df = df.query(args.query) # Sort by column if specified if args.sort: if args.debug: print(f"Sorting by column: {args.sort}") df = df.sort_values(by=args.sort) # Output to HTML if specified if args.output: if args.debug: print(f"Writing output to: {args.output}") html_table = df.to_html(index=False, table_id="myTable") html_content = html_code.format(query=args.query or "AVL Trace Analysis", html_table=html_table) with open(args.output, "w") as f: f.write(html_content) else: print(tabulate.tabulate(df.values.tolist(), headers=df.columns, tablefmt="grid"))
if __name__ == "__main__": main() exit(0)