Ejemplo n.º 1
0
 def testGetSpreadsheet(self):
     csvName = path.join(self.theDir, "nix.csv")
     sd = TimelineDirectory(self.theDir)
     st = sd["p"]
     spread = st()
     spread.writeCSV(csvName)
     self.assertEqual(len(st.positions) + 1, len(spread.names()))
     rereadSpread = SpreadsheetData(csvName=csvName)
     self.assertEqual(len(spread.names()), len(rereadSpread.names()))
     self.assertEqual(len(spread.data), len(rereadSpread.data))
     sd = TimelineDirectory(self.theDir, "timeline")
     st = sd["p"]
     spread = st()
     spread.writeCSV(path.join(self.theDir, "nix2.csv"))
 def testGetSpreadsheet(self):
     csvName = path.join(self.theDir, "nix.csv")
     sd = TimelineDirectory(self.theDir)
     st = sd["p"]
     spread = st()
     assert len(spread.names()) == 5
     assert spread.size() == 3
     spread.writeCSV(csvName)
     assert len(st.positions) + 1 == len(spread.names())
     rereadSpread = SpreadsheetData(csvName=csvName)
     assert len(spread.names()) == len(rereadSpread.names())
     assert len(spread.data) == len(rereadSpread.data)
     sd = TimelineDirectory(self.theDir, "timeline")
     st = sd["p"]
     spread = st()
     spread.writeCSV(path.join(self.theDir, "nix2.csv"))
Ejemplo n.º 3
0
 def testFindCorrectNames(self):
     sd = TimelineDirectory(self.theDir, writeTime=0.1)
     self.assertEqual(len(sd), 3)
     self.assertEqual(sd.timeRange(), (0., 3.))
     self.assertEqual(len(sd.getData([0])), 3)
     self.assertEqual(len(sd.getData([0])[0][2]), 4)
     self.assertEqual(len(sd.getDataLocation(vectorMode="mag")), 12)
     self.assertEqual(sd.positions(),
                      ['(0 0 1)', '(1 0 1)', '(2 0 1)', '(3 1 1)'])
Ejemplo n.º 4
0
 def testGetTimesTimeline(self):
     sd = TimelineDirectory(self.theDir, dirName="timeline")
     st = sd["p"]
     self.assertEqual(st.getData([0.5, 1, 2, 4]),
                      [[0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0],
                       [1.0, 1.0, 1.0]])
     self.assert_(not st.isProbe())
     st = sd["h"]
     self.assertEqual(st.getData(
         [0.5, 1, 2,
          4]), [[0.0, 0.0, 0.0], [0.0, 1.0], [0.0, 1.0], [1.0, 1.0, 1.0]])
     self.assertRaises(KeyError, sd.__getitem__, "ha")
Ejemplo n.º 5
0
 def testGetTimes(self):
     sd = TimelineDirectory(self.theDir)
     st = sd["p"]
     self.assertEqual(st.getData([0.5, 1, 2, 4]),
                      [[0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 1.0, 1.0],
                       [0.0, 0.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]])
     self.assert_(st.isProbe())
     st = sd["h"]
     # this should be checked, but I don't want to
     self.assertEqual(
         st.getData([0.5, 1, 2, 4]),
         [[0.0, 0.0, 0.0, 0.0], [0.0, 1.0], [0.0, 1.0], [1.0, 1.0, 1.0]])
     self.assertRaises(KeyError, sd.__getitem__, "ha")
    def testGetTimesTimelineWithStringNoTitle(self):
        sd = TimelineDirectory(self.theDir, dirName="state")
        st = sd["state"]
        spread = st(False)

        self.assertEqual(spread(-1, "state"), "")
        self.assertEqual(spread(1, "state"), b("da"))
        self.assertEqual(spread(2.7, "state"), b("hier"))
        self.assertAlmostEqual(spread(2.7, "code"), 2.85)
        data = spread(2.7)
        self.assertEqual(len(data), 2)
        self.assertEqual(data["state"], b("hier"))
        self.assertAlmostEqual(data["code"], 2.85)
        import numpy as np
        self.assertEqual(spread.data.dtype[1].kind, "S")
    def testGetTimesTimelineWithString(self):
        sd = TimelineDirectory(self.theDir, dirName="state")
        st = sd["state"]
        self.assertEqual(st.getData(
            [0.5, 1, 2,
             4]), [['nix', 1.0], ['da', 2.0], ['da', 2.0], ['hier', 3.0]])
        self.assert_(not st.isProbe())
        spread = st()

        self.assertEqual(spread(-1, "state_t=0 state"), "")
        self.assertEqual(spread(1, "state_t=0 state"), b("da"))
        self.assertEqual(spread(2.7, "state_t=0 state"), b("hier"))
        self.assertAlmostEqual(spread(2.7, "state_t=0 code"), 2.85)
        data = spread(2.7)
        self.assertEqual(len(data), 2)
        self.assertEqual(data["state_t=0 state"], b("hier"))
        self.assertAlmostEqual(data["state_t=0 code"], 2.85)
