Exemple #1
0
class multiplot:
    """
    docstring should be added ...
    """
    def __init__(self, panels, setformat=0):
        self.panel = []
        for i in range(panels):
            self.panel.append(plotdata())
        self.xrange = [0., 100.]
        self.xlabel = "DoY"
        self.xaxis_flag = 0
        self.title = ""
        self.gv = 1
        self.format = setformat  #0 Querformat, 1 Hochformat
        self.outname = "multiplot"
        self.plotmarks = []

    def addplotmark(self, style, lt=5):
        self.plotmarks.append(plotmark(style, lt))

    def addpanel(self, data):
        self.panel.append(plotdata())

    def setxrange(self, a, b):
        self.xrange[0] = a
        self.xrange[1] = b

    def settitle(self, a):
        self.title = a

    def setgv(self, a):
        self.gv = a

    def setxaxis2(self, a):
        """
	This routine plots a seconds xaxis on top of the screen.
	Input must be a list of lists containing the x2label and xposition of that label:
	e.g: [["Jan",30],["Feb",58]...]
	"""
        self.xaxis_flag = 1
        try:
            b = a[0][0]
            b = a[0][1]
        except:
            print "Wrong input for SELF.SETXAXIS2()"
            print "Input must be of the form of [['label',xpos],['label',xpos],[],[],...,[]]"
            print "Second x axis is omitted. Hit ENTER to proceed"
            blub = raw_input()
        self.xaxis2 = a

    def setxlabel(self, a):
        self.xlabel = str(a)

    def setname(self, a):
        self.outname = str(a)

    def build_xaxis2(self):
        """
 	This routine builds the seconds xaxis from self.xaxis2
	"""
        for label in self.xaxis2:
            if label[1] > self.xrange[0] and label[1] < self.xrange[1]:
                self.gp(
                    "set label center'{/Helvetica=5  %s}' at first %f, screen 1.00"
                    % (label[0], label[1]))
        self.xaxis_flag = 0

    def plot(self):
        self.gp = Gnuplot()
        self.generatebox()
        for panel in range(len(self.panel)):
            self.plotpanel(panel)
        #self.gp("unset tmargin")
        #self.gp("unset title")
        #self.gp("unset multiplot")
        #self.gp("set size 1,1")
        #self.gp("set xtics")
        self.gp("set autoscale")
        self.gp.sync()
        os.system("ps2eps -f -B -l %s.ps" % (self.outname))
        os.system("rm %s.ps" % (self.outname))
        if (self.gv):
            os.system("okular %s.eps" % (self.outname))
        del self.gp

    def generatebox(self):
        self.gp("set term postscript solid enhanced color")
        self.gp("set output '%s.ps'" % (self.outname))
        self.gp("set border front")
        self.gp("unset key")
        self.gp("unset colorbox")
        self.gp(
            "set palette model RGB functions gray<1.e-20 ? 1 : gray<0.5 ? gray*2 : 1 , gray<1.e-20 ? 1 : gray<0.5 ? gray*2 : 2-gray*2, gray <1.e-20 ? 1 : gray<0.5 ? 1-sqrt(gray*2) : 0"
        )
        if (self.format):
            self.gp("set xtics nomirror font 'Helvetica,9'")
        else:
            self.gp("set xtics nomirror")
        self.gp("set multiplot")
        self.gp("set xlabel 0,0.1")
        if (self.format):
            self.gp("set xlabel '%s' font 'Helvetica,9'" % (self.xlabel))
        else:
            self.gp("set xlabel '%s' font 'Helvetica,12'" % (self.xlabel))
        self.gp("set xrange[%e:%e]" %
                (float(self.xrange[0]), float(self.xrange[1])))
        if (self.format):
            self.gp("set ytics font 'Helvetica,9'")
        else:
            self.gp("set ytics")
        #self.gp("set autoscale")
        self.gp("set key right samplen 0.5")
        self.gp("set key spacing 0.8")
        self.gp("unset xtics")
        self.gp("unset xlabel")
        self.gp("set border front")
        if self.xaxis_flag == 1:
            self.build_xaxis2()

    def plotpanel(self, panel):
        self.buildplotmarks(panel)
        first = 1
        self.gp("unset key")
        self.gp(
            "set label center'{/Helvetica=9  %s}' at screen 0.3, screen 1.02" %
            (self.title))
        self.gp("set border front")
        #self.gp("unset label")
        if (self.panel[panel].grid):
            self.gp("set grid xtics front")
        else:
            self.gp("set grid xtics front")
            self.gp("unset grid")
        size = (.86 / (float(len(self.panel)))) + 0.06
        size2 = .86
        self.gp("unset xlabel")
        self.gp("set format x ''")
        self.buildytics(panel)
        if (panel == 0):
            size = (.86 / float((len(self.panel)))) + 0.1
            self.gp("set xlabel 0,0.2")
            if (self.format):
                self.gp("set xlabel '%s' font 'Helvetica,9'" % (self.xlabel))
            else:
                self.gp("set xlabel '%s' font 'Helvetica,12'" % (self.xlabel))
            self.gp("set format x")
            if (self.format):
                self.gp("set xtics font 'Helvetica,9'")
            else:
                self.gp("set xtics")
            self.gp("set mxtics 10")
        if (self.panel[panel].type == "plot"):
            self.gp("set size 1.,%f" % (size))
            if (self.format):
                self.gp("set size 0.6,%f" % (size))
        elif (self.panel[panel].type == "splot"):
            self.gp("set size 1.2935,%f" % (size * 1.65))
        if (panel == 0):
            self.gp("set origin 0,%f" % (0.05))
        else:
            if (self.panel[panel].type == "plot"):
                self.gp("set origin 0,%f" % (0.09 + float(panel) *
                                             (size - 0.06)))
            elif (self.panel[panel].type == "splot"):
                self.gp("set origin -.147,%f" % ((0.09 + float(panel) *
                                                  (size - 0.06)) - .1315))

        self.gp("set lmargin 8")
        if (self.format):
            self.gp(
                "set label '%s' at screen 0.05,%f center rotate by 90 font 'Helvetica,9'"
                % ((self.panel[panel].ylabel),
                   (0.09 + float(panel) * (size - 0.06) + size / 2.)))
        else:
            self.gp(
                "set label '%s' at screen 0.03,%f center rotate by 90 font 'Helvetica,12'"
                % ((self.panel[panel].ylabel),
                   (0.09 + float(panel) * (size - 0.06) + size / 2.)))
        self.gp("set yrange[%e:%e]" %
                (self.panel[panel].yrange[0], self.panel[panel].yrange[1]))
        if self.panel[panel].xrange[0] != "NAN":
            self.gp("set xrange[%e:%e]" %
                    (self.panel[panel].xrange[0], self.panel[panel].xrange[1]))
        # plot marks
        for mark in self.plotmarks:
            doplotmark = 0
            for i in mark.panels:
                if (i == -1
                        or i == panel and self.panel[panel].type == "plot"):
                    doplotmark = 1
            if (doplotmark):
                doplotlabel = 0
                if (mark.label != ""):
                    for i in mark.labelpanels:
                        if (i == -1 or i == panel):
                            doplotlabel = 1
                if (mark.style == "vline"):
                    head = ""
                    if (mark.arrowhead == 0):
                        head = "nohead"
                    elif (mark.arrowhead == 1):
                        head = "head filled"
                    mark.plot[panel].set_option_colonsep(
                        "with", "vectors %s lt %i lw %i" %
                        (head, mark.linetype, mark.linewidth))
                    #self.gp("plot 'testvector.dat' with vectors")
                    if (doplotlabel):
                        if (self.format):
                            self.gp(
                                "set label '%s' at graph %f,%f tc lt %i font 'Helvetica,9' front"
                                % ((mark.label, mark.pos[0][0] /
                                    (self.xrange[1] - self.xrange[0]) + 0.01,
                                    0.8, mark.linetype)))
                        else:
                            self.gp(
                                "set label '%s' at graph %f,%f tc lt %i font 'Helvetica,12' front"
                                % ((mark.label, mark.pos[0][0] /
                                    (self.xrange[1] - self.xrange[0]) + 0.01,
                                    0.8, mark.linetype)))
                    if (first):
                        self.gp.plot(mark.plot[panel])
                        first = 0
                    else:
                        self.gp.replot(mark.plot[panel])
                if (mark.style == "box"):
                    mark.plot[panel].set_option_colonsep("using", "1:2:3")
                    mark.plot[panel].set_option_colonsep(
                        "with", "filledcurves lt %i" % (mark.linetype))
                    if (doplotlabel):
                        if (self.format):
                            self.gp(
                                "set label '%s' at graph %f,%f tc lt %i font 'Helvetica,9' center front"
                                % (mark.label,
                                   (mark.pos[0][0] +
                                    (mark.pos[0][2] - mark.pos[0][0]) / 2.) /
                                   (self.xrange[1] - self.xrange[0]), 0.8, 0))
                        else:
                            self.gp(
                                "set label '%s' at graph %f,%f tc lt %i font 'Helvetica,12' center front"
                                % (mark.label,
                                   (mark.pos[0][0] +
                                    (mark.pos[0][2] - mark.pos[0][0]) / 2.) /
                                   (self.xrange[1] - self.xrange[0]), 0.8, 0))
                    if (first):
                        self.gp.plot(mark.plot[panel])
                        first = 0
                    else:
                        self.gp.replot(mark.plot[panel])
                if (mark.style == "hline"):
                    head = ""
                    if (mark.arrowhead == 0):
                        head = "nohead"
                    elif (mark.arrowhead == 1):
                        head = "head filled"
                    mark.plot[panel].set_option_colonsep(
                        "with", "vectors %s lt %i lw %i" %
                        (head, mark.linetype, mark.linewidth))
                    #self.gp("plot 'testvector.dat' with vectors")
                    if (doplotlabel):
                        if (self.format):
                            self.gp(
                                "set label '%s' at graph %f,%f tc lt %i font 'Helvetica,9' front"
                                % ((mark.label, mark.pos[0][0] /
                                    (self.xrange[1] - self.xrange[0]) + 0.01,
                                    0.8, mark.linetype)))
                        else:
                            self.gp(
                                "set label '%s' at graph %f,%f tc lt %i font 'Helvetica,12' front"
                                % ((mark.label, mark.pos[0][0] /
                                    (self.xrange[1] - self.xrange[0]) + 0.01,
                                    0.8, mark.linetype)))
                    if (first):
                        self.gp.plot(mark.plot[panel])
                        first = 0
                    else:
                        self.gp.replot(mark.plot[panel])
                if (mark.style == "function"):
                    if (first):
                        self.gp.plot(mark.plot[panel])
                    else:
                        self.gp.replot(mark.plot[panel])

        if (first and self.panel[panel].type == "plot"):
            if len(self.panel[panel].data) == 1:
                self.gp("%s" % (self.panel[panel].key))
            self.gp.plot(self.panel[panel].data[0])
            first = 0
        elif (first and self.panel[panel].type == "splot"):
            self.gp("set pm3d map")
            self.gp.splot(self.panel[panel].data[0])
            first = 0
        else:
            self.gp.replot(self.panel[panel].data[0])
        for i in range(len(self.panel[panel].data) - 1):
            if i == len(self.panel[panel].data) - 2:
                self.gp("%s" % (self.panel[panel].key))
            self.gp.replot(self.panel[panel].data[i + 1])
        self.gp("unset pm3d")

    def buildplotmarks(self, panel):
        for mark in self.plotmarks:
            tmpmark = []
            if (mark.style == "vline"):
                tmppos = mark.pos
                tmppos[0][1] = self.panel[panel].yrange[0] * 1.01
                tmppos[0][3] = (self.panel[panel].yrange[1] -
                                self.panel[panel].yrange[0]) * 0.99
                tmpmark = Data(tmppos)
            if (mark.style == "hline"):
                tmppos = mark.pos
                tmppos[0][0] = self.xrange[0] * 1.01
                tmppos[0][2] = (self.xrange[1] - self.xrange[0]) * 0.99
                tmpmark = Data(tmppos)
            if (mark.style == "box"):
                if mark.pos[0][2] == 1e-20:
                    ymin = self.panel[panel].yrange[0]
                else:
                    ymin = mark.pos[0][2]
                if mark.pos[0][3] == 1e20:
                    ymax = self.panel[panel].yrange[1]
                else:
                    ymax = mark.pos[0][3]
                tmppos = [[mark.pos[0][0], ymin, ymax],
                          [mark.pos[0][1], ymin, ymax]]
                #tmppos=[[mark.pos[0][0],self.panel[panel].yrange[1],self.panel[panel].yrange[0]],[mark.pos[0][2],self.panel[panel].yrange[1],self.panel[panel].yrange[0]]]
                tmpmark = Data(tmppos)
            if (mark.style == "function"):
                tmpmark = mark.function
            if (tmpmark != []):
                mark.addplot(tmpmark)

    def buildytics(self, panel):
        # the tics for panel=panel are set. The cases logscale and linear scale are handled. In the first panel (panel==0) all tics are labeled set
        # in all other panels the first tic is unlabeled to avoid overlapp with the tics from the panel below.
        # logscale tics are set   --->  if yrange is smaller than 7 orders of magnitude the tics are set each order of magnitude and 8 minor tics
        #                               corresponding to 2*,3*,...,9* are set (will fail if yrange is smaller than one order of magnitude
        #                               if yrange is greater than
        # linearscale tics are set --->

        if (self.panel[panel].ytics != ""):
            if (self.format):
                self.gp("set ytics %s font 'Helvetica,9'" %
                        (self.panel[panel].ytics))
            else:
                self.gp("set ytics %s" % (self.panel[panel].ytics))
            if (self.panel[panel].logscale):
                self.gp("set logscale y")
            return

        # begin if logscale
        if (self.panel[panel].logscale):
            self.gp("unset ytics")
            self.gp("set logscale y")
            self.gp("set format y '10^{%2T}'")
            adjust = 0
            i = 1.e0
            while (not adjust):
                i = i * 10.
                tmp = self.panel[panel].yrange[0]
                tmp = tmp * i**6
                if (tmp >= self.panel[panel].yrange[1]):
                    adjust = 1

            if (self.panel[panel].minor < 0):
                if (i <= 10.):
                    minor = 8
                else:
                    minor = int(log(i, 10.) + .01)
                    minor2 = 2
            if (self.panel[panel].minor == 0):
                if (i <= 10.):
                    minor = 0
                else:
                    minor = int(log(i, 10.) + .01)
                    minor2 = 1
            if (self.panel[panel].minor > 0):
                if (i <= 10.):
                    minor = self.panel[panel].minor
                else:
                    minor = int(log(i, 10.) + .01)
                    minor2 = 2
            tic = self.panel[panel].yrange[0]
            utic = tic
            if (i <= 10.):
                j = -1
                while (utic <= self.panel[panel].yrange[1]):
                    j += 1
                    utic = tic * i**j
                    if (j == 0):
                        if (panel == 0):
                            if (self.format):
                                self.gp("set ytics (%e) font 'Helvetica,9'" %
                                        (utic))
                            else:
                                self.gp("set ytics (%e)" % (utic))
                        else:
                            if (self.format):
                                self.gp(
                                    "set ytics (' ' %e) font 'Helvetica,9'" %
                                    (float(utic)))
                            else:
                                self.gp("set ytics (' ' %e)" % (float(utic)))
                    else:
                        self.gp("set ytics add (%e)" % (utic))
                    for l in range(minor):
                        self.gp(
                            "set ytics add ('' %e 1)" %
                            (utic +
                             (utic * 9. / float(minor + 1) * float(l + 1))))
            else:
                j = -1
                while (utic <= self.panel[panel].yrange[1]):
                    j += 1
                    utic = tic * i**j
                    if (j == 0):
                        if (panel == 0):
                            if (self.format):
                                self.gp("set ytics (%e) font 'Helvetica,9'" %
                                        (utic))
                            else:
                                self.gp("set ytics (%e)" % (utic))
                        else:
                            if (self.format):
                                self.gp(
                                    "set ytics (' ' %e) font 'Helvetica,9'" %
                                    (float(utic)))
                            else:
                                self.gp("set ytics (' ' %e)" % (float(utic)))
                    else:
                        self.gp("set ytics add (%e)" % (utic))
                    for k in range(minor):
                        for l in range(minor2):
                            if (not (k == minor - 1 and l == minor2 - 1)):
                                if (l == minor2 - 1):
                                    self.gp(
                                        "set ytics add ('' %e)" %
                                        (float(utic) * float(10**k) * float(
                                            (l + 1) * 10. / float(minor2))))
                                else:
                                    self.gp(
                                        "set ytics add ('' %e 1)" %
                                        (float(utic) * float(10**k) * float(
                                            (l + 1) * 10. / float(minor2))))
        # begin if linear scale
        else:
            self.gp("unset ytics")
            self.gp("unset logscale y")
            self.gp("set format y '%6g'")
            i = .1
            while (self.panel[panel].yrange[1] - self.panel[panel].yrange[0] >
                   i):
                i = i * 10.
            minor = 9
            if (i / 4. >=
                    self.panel[panel].yrange[1] - self.panel[panel].yrange[0]):
                i = i / 4.
                minor = 4
            elif (i / 2. >=
                  self.panel[panel].yrange[1] - self.panel[panel].yrange[0]):
                i = i / 2.
                minor = 9
            if (self.panel[panel].minor == 0):
                minor = 0
            elif (self.panel[panel].minor > 0):
                minor = self.panel[panel].minor

            if (i > 10.):
                for j in range(6):
                    if (j == 0):
                        if (panel == 0):
                            if (self.format):
                                self.gp("set ytics (%i) font 'Helvetica,9'" %
                                        (int(self.panel[panel].yrange[0])))
                            else:
                                self.gp("set ytics (%i)" %
                                        (int(self.panel[panel].yrange[0])))
                        else:
                            if (self.format):
                                self.gp(
                                    "set ytics (' ' %i) font 'Helvetica,9'" %
                                    (int(self.panel[panel].yrange[0])))
                            else:
                                self.gp("set ytics (' ' %i)" %
                                        (int(self.panel[panel].yrange[0])))
                    else:
                        self.gp(
                            "set ytics add (%i)" %
                            (int(self.panel[panel].yrange[0] + i / 5. * j)))
                    print "minor = ", minor
                    for k in range(minor):
                        if ((minor + 1) % 5 == 0 and (k + 1) % 5 == 0):
                            self.gp(
                                "set ytics add (' ' %i)" %
                                (int(self.panel[panel].yrange[0] + j * i / 5. +
                                     (i / 5. / float(minor + 1) *
                                      float(k + 1)))))
                        else:
                            self.gp(
                                "set ytics add (' ' %i 1)" %
                                (int(self.panel[panel].yrange[0] + j * i / 5. +
                                     (i / 5. / float(minor + 1) *
                                      float(k + 1)))))
            else:
                for j in range(6):
                    if (j == 0):
                        if (panel == 0):
                            if (self.format):
                                self.gp("set ytics (%f) font 'Helvetica,9'" %
                                        (self.panel[panel].yrange[0]))
                            else:
                                self.gp("set ytics (%f)" %
                                        (self.panel[panel].yrange[0]))
                        else:
                            if (self.format):
                                self.gp(
                                    "set ytics (' ' %f) font 'Helvetica,9'" %
                                    (self.panel[panel].yrange[0]))
                            else:
                                self.gp("set ytics (' ' %f)" %
                                        (self.panel[panel].yrange[0]))
                    else:
                        self.gp("set ytics add (%f)" %
                                (self.panel[panel].yrange[0] + i / 5. * j))
                    for k in range(minor):
                        if ((minor + 1) % 5 == 0 and (k + 1) % 5 == 0):
                            self.gp(
                                "set ytics add (' ' %f)" %
                                (self.panel[panel].yrange[0] + j * i / 5. +
                                 (i / 5. / float(minor + 1) * float(k + 1))))
                        else:
                            self.gp(
                                "set ytics add (' ' %f 1)" %
                                (self.panel[panel].yrange[0] + j * i / 5. +
                                 (i / 5. / float(minor + 1) * float(k + 1))))
