blob: c0a46ff14b854908bf5761da6624100efc1020db [file] [log] [blame]
Javi Merino491cf732014-03-31 17:34:44 +01001#!/usr/bin/python
Javi Merino572049d2014-03-31 16:45:23 +01002"""Process the output of the power allocator trace in the current directory's trace.dat"""
3
4import os
Javi Merinoee56c362014-03-31 17:30:34 +01005import re
Javi Merino952815a2014-03-31 18:08:32 +01006from StringIO import StringIO
Javi Merinof78ea5b2014-03-31 17:51:38 +01007import pandas as pd
Javi Merino572049d2014-03-31 16:45:23 +01008
9class Thermal(object):
10 def __init__(self):
11 if not os.path.isfile("trace.txt"):
12 self.__run_trace_cmd_report()
Javi Merino952815a2014-03-31 18:08:32 +010013 self.data_csv = ""
Javi Merinof78ea5b2014-03-31 17:51:38 +010014 self.data_frame = False
Javi Merino572049d2014-03-31 16:45:23 +010015
16
17 def __run_trace_cmd_report(self):
18 """Run "trace-cmd report > trace.txt". Overwrites the contents of trace.txt if it exists."""
Javi Merinoee56c362014-03-31 17:30:34 +010019 from subprocess import check_output
20
Javi Merino1a3725a2014-03-31 18:35:15 +010021 if not os.path.isfile("trace.dat"):
22 raise IOError("No such file or directory: trace.dat")
23
Javi Merino572049d2014-03-31 16:45:23 +010024 with open(os.devnull) as devnull:
Javi Merinoee56c362014-03-31 17:30:34 +010025 out = check_output(["trace-cmd", "report"], stderr=devnull)
Javi Merino572049d2014-03-31 16:45:23 +010026
27 with open("trace.txt", "w") as f:
28 f.write(out)
Javi Merinoc08ca682014-03-31 17:29:27 +010029
Javi Merino952815a2014-03-31 18:08:32 +010030 def __parse_into_csv(self):
31 """Create a csv representation of the thermal data and store it in self.data_csv"""
Javi Merinoc08ca682014-03-31 17:29:27 +010032 pat_timestamp = re.compile(r"([0-9]+\.[0-9]+):")
33 pat_data = re.compile(r"[A-Za-z0-9_]+=([0-9]+) ")
34 header = ""
35
Javi Merino952815a2014-03-31 18:08:32 +010036 with open("trace.txt") as fin:
37 for line in fin:
38 if not re.search("Ptot_out", line):
39 continue
40
41 line = line[:-1]
42
43 m = re.search(pat_timestamp, line)
44 timestamp = m.group(1)
45
46 semi_idx = line.index(" : ")
47 data_str = line[semi_idx + 3:]
48
49 if not header:
50 header = re.sub(r"([A-Za-z0-9_]+)=[0-9]+ ", r"\1,", data_str)
51 header = header[:-1]
52 header = "time," + header + "\n"
53 self.data_csv = header
54
55 parsed_data = re.sub(pat_data, r"\1,", data_str)
56 # Drop the last comma
57 parsed_data = parsed_data[:-1]
58
59 parsed_data = timestamp + "," + parsed_data + "\n"
60 self.data_csv += parsed_data
61
62 def write_thermal_csv(self):
63 """Write the csv info in thermal.csv"""
64 if not self.data_csv:
65 self.__parse_into_csv()
66
Javi Merinoc08ca682014-03-31 17:29:27 +010067 with open("thermal.csv", "w") as fout:
Javi Merino952815a2014-03-31 18:08:32 +010068 fout.write(self.data_csv)
Javi Merinof78ea5b2014-03-31 17:51:38 +010069
70 def get_data_frame(self):
71 """Return a pandas data frame for the run"""
72 if self.data_frame:
73 return self.data_frame
74
Javi Merino952815a2014-03-31 18:08:32 +010075 if not self.data_csv:
76 self.__parse_into_csv()
Javi Merinof78ea5b2014-03-31 17:51:38 +010077
Javi Merino952815a2014-03-31 18:08:32 +010078 self.data_frame = pd.read_csv(StringIO(self.data_csv)).set_index("time")
Javi Merinof78ea5b2014-03-31 17:51:38 +010079 return self.data_frame
Javi Merinodf8316a2014-03-31 18:39:42 +010080
81 def plot_temperature(self):
82 """Plot the temperature"""
83 df = self.get_data_frame()
84 (df["currT"] / 1000).plot()