Ejemplo n.º 8
0
    def run(self):
        # remove trailing slashif present
        if self.opts.dirName[-1] == path.sep:
            self.opts.dirName = self.opts.dirName[:-1]

        usedDirName = self.opts.dirName.replace("/", "_")

        timelines = TimelineDirectory(self.parser.getArgs()[0],
                                      dirName=self.opts.dirName,
                                      writeTime=self.opts.writeTime)
        reference = None
        if self.opts.reference and self.opts.referenceCase:
            self.error(
                "Options --reference-directory and --reference-case are mutual exclusive"
            )
        if (self.opts.csvFile or self.opts.excelFile or self.opts.pandasData
                or self.opts.numpyData) and (self.opts.compare
                                             or self.opts.metrics):
            self.error(
                "Options --csv-file/excel-file/--pandas-data/--numpy-data and --compare/--metrics are mutual exclusive"
            )

        if self.opts.reference:
            reference = TimelineDirectory(self.parser.getArgs()[0],
                                          dirName=self.opts.reference,
                                          writeTime=self.opts.writeTime)
        elif self.opts.referenceCase:
            reference = TimelineDirectory(self.opts.referenceCase,
                                          dirName=self.opts.dirName,
                                          writeTime=self.opts.writeTime)

        if self.opts.info:
            self.setData({
                'writeTimes': timelines.writeTimes,
                'usedTimes': timelines.usedTime,
                'fields': timelines.values,
                'positions': timelines.positions(),
                'timeRange': timelines.timeRange()
            })

            if not self.opts.silent:
                print_("Write Times    : ", timelines.writeTimes)
                print_("Used Time      : ", timelines.usedTime)
                print_("Fields         : ", timelines.values, end="")
            if len(timelines.vectors) > 0:
                if not self.opts.silent:
                    print_(" Vectors: ", timelines.vectors)
                self.setData({'vectors': timelines.vectors})
            else:
                if not self.opts.silent:
                    print_()
            if not self.opts.silent:
                print_("Positions      : ", timelines.positions())
                print_("Time range     : ", timelines.timeRange())

            if reference:
                refData = {
                    'writeTimes': reference.writeTimes,
                    'fields': reference.values,
                    'positions': reference.positions(),
                    'timeRange': reference.timeRange()
                }

                if not self.opts.silent:
                    print_("\nReference Data")
                    print_("Write Times    : ", reference.writeTimes)
                    print_("Fields         : ", reference.values, end="")
                if len(reference.vectors) > 0:
                    if not self.opts.silent:
                        print_(" Vectors: ", reference.vectors)
                    refData["vectors"] = reference.vectors
                else:
                    if not self.opts.silent:
                        print_()
                if not self.opts.silent:
                    print_("Positions      : ", reference.positions())
                    print_("Time range     : ", reference.timeRange())
                self.setData({"reference": refData})

            return 0

        if self.opts.fields == None:
            self.opts.fields = timelines.values
        else:
            for v in self.opts.fields:
                if v not in timelines.values:
                    self.error("The requested value", v,
                               "not in possible values", timelines.values)
        if self.opts.positions == None:
            self.opts.positions = timelines.positions()
        else:
            pos = self.opts.positions
            self.opts.positions = []
            for p in pos:
                try:
                    p = int(p)
                    if p < 0 or p >= len(timelines.positions()):
                        self.error("Time index", p,
                                   "out of range for positons",
                                   timelines.positions())
                    else:
                        self.opts.positions.append(timelines.positions()[p])
                except ValueError:
                    if p not in timelines.positions():
                        self.error("Position", p, "not in",
                                   timelines.positions())
                    else:
                        self.opts.positions.append(p)

        if len(self.opts.positions) == 0:
            self.error("No valid positions")

        result = "set term png nocrop enhanced \n"

        if self.opts.basicMode == None:
            self.error("No mode selected. Do so with '--basic-mode'")
        elif self.opts.basicMode == 'bars':
            if self.opts.time == None:
                self.error("No times specified for bar-plots")
            self.opts.time.sort()
            if self.opts.referenceTime and reference != None:
                minTime, maxTime = reference.timeRange()
            else:
                minTime, maxTime = timelines.timeRange()
            usedTimes = []
            hasMin = False
            for t in self.opts.time:
                if t < minTime:
                    if not hasMin:
                        usedTimes.append(minTime)
                        hasMin = True
                elif t > maxTime:
                    usedTimes.append(maxTime)
                    break
                else:
                    usedTimes.append(t)
            data = timelines.getData(usedTimes,
                                     value=self.opts.fields,
                                     position=self.opts.positions,
                                     vectorMode=self.opts.vectorMode)
            #            print_(data)
            result += "set style data histogram\n"
            result += "set style histogram cluster gap 1\n"
            result += "set style fill solid border -1\n"
            result += "set boxwidth 0.9\n"
            result += "set xtics border in scale 1,0.5 nomirror rotate by 90  offset character 0, 0, 0\n"
            # set xtic rotate by -45\n"
            result += "set xtics ("
            for i, p in enumerate(self.opts.positions):
                if i > 0:
                    result += " , "
                result += '"%s" %d' % (p, i)
            result += ")\n"
            for tm in usedTimes:
                if abs(float(tm)) > 1e20:
                    continue
                result += self.setFile("%s_writeTime_%s_Time_%s.png" %
                                       (usedDirName, timelines.usedTime, tm))
                result += 'set title "Directory: %s WriteTime: %s Time: %s"\n' % (
                    self.opts.dirName.replace("_",
                                              "\\\\_"), timelines.usedTime, tm)
                result += "plot "
                first = True
                for val in self.opts.fields:
                    if first:
                        first = False
                    else:
                        result += ", "
                    result += '"-" title "%s" ' % val.replace("_", "\\\\_")
                result += "\n"
                for v, t, vals in data:
                    if t == tm:
                        for v in vals:
                            result += "%g\n" % v
                        result += "e\n"
        elif self.opts.basicMode == 'lines':
            #            print_(self.opts.positions)
            oPlots = timelines.getDataLocation(value=self.opts.fields,
                                               position=self.opts.positions,
                                               vectorMode=self.opts.vectorMode)

            plots = oPlots[:]
            rPlots = None

            if reference:
                rPlots = reference.getDataLocation(
                    value=self.opts.fields,
                    position=self.opts.positions,
                    vectorMode=self.opts.vectorMode)
                for gp, pos, val, comp, tv in rPlots:
                    plots.append(
                        (gp, pos, self.opts.refprefix + " " + val, comp, tv))
            if self.opts.referenceTime and reference != None:
                minTime, maxTime = reference.timeRange()
            else:
                minTime, maxTime = timelines.timeRange()
            if self.opts.minTime:
                minTime = self.opts.minTime
            if self.opts.maxTime:
                maxTime = self.opts.maxTime
            result += "set xrange [%g:%g]\n" % (minTime, maxTime)
            if self.opts.collectLines == "fields":
                for val in self.opts.fields:
                    vname = val
                    if val in timelines.vectors:
                        vname += "_" + self.opts.vectorMode
                    result += self.setFile(
                        "%s_writeTime_%s_Value_%s.png" %
                        (usedDirName, timelines.usedTime, vname))
                    result += 'set title "Directory: %s WriteTime: %s Value: %s"\n' % (
                        self.opts.dirName.replace("_", "\\\\_"),
                        timelines.usedTime, vname.replace("_", "\\\\\\_"))
                    result += "plot "
                    first = True
                    for f, v, p, i, tl in plots:
                        if v == val:
                            if first:
                                first = False
                            else:
                                result += " , "
                            if type(i) == int:
                                result += ' "%s" using 1:%d title "%s" with lines ' % (
                                    f, i + 2, p.replace("_", "\\\\_"))
                            else:
                                result += ' "%s" using 1:%s title "%s" with lines ' % (
                                    f, i, p.replace("_", "\\\\_"))

                    result += "\n"
            elif self.opts.collectLines == "positions":
                for pos in self.opts.positions:
                    result += self.setFile(
                        "%s_writeTime_%s_Position_%s.png" %
                        (usedDirName, timelines.usedTime, pos))
                    result += 'set title "Directory: %s WriteTime: %s Position: %s"\n' % (
                        self.opts.dirName.replace("_", "\\\\_"),
                        timelines.usedTime, pos.replace("_", "\\\\_"))
                    result += "plot "
                    first = True
                    for f, v, p, i, tl in plots:
                        if p == pos:
                            if first:
                                first = False
                            else:
                                result += " , "
                            if type(i) == int:
                                result += ' "%s" using 1:%d title "%s" with lines ' % (
                                    f, i + 2, v.replace("_", "\\\\_"))
                            else:
                                result += ' "%s" using 1:%s title "%s" with lines ' % (
                                    f, i, v.replace("_", "\\\\_"))
                    result += "\n"

            else:
                self.error("Unimplemented collection of lines:",
                           self.opts.collectLines)
        else:
            self.error("Not implemented basicMode", self.opts.basicMode)

        if self.opts.csvFile or self.opts.excelFile or self.opts.pandasData or self.opts.numpyData:
            if self.opts.basicMode != 'lines':
                self.error(
                    "CSV and Excel-files currently only supported for lines-mode (also Pandas and Numpy-data)"
                )
            spread = plots[0][-1]()
            usedFiles = set([plots[0][0]])
            for line in plots[1:]:
                if line[0] not in usedFiles:
                    usedFiles.add(line[0])
                    sp = line[-1]()
                    try:
                        spread += sp
                    except WrongDataSize:
                        if self.opts.resample:
                            for n in sp.names()[1:]:
                                data = spread.resample(
                                    sp, n, extendData=self.opts.extendData)
                                try:
                                    spread.append(n, data)
                                except ValueError:
                                    spread.append(
                                        self.opts.refprefix + " " + n, data)
                        else:
                            self.warning("Try the --resample-option")
                            raise

            if self.opts.csvFile:
                spread.writeCSV(self.opts.csvFile)
            if self.opts.excelFile:
                spread.getData().to_excel(self.opts.excelFile)
            if self.opts.pandasData:
                self.setData({
                    "series": spread.getSeries(),
                    "dataFrame": spread.getData()
                })
            if self.opts.numpyData:
                self.setData({"data": spread.data.copy()})

        elif self.opts.compare or self.opts.metrics:
            statData = {}
            if self.opts.compare:
                statData["compare"] = {}
            if self.opts.metrics:
                statData["metrics"] = {}
            for p in self.opts.positions:
                if self.opts.compare:
                    statData["compare"][p] = {}
                if self.opts.metrics:
                    statData["metrics"][p] = {}

            if self.opts.basicMode != 'lines':
                self.error("Compare currently only supported for lines-mode")

            if self.opts.compare:
                if rPlots == None:
                    self.error("No reference data specified. Can't compare")
                elif len(rPlots) != len(oPlots):
                    self.error("Number of original data sets", len(oPlots),
                               "is not equal to the reference data sets",
                               len(rPlots))

            for i, p in enumerate(oPlots):
                pth, val, loc, ind, tl = p
                if self.opts.compare:
                    rpth, rval, rloc, rind, rtl = rPlots[i]
                    if val != rval or loc != rloc or ind != rind:
                        self.error("Original data", p, "and reference",
                                   rPlots[i], "do not match")
                data = tl()
                try:
                    dataIndex = 1 + ind
                    if self.opts.metrics:
                        if not self.opts.silent:
                            print_("Metrics for", val, "on", loc, "index", ind,
                                   "(Path:", pth, ")")
                        result = data.metrics(data.names()[dataIndex],
                                              minTime=self.opts.minTime,
                                              maxTime=self.opts.maxTime)
                        statData["metrics"][loc][val] = result
                        if not self.opts.silent:
                            print_("  Min                :", result["min"])
                            print_("  Max                :", result["max"])
                            print_("  Average            :", result["average"])
                            print_("  Weighted average   :",
                                   result["wAverage"])
                            if not self.opts.compare:
                                print_("Data size:", data.size())
                            print_("  Time Range         :", result["tMin"],
                                   result["tMax"])
                    if self.opts.compare:
                        if not self.opts.silent:
                            print_("Comparing",
                                   val,
                                   "on",
                                   loc,
                                   "index",
                                   ind,
                                   "(path:",
                                   pth,
                                   ")",
                                   end="")
                        ref = rtl()
                        if self.opts.compareOnOriginal:
                            if not self.opts.silent:
                                print_("on original data points")
                            result = data.compare(ref,
                                                  data.names()[dataIndex],
                                                  minTime=self.opts.minTime,
                                                  maxTime=self.opts.maxTime)
                        else:
                            if not self.opts.silent:
                                print_("on reference data points")
                            result = ref.compare(data,
                                                 data.names()[dataIndex],
                                                 minTime=self.opts.minTime,
                                                 maxTime=self.opts.maxTime)

                        statData["compare"][loc][val] = result
                        if not self.opts.silent:
                            print_("  Max difference     :", result["max"])
                            print_("  Average difference :", result["average"])
                            print_("  Weighted average   :",
                                   result["wAverage"])
                            print_("Data size:", data.size(), "Reference:",
                                   ref.size())
                            if not self.opts.metrics:
                                print_("  Time Range         :",
                                       result["tMin"], result["tMax"])
                    if not self.opts.silent:
                        print_()
                except TypeError:
                    if self.opts.vectorMode == "mag":
                        self.error(
                            "Vector-mode 'mag' not supported for --compare and --metrics"
                        )
                    else:
                        raise

            self.setData(statData)
        else:
            dest = sys.stdout
            if self.opts.gnuplotFile:
                dest = open(self.opts.gnuplotFile, "w")

            dest.write(result)