Exemple #2
0
class vspec:
    def __init__(self, year, timeframe):
        self.year = year
        self.timeframe = timeframe
        self.hedata = loadswicsiondata("He2+", 720., self.year, self.timeframe,
                                       "/data/etph/ace/")
        self.odata = loadswicsiondata("O6+", 720., self.year, self.timeframe,
                                      "/data/etph/ace/")
        self.hdata = swicsdcrtcr("H1+", self.year, self.timeframe,
                                 "/data/etph/ace/pui/12mdata/")
        self.swedata = swepamdata(64., self.year, self.timeframe,
                                  "/data/etph/ace/swepam/")
        self.swedata.sync_h(self.hedata)
        self.mag = magdata(1., self.year, self.timeframe,
                           "/data/etph/ace/mag/")
        self.mag.sync_mag(self.hedata)
        self.theta = arccos(cos(self.mag.phi) * cos(self.mag.theta))
        self.valf = 21.8 / sqrt(self.swedata.dens) * (self.mag.magb)
        self.valf[isinf(self.valf)] = -1.
        self.valf[isnan(self.valf)] = -2.
        self.effh = zeros([58])
        self.effhe = zeros([58])
        self.effo = zeros([58])
        self.gp = Gnuplot()
        self.gp("set xr [-2:3]")
        self.gp("set yr [0:1]")
        self.gp("set xlabel '(v-v_{sw})/C_{A}'")
        self.stdhe = []
        self.stdo = []
        self.stdh = []
        self.skewhe = []
        self.skewo = []
        self.skewh = []
        self.kurthe = []
        self.kurto = []
        self.kurth = []
        self.meanvhe = []
        self.meanvo = []
        self.meanvh = []
        self.maxvhe = []
        self.maxvo = []
        self.maxvh = []
        self.time = []
        self.years = []
        self.valfs = []
        self.magb = []
        self.thetas = []
        self.sigtheta = []
        self.vsw = []
        self.dsw = []
        self.tsw = []
        self.load_eff()

    def load_eff(self):
        effh = loadtxt(open("/data/etph/ace/efficencies/H1+.eff", "r"))
        effhe = loadtxt(open("/data/etph/ace/efficencies/He2+.eff", "r"))
        effo = loadtxt(open("/data/etph/ace/efficencies/O6+.eff", "r"))
        self.effh = effh[:, 1]
        self.effhe = effhe[:, 1]
        self.effo = effo[:, 1]

    def moments(self, thetalist=[[0., pi / 18.], [pi - pi / 18., pi]]):
        thetamask = (self.theta >= thetalist[0][0]) * (self.theta <=
                                                       thetalist[0][1])
        if len(thetalist) > 1:
            for val in thetalist[1:]:
                thetamask += (self.theta >= val[0]) * (self.theta <= val[1])
        for step in where(thetamask)[0]:
            if self.valf[step] > 0.:
                self.years.append(self.hedata.year)
                self.time.append(self.hedata.time[step])
                self.valfs.append(self.valf[step])
                self.magb.append(self.mag.magb[step])
                self.thetas.append(self.mag.THETA[step])
                self.sigtheta.append(self.mag.sigTHETA[step])
                self.vsw.append(self.swedata.vel[step])
                self.dsw.append(self.swedata.dens[step])
                self.tsw.append(self.swedata.temp[step])
                # Protons
                il = where(self.hdata.time == self.hedata.time[step])[0]
                if il.shape[0] > 0 and amax(self.hdata.tcrspec[il[0], :] +
                                            self.hdata.dcrspec[il[0], :]) > 0.:
                    tmpspec = zeros([self.hdata.velspec.shape[0], 2])
                    tmpspec[:, 0] = self.hdata.velspec
                    tmpspec[:, 1] = 1. * self.hdata.tcrspec[
                        il[0]] + 1. * self.hdata.dcrspec[il[0]]
                    tmpspec[:, 1] = tmpspec[:, 1] / (
                        tmpspec[:, 0] * 0.03) / self.effh / tmpspec[:, 0]
                    il2 = where(tmpspec[:, 1] == amax(tmpspec[:, 1]))[0]
                    if (il2[0] > 0 and il2[0] < tmpspec[:, 1].shape[0] - 1):
                        maxvh = sum(
                            tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 0] *
                            tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 1]
                        ) / sum(tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 1])
                    else:
                        maxvh = tmpspec[il2[0], 0]
                    meanvh = sum(tmpspec[:, 0] * tmpspec[:, 1]) / sum(
                        tmpspec[:, 1])
                    if maxvh > 390.:
                        tmphvel = (tmpspec[:, 0] - maxvh) / self.valf[step]
                        tmphcts = (tmpspec[:, 1]) / sum(tmpspec[:, 1])
                        maskh = (tmphvel >= -3.) * (tmphvel <= 3.)
                        stdh = sqrt(sum((tmphvel[maskh]**2) * tmphcts[maskh]))
                        skewh = (sum(
                            (tmphvel[maskh]**3) * tmphcts[maskh])) / stdh**3.
                        kurth = (sum(
                            (tmphvel[maskh]**4) * tmphcts[maskh])) / stdh**4.
                        self.stdh.append(stdh)
                        self.skewh.append(skewh)
                        self.kurth.append(kurth)
                        self.meanvh.append(meanvh)
                        self.maxvh.append(maxvh)
                    else:
                        self.stdh.append(-999.)
                        self.skewh.append(-999.)
                        self.kurth.append(-999.)
                        self.meanvh.append(-999.)
                        self.maxvh.append(-999.)
                else:
                    self.stdh.append(-999.)
                    self.skewh.append(-999.)
                    self.kurth.append(-999.)
                    self.meanvh.append(-999.)
                    self.maxvh.append(-999.)

                # Alphas
                if (where(self.hedata.countspec[step, :, 1] > 0.)[0].shape[0]
                        >= 3):
                    tmpspec = 1. * self.hedata.countspec[step]
                    tmpspec[:, 1] = tmpspec[:, 1] / (
                        tmpspec[:, 0] * 0.03) / self.effhe / tmpspec[:, 0]
                    il2 = where(tmpspec[:, 1] == amax(tmpspec[:, 1]))[0]
                    if (il2[0] > 0 and il2[0] < tmpspec[:, 1].shape[0] - 1):
                        maxvhe = sum(
                            tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 0] *
                            tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 1]
                        ) / sum(tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 1])
                    else:
                        maxvhe = tmpspec[il2[0], 0]
                    meanvhe = sum(tmpspec[:, 0] * tmpspec[:, 1]) / sum(
                        tmpspec[:, 1])
                    tmphevel = (tmpspec[:, 0] - maxvhe) / self.valf[step]
                    tmphects = (tmpspec[:, 1]) / sum(tmpspec[:, 1])
                    maskhe = (tmphevel >= -3.) * (tmphevel <= 3.)
                    stdhe = sqrt(sum((tmphevel[maskhe]**2) * tmphects[maskhe]))
                    skewhe = (sum(
                        (tmphevel[maskhe]**3) * tmphects[maskhe])) / stdhe**3.
                    kurthe = (sum(
                        (tmphevel[maskhe]**4) * tmphects[maskhe])) / stdhe**4.
                    self.stdhe.append(stdhe)
                    self.skewhe.append(skewhe)
                    self.kurthe.append(kurthe)
                    self.meanvhe.append(meanvhe)
                    self.maxvhe.append(maxvhe)
                else:
                    self.stdhe.append(-999.)
                    self.skewhe.append(-999.)
                    self.kurthe.append(-999.)
                    self.meanvhe.append(-999.)
                    self.maxvhe.append(-999.)

                # O6+
                if (where(self.odata.countspec[step, :, 1] > 0.)[0].shape[0] >=
                        3):
                    tmpspec = 1. * self.odata.countspec[step]
                    tmpspec[:, 1] = tmpspec[:, 1] / (
                        tmpspec[:, 0] * 0.03) / self.effo / tmpspec[:, 0]
                    il2 = where(tmpspec[:, 1] == amax(tmpspec[:, 1]))[0]
                    if (il2[0] > 0 and il2[0] < tmpspec[:, 1].shape[0] - 1):
                        maxvo = sum(
                            tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 0] *
                            tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 1]
                        ) / sum(tmpspec[[il2[0] - 1, il2[0], il2[0] + 1], 1])
                    else:
                        maxvo = tmpspec[il2[0], 0]
                    meanvo = sum(tmpspec[:, 0] * tmpspec[:, 1]) / sum(
                        tmpspec[:, 1])
                    tmpovel = (tmpspec[:, 0] - maxvo) / self.valf[step]
                    tmpocts = (tmpspec[:, 1]) / sum(tmpspec[:, 1])
                    masko = (tmpovel >= -3.) * (tmpovel <= 3.)
                    stdo = sqrt(sum((tmpovel[masko]**2) * tmpocts[masko]))
                    skewo = (sum(
                        (tmpovel[masko]**3) * tmpocts[masko])) / stdo**3.
                    kurto = (sum(
                        (tmpovel[masko]**4) * tmpocts[masko])) / stdo**4.
                    self.stdo.append(stdo)
                    self.skewo.append(skewo)
                    self.kurto.append(kurto)
                    self.meanvo.append(meanvo)
                    self.maxvo.append(maxvo)
                else:
                    self.stdo.append(-999.)
                    self.skewo.append(-999.)
                    self.kurto.append(-999.)
                    self.meanvo.append(-999.)
                    self.maxvo.append(-999.)

        self.stdhe = array(self.stdhe)
        self.stdh = array(self.stdh)
        self.stdo = array(self.stdo)
        self.skewhe = array(self.skewhe)
        self.skewh = array(self.skewh)
        self.skewo = array(self.skewo)
        self.kurthe = array(self.kurthe)
        self.kurth = array(self.kurth)
        self.kurto = array(self.kurto)
        self.meanvhe = array(self.meanvhe)
        self.meanvh = array(self.meanvh)
        self.meanvo = array(self.meanvo)
        self.maxvhe = array(self.maxvhe)
        self.maxvh = array(self.maxvh)
        self.maxvo = array(self.maxvo)
        self.time = array(self.time)
        self.years = array(self.years)
        self.valfs = array(self.valfs)
        self.magb = array(self.magb)
        self.thetas = array(self.thetas)
        self.sigtheta = array(self.sigtheta)
        self.vsw = array(self.vsw)
        self.dsw = array(self.dsw)
        self.tsw = array(self.tsw)
        return

    def plot_vdist(self, thetalist=[[0., pi / 18.], [pi - pi / 18., pi]]):
        thetamask = (self.theta >= thetalist[0][0]) * (self.theta <=
                                                       thetalist[0][1])
        if len(thetalist) > 1:
            for val in thetalist[1:]:
                thetamask += (self.theta >= val[0]) * (self.theta <= val[1])
        print where(thetamask)
        for i in where(thetamask)[0]:
            self.plot_step(i)

    def plot_step(self, step):
        if self.valf[step] > 0.:
            self.gp("unset label")
            self.gp("set label 'v_{sw}=%f' at -1.5,0.95" %
                    (self.swedata.vel[step]))
            self.gp("set label 'C_{A}=%f' at -1.5,0.90" % (self.valf[step]))
            self.gp("set label '{/Symbol= Q}=%f' at -1.5,0.85" %
                    (self.theta[step] / pi * 180.))
            self.gp("set label '{/Symbol= dQ}=%f' at -1.5,0.8" %
                    (self.mag.sigTHETA[step] / pi * 180.))
            self.gp("set title '%.4i DoY %f'" %
                    (self.year, self.hedata.time[step]))
            if amax(self.hedata.countspec[step, :, 1]) > 0.:
                self.gp.plot(
                    Data((self.hedata.countspec[step, :, 0] -
                          self.swedata.vel[step]) / self.valf[step],
                         self.hedata.countspec[step, :, 1] /
                         amax(self.hedata.countspec[step, :, 1]),
                         with_="lp lt 3 lw 3",
                         title="He^{2+}"))
            if amax(self.odata.countspec[step, :, 1]) > 0.:
                self.gp.replot(
                    Data((self.odata.countspec[step, :, 0] -
                          self.swedata.vel[step]) / self.valf[step],
                         self.odata.countspec[step, :, 1] /
                         amax(self.odata.countspec[step, :, 1]),
                         with_="lp lt 4 lw 3",
                         title="O^{6+}"))
            il = where(self.hdata.time == self.hedata.time[step])[0]
            if il.shape[0] > 0 and amax(self.hdata.tcrspec[il[0], :] +
                                        self.hdata.dcrspec[il[0], :]) > 0.:
                self.gp.replot(
                    Data((self.hdata.velspec - self.swedata.vel[step]) /
                         self.valf[step],
                         (self.hdata.tcrspec[il[0], :] +
                          self.hdata.dcrspec[il[0], :]) /
                         amax(self.hdata.tcrspec[il[0], :] +
                              self.hdata.dcrspec[il[0], :]),
                         with_="lp lt 1 lw 3",
                         title="H^{1+}"))

            self.gp.hardcopy("vdistperp_%.4i_%.3i.%.6i.ps" %
                             (self.year, int(self.hedata.time[step]),
                              int((self.hedata.time[step] % 1) * 1e6)),
                             color=True)
            self.gp.sync()