Commit 92bc2db8 authored by cyrush's avatar cyrush

merge visit_utils.ult changes from 2.7RC

git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@23190 18c085ea-50e0-402c-830e-de6fd14e8384
parent 33829aca
......@@ -76,16 +76,45 @@ Utils for processing ultra curves.
#
# Cyrus Harrison, Wed Mar 7 13:21:23 PST 2012
# Change numpy import style.
#
# Cyrus Harrison, Thu Apr 17 16:04:18 PDT 2014
# Add numpy guards and helper that plots all the curves in a database.
#
#*****************************************************************************
import sys
import math
using_numpy = False
try:
import visit
except:
pass
try:
import numpy as npy
using_numpy = True
except:
pass
from common import VisItException, require_visit
@require_visit
def plot(dbfile=None):
if not dbfile is None:
visit.OpenDatabase(dbfile)
else:
wi = visit.GetWindowInformation()
dbfile = wi.activeSource
md = visit.GetMetaData(dbfile)
ncrvs = md.GetNumCurves()
cnames = [md.GetCurves(i).name for i in xrange(ncrvs)]
cnames.sort()
for cname in cnames:
visit.AddPlot("Curve",cname)
visit.DrawPlots()
class Sample:
"""
Holds a single sample.
......@@ -159,7 +188,7 @@ class Curve(object):
else:
# Check if samples is an ndarray, if so
# convert to a list of Samples.
if isinstance(samples,npy.ndarray):
if using_numpy and isinstance(samples,npy.ndarray):
lshape = len(samples.shape)
if lshape == 1:
r = samples.shape
......@@ -169,7 +198,8 @@ class Curve(object):
samples = [ Sample(samples[i,0],samples[i,1]) for i in xrange(r)]
else:
# error
pass
msg = "Cannot convert ndarry w/ shape %s to Curve " % str(lshape)
raise VisItException(msg)
self.samples = samples
self.__xmap = None
def first(self):
......@@ -216,6 +246,10 @@ class Curve(object):
x_max = max([s.x for s in self.samples])
y_max = max([s.y for s in self.samples])
return [x_min,x_max,y_min,y_max]
def add_sample(self,x,y):
# this invalidates the xmap
self.__xmap = None
return self.samples.append(Sample(x,y))
def get_sample(self,index):
if index <0 or index >= len(self.samples):
return None
......@@ -230,7 +264,9 @@ class Curve(object):
return None
def ndarray(self):
#assumes successful numpy import ...
return npy.array([[s.x,s.y] for s in self.samples])
if using_numpy:
return npy.array([[s.x,s.y] for s in self.samples])
return None
def __get_y(self,x):
"""
Helper to get a y value given x.
......@@ -328,9 +364,12 @@ class Curve(object):
if isinstance(data,Curve):
for v in data.values():
fobj.write("%s %s\n" % (str(v[0]),str(v[1])))
elif isinstance(data,npy.ndarray):
elif using_numpy and isinstance(data,npy.ndarray):
for i in range(data.shape[0]):
fobj.write("%s %s\n" % (str(data[i,0]),str(data[i,1])))
else: # error unknown data type
msg = "Cannot save curve w/ data object of type: %s" % repr(type(data))
raise VisItException(msg)
@classmethod
def load(cls,fname):
"""
......@@ -358,7 +397,8 @@ class Curve(object):
if curr.first() > curr.last():
curr.reverse_samples()
curves.append(curr)
return curves
return curves
......
......@@ -84,7 +84,10 @@ class WindowManager(object):
@classmethod
def registered_windows(cls):
return cls.__windows.values()
@classmethod
def cleanup_windows(cls):
for win in cls.registered_windows():
win.remove()
class Window(object):
@require_visit
......
This diff is collapsed.
#*****************************************************************************
#
# Copyright (c) 2000 - 2013, Lawrence Livermore National Security, LLC
# Produced at the Lawrence Livermore National Laboratory
# LLNL-CODE-442911
# All rights reserved.
#
# This file is part of VisIt. For details, see https://visit.llnl.gov/. The
# full copyright notice is contained in the file COPYRIGHT located at the root
# of the VisIt distribution or at http://www.llnl.gov/visit/copyright.html.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice,
# this list of conditions and the disclaimer below.
# - Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the disclaimer (as noted below) in the
# documentation and/or other materials provided with the distribution.
# - Neither the name of the LLNS/LLNL nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
# LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
#*****************************************************************************
"""
file: test_ult.py
author: Cyrus Harrison (cyrush@llnl.gov)
created: 4/18/2014
description:
Unit tests for curve helpers.
"""
import unittest
import os
import sys
import random
from os.path import join as pjoin
from visit_test import *
from visit_utils import ult
from visit_utils import Window, WindowManager
try:
import visit
except:
pass
db_dir = pjoin(os.path.split(__file__)[0],"_data")
db = pjoin(db_dir,"random.ult")
output_dir = pjoin(os.path.split(__file__)[0],"_output")
class TestUlt(unittest.TestCase):
def test_gen(self):
crvs = []
for i in xrange(10):
crv = ult.Curve(name="random_crv_%03d" % i)
for j in xrange(100):
crv.add_sample(j,random.random() * i)
crvs.append(crv)
self.assertEqual(10,len(crvs))
self.assertEqual(len(crvs[0]),100)
@visit_test
def test_plot_direct(self):
w = Window()
ult.plot(db)
ofile = pjoin(output_dir,"test.ult.plot.direct.render.png")
w.render(obase=ofile,res=[200,200])
self.assertTrue(os.path.isfile(ofile))
WindowManager.cleanup_windows()
visit.DeleteAllPlots()
visit.CloseDatabase(db)
@visit_test
def tearDown(self):
visit.CloseComputeEngine()
if __name__ == "__main__":
unittest.main()
......@@ -78,8 +78,7 @@ class TestWindow(unittest.TestCase):
if not os.path.exists(output_dir):
os.mkdir(output_dir)
def cleanup_windows(self):
for win in WindowManager.registered_windows():
win.remove()
WindowManager.cleanup_windows()
visit.CloseDatabase(db)
visit.CloseComputeEngine()
@visit_test
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment