hybrid/lineout.py
# ---------------------------------------------------------------------------- 
#  CLASSES: nightly
#
#  Test Case:  lineout.py #
#  Tests:      plots     - Curve
#              operators - Lineout
#
#  Defect ID:  none
#
#  Programmer: Brad Whitlock
#  Date:       Fri Jan 3 14:22:41 PST 2003
#
#  Modifications:
#    Kathleen Bonnell, Mon Mar 17 09:54:14 PST 2003
#    Added TestMultiVarLineout2D.
#
#    Kathleen Bonnell, Tue Dec 23 09:29:29 PST 2003 
#    Added TestSAMRAI.
#
#    Kathleen Bonnell, Thu Jul 29 11:59:35 PDT 2004 
#    Added tests for no-sampling version, renamed old Curve* tests to
#    indicate they were generated with-sampling. 
#
#    Kathleen Bonnell, Thu Aug  5 10:44:22 PDT 2004 
#    Added calls to ResetPickLetter() and ResetLineoutColor() at the end of
#    each test, so that failure on any one test won't necessarily affect the
#    tests that follow. 
#
#    Kathleen Bonnell, Wed Nov 24 11:38:55 PST 2004 
#    Modified the way that sampling gets turned on due to changes in Lineout
#    Attributes and GlobalLineoutAttributes.  Use global version to turn
#    sampling on and off. 
#
#    Kathleen Bonnell, Fri Feb  4 11:17:56 PST 2005 
#    Added TestDynamic, to test new global atts: curveOption and colorOption.
#
#    Hank Childs, Wed Feb 16 07:34:07 PST 2005
#    Rename variables that have unsupported characters.
#
#    Kathleen Bonnell, Wed Mar 23 17:58:20 PST 2005 
#    Added TestDynamic2. 
#
#    Kathleen Bonnell, hu May 19 11:26:39 PDT 2005 
#    Added TestTecPlot. 
#
#    Jeremy Meredith, Wed Sep  7 12:06:04 PDT 2005
#    Allowed spaces in variable names.
#
#    Kathleen Bonnell, Tue Jun 20 16:02:38 PDT 2006
#    Added tests for GetOutputArray to Lineout2D.
#
#    Kathleen Bonnell, Wed Jun 28 15:57:58 PDT 2006
#    Added tests to TestDynamicLineout, testing having curves from  different
#    time-varying databases (same originating window and different originating
#    window) in same curve window, and update the curves via the originating
#    plots time-slider (bug '7002).
#
#    Brad Whitlock, Wed Jan 14 16:12:10 PST 2009
#    I changed the call to GetOutputArray. It's no longer a built-in function
#    in the CLI.
#
#    Mark C. Miller, Wed Jan 20 07:37:11 PST 2010
#    Added ability to swtich between Silo's HDF5 and PDB data.
#
#    Cyrus Harrison, Thu Mar 25 09:57:34 PDT 2010
#    Added call(s) to DrawPlots() b/c of changes to the default plot state
#    behavior when an operator is added.
#
#    Brad Whitlock, Tue Mar 26 12:06:51 PDT 2013
#    I added TestOperatorCreatedVariables.
#
#    Kathleen Biagas, Wed Feb 24 10:11:35 PST 2021
#    Remove setting of Pseudocolor colorTableName name to 'Default', as
#    that is now the default anyways.
#    Reset default continuous color table to 'hot' after a test that changes
#    it is finished, so that other tests aren't affected.
#
#    Justin Privitera, Wed May 18 11:25:46 PDT 2022
#    Changed *active* to *default* for everything related to color tables.
# 
# ----------------------------------------------------------------------------

def GetOutputArray(plotID = -1, winID = -1):
    gInfo = GetGlobalAttributes()
    oldWin = gInfo.windows[gInfo.activeWindow]
    # Set the active window
    if winID != -1:
        SetActiveWindow(winID)

    # Get the active plots
    active = []
    if plotID != -1:
        pL = GetPlotList()
        for i in range(pL.GetNumPlots()):
            if pL.GetPlots(i).activeFlag:
                active = active + [i]
        SetActivePlots(plotID)

    pInfo = GetPlotInformation()

    # Restore the old active plots
    if len(active) > 0:
        SetActivePlots(tuple(active))

    # Restore the old active window
    if winID != -1:
        SetActiveWindow(oldWin)

    return pInfo["Curve"]

def InitAnnotation():
    a = AnnotationAttributes()
    TurnOffAllAnnotations(a)
    a.axes2D.visible = 1
    a.axes2D.xAxis.label.visible = 0
    a.axes2D.yAxis.label.visible = 0
    a.axes2D.xAxis.title.visible = 0
    a.axes2D.yAxis.title.visible = 0
    SetAnnotationAttributes(a)

def TestLineout2D(time, suffix):
    OpenDatabase(silo_data_path("curv2d.silo"))

    AddPlot("Pseudocolor", "d")
    DrawPlots()

    # Set the colortable to one that has white at the bottom values.
    SetDefaultContinuousColorTable("calewhite")

    # Create the variable list.
    vars = ("default")

    # Do some lineouts.
    p0 = (-4.01261, 1.91818)
    p1 = (-0.693968, 4.448759)
    p2 = (4.144392, 1.713066)
    nsteps = 15
    for i in range(nsteps):
        t = float(i) / float(nsteps - 1)
        p3x = t * p2[0] + (1. - t) * p1[0]
        p3y = t * p2[1] + (1. - t) * p1[1]
        SetActiveWindow(1)
        Lineout(p0, (p3x, p3y), vars)

    if (time == 1):
        SetActiveWindow(1)
        Test("Lineout2d")

    if (time == 2):
        SetActiveWindow(1)
        oa = GetOutputArray(4, 2)
        s = ''.join(['%f, '% x for x in oa])
        s = '(' + s + ')'
        TestText("Lineout2d_output_04", s)
        oa = GetOutputArray(8, 2)
        s = ''.join(['%f, '% x for x in oa])
        s = '(' + s + ')'
        TestText("Lineout2d_output_08", s)

    SetActiveWindow(2)

    InitAnnotation()
    Test("CurvesFrom2d" + suffix)

    if (time == 2):
        oa = GetOutputArray(2)
        s = ''.join(['%f, '% x for x in oa])
        s = '(' + s + ')'
        TestText("Lineout2d_output_02", s)
        oa = GetOutputArray()
        s = ''.join(['%f, '% x for x in oa])
        s = '(' + s + ')'
        TestText("Lineout2d_output_15", s)

    # Reset the CT to 'hot'
    SetDefaultContinuousColorTable("hot")
    # Delete the second window.
    DeleteWindow()
    DeleteAllPlots()
    ResetPickLetter()
    ResetLineoutColor()

def TestLineout3D(time, suffix):
    OpenDatabase(silo_data_path("noise.silo"))

    AddPlot("Pseudocolor", "hardyglobal")
    DrawPlots()

    # Set the view
    v = View3DAttributes()
    v.viewNormal = (-0.65577, 0.350079, 0.668888)
    v.focus = (0, 0, 0)
    v.viewUp = (0.218553, 0.936082, -0.275655)
    v.viewAngle = 30
    v.parallelScale = 17.3205
    v.nearPlane = -34.641
    v.farPlane = 34.641
    v.perspective = 1
    SetView3D(v)

    # Do some lineouts
    vars = ("default")
    p0 = (-10., -10., -10.)
    P  = ((-10., -10., 10.), (-10., 10., -10.), (-10., 10., 10.),\
(10., -10., -10.), (10., -10., 10.), (10., 10., -10.), (10., 10., 10.))
    for p in P:
        SetActiveWindow(1)
        Lineout(p0, p, vars)

    if (time == 1):
        SetActiveWindow(1)
        pc = PseudocolorAttributes()
        pc.colorTableName = "xray"
        pc.SetOpacityType(pc.Constant)
        pc.opacity = 0.5
        SetPlotOptions(pc)
        Test("Lineout3d")

    SetActiveWindow(2)
    InitAnnotation()
    Test("CurvesFrom3d" + suffix)

    # Delete the second window.
    DeleteWindow()
    DeleteAllPlots()
    ResetPickLetter()
    ResetLineoutColor()

def TestMultiVarLineout2D(time, suffix):
    OpenDatabase(silo_data_path("curv2d.silo"))

    AddPlot("Pseudocolor", "d")
    DrawPlots()

    # Do some lineouts
    vars = ("p", "u", "v")
    Y = (2, 3, 4)
    x1 = -4.5
    x2 = 4.5
    for y in Y:
        SetActiveWindow(1)
        Lineout((x1, y), (x2, y), vars)

    if (time == 1):
        SetActiveWindow(1)
        Test("MultiVarLineout2d")

    SetActiveWindow(2)
    InitAnnotation()
    Test("MultiVarCurvesFrom2d" + suffix)
    DeleteWindow()
    DeleteAllPlots()

    ResetPickLetter()
    ResetLineoutColor()

def TestSAMRAI(time, suffix):
    OpenDatabase(data_path("samrai_test_data/sil_changes/dumps.visit"))

    AddPlot("Pseudocolor", "Primitive Var _number_0")
    DrawPlots()

    # Set the colortable to one that has white at the bottom values.
    SetDefaultContinuousColorTable("rainbow")

    AddOperator("Slice", 1)
    slice = SliceAttributes()
    slice.originType = slice.Percent
    slice.originPercent = 18
    slice.axisType = slice.ZAxis
    slice.project2d = 1
    SetOperatorOptions(slice, 0, 1)
    DrawPlots()
    ResetView()

    SetTimeSliderState(1)

    #Do some lineouts
    p0 = (3, 3)
    p1 = (0, 20)
    p2 = (30, 0)
    nsteps = 15
    for i in range(nsteps):
        t = float(i) / float(nsteps - 1)
        p3x = t * p2[0] + (1. - t) * p1[0]
        p3y = t * p2[1] + (1. - t) * p1[1]
        SetActiveWindow(1)
        Lineout(p0, (p3x, p3y))

    if (time == 1):
        SetActiveWindow(1)
        Test("LineoutSAMRAI")

    SetActiveWindow(2)
    InitAnnotation()
    Test("CurvesFromSAMRAI" + suffix)
    DeleteWindow()
    DeleteAllPlots()

    ResetPickLetter()
    ResetLineoutColor()
    SetDefaultContinuousColorTable("hot")

def TestSpecifyLineoutWindow(time, suffix):
    #window 1
    OpenDatabase(data_path("pdb_test_data/dbA00.pdb"))

    AddPlot("Pseudocolor", "mesh/ireg")
    DrawPlots()
    ResetView()

    Lineout((0, 2.5), (5, 2.5))

    if (time == 1):
        SetActiveWindow(1)
        InitAnnotation()
        Test("LineoutSpecifyWindow_01")

    SetActiveWindow(2)
    InitAnnotation()
    Test("CurvesFromSpecifyWindow_01" + suffix)

    SetActiveWindow(1)
    CloneWindow()
    #window 3
    SetTimeSliderState(4)
    DrawPlots()


    gla = GetGlobalLineoutAttributes()
    gla.createWindow = 0
    gla.windowId = 4
    SetGlobalLineoutAttributes(gla)

    Lineout((0, 2.5), (5, 2.5))

    if (time == 1):
        SetActiveWindow(3)
        InitAnnotation()
        Test("LineoutSpecifyWindow_02")

    SetActiveWindow(4)
    InitAnnotation()
    Test("CurvesFromSpecifyWindow_02" + suffix)

    DeleteWindow()
    SetActiveWindow(3)
    DeleteWindow()
    SetActiveWindow(2)
    DeleteWindow()
    DeleteAllPlots()
    gla.createWindow = 1
    gla.windowId = 2
    SetGlobalLineoutAttributes(gla)

    ResetPickLetter()
    ResetLineoutColor()

def TestDynamicLineout(time, suffix):
    if (time == 1):
        return
    #window 1
    OpenDatabase(silo_data_path("wave.visit"))

    AddPlot("Pseudocolor", "pressure")
    DrawPlots()
    ResetView()

    Lineout((0, 0.5, 2.5), (10, 0.5, 2.5))

    gla = GetGlobalLineoutAttributes()
    gla.Dynamic = 1
    gla.curveOption = gla.UpdateCurve
    SetGlobalLineoutAttributes(gla)

    SetActiveWindow(1)
    t = 0
    for i in range (10):
        t += 5
        SetTimeSliderState(t)

    SetActiveWindow(2)
    InitAnnotation()
    ResetView()
    Test("CurvesFromDynamic_01")

    # go back to the beginning time state
    # and have new curves created for each new time 
    SetActiveWindow(1)
    t = 0
    SetTimeSliderState(t)

    gla.curveOption = gla.CreateCurve
    SetGlobalLineoutAttributes(gla)
    for i in range (7):
        t += 5
        SetTimeSliderState(t)

    # now have each new curve have its own color.
    gla.colorOption = gla.CreateColor
    SetGlobalLineoutAttributes(gla)
    for i in range (7):
        t += 5
        SetTimeSliderState(t)

    SetActiveWindow(2)
    InitAnnotation()
    ResetView()
    Test("CurvesFromDynamic_02")

    ResetPickLetter()
    ResetLineoutColor()
    # delete window 2
    DeleteWindow()
    # clear all plots from window 1
    DeleteAllPlots()

    dbs = (data_path("pdb_test_data/dbA00.pdb"),
           data_path("pdb_test_data/dbB00.pdb"),
           data_path("pdb_test_data/dbC00.pdb"))
    OpenDatabase(dbs[0])
    AddPlot("Pseudocolor", "mesh/ireg")
    OpenDatabase(dbs[1])
    AddPlot("Pseudocolor", "mesh/ireg")
    DrawPlots()

    AddWindow()
    SetActiveWindow(2)
    DeleteAllPlots()
    OpenDatabase(dbs[2])
    AddPlot("Pseudocolor", "mesh/ireg")
    DrawPlots()

    gla.Dynamic = 1
    gla.curveOption = gla.UpdateCurve
    SetGlobalLineoutAttributes(gla)

    #Lineout for dbC00.pdb in window 2
    Lineout((5.0, 7.5, 0.), (10, 7.5, 0.))

    SetActiveWindow(1)
    SetActivePlots(1)

    #Lineout for dbB00.pdb in window 1
    Lineout((0, 8, 0), (5, 8, 0))

    SetActivePlots(0)
    #Lineout for dbA00.pdb in window 1
    Lineout((0, 3, 0), (5, 3, 0))


    SetActiveWindow(3)
    InitAnnotation()
    Test("CurvesFromDynamic_03")

    SetActiveWindow(1)
    SetActiveTimeSlider(dbs[1])
    SetTimeSliderState(15)

    SetActiveWindow(3)
    Test("CurvesFromDynamic_04")

    SetActiveWindow(1)
    SetActiveTimeSlider(dbs[0])
    SetTimeSliderState(3)


    SetActiveWindow(3)
    Test("CurvesFromDynamic_05")

    SetActiveWindow(2)
    SetTimeSliderState(29)

    SetActiveWindow(3)
    Test("CurvesFromDynamic_06")

    ResetLineoutColor()
    ResetPickLetter()
    # delete window 3
    DeleteWindow()
    # delete window 2
    SetActiveWindow(2)
    DeleteWindow()
    # clear all plots from window 1
    DeleteAllPlots()

def TestDynamic2():
    # VisIt00006006 -- ensure  that 'ClearRefLines' will 'disconnect' the lineout 
    # from its originating plot, and won't update when orig plot changes time.
    OpenDatabase(silo_data_path("wave.visit"))

    AddPlot("Pseudocolor", "pressure")
    DrawPlots()
    ResetView()
    SetTimeSliderState(0)
    Lineout((0, 0.5, 2.5), (10, 0.5, 2.5))

    SetActiveWindow(2)
    InitAnnotation()
    Test("Dynamic2_01")

    SetActiveWindow(1)
    gla = GetGlobalLineoutAttributes()
    gla.Dynamic = 1
    gla.curveOption = gla.UpdateCurve
    SetGlobalLineoutAttributes(gla)

    SetTimeSliderState(27)

    SetActiveWindow(2)
    Test("Dynamic2_02")

    SetActiveWindow(1)
    gla.Dynamic = 0
    SetGlobalLineoutAttributes(gla)

    SetTimeSliderState(52)

    SetActiveWindow(2)
    Test("Dynamic2_03")

    ResetPickLetter()
    ResetLineoutColor()
    DeleteWindow()
    DeleteAllPlots()


def TestTecPlot():
    # VisIt00006243 -- curve generated from Lineout looks reversed in X
    OpenDatabase(data_path("tecplot_test_data/T3L3CLS17u.plt"))

    AddPlot("Mesh", "mesh")
    AddPlot("Pseudocolor", "k")
    DrawPlots()
    ResetView()

    v = GetView2D()
    v.windowCoords = (0.340063, 0.340868, 0.00512584, 0.00572613 )
    SetView2D(v)

    Lineout((0.340505, 0.00565604, 0), (0.340291, 0.00514717, 0))

    InitAnnotation()
    Test("LineoutTecPlot_01")

    SetActiveWindow(2)
    InitAnnotation()
    Test("CurvesFromTecPlot_01")

    ResetPickLetter()
    ResetLineoutColor()
    # delete window 2
    DeleteWindow()
    # remove plots from window 1
    DeleteAllPlots()

def TestOperatorCreatedVariables():
    def SetCurveAtts():
        c = CurveAttributes(1)
        c.lineWidth = 2
        c.curveColor = (255,0,0,255)
        c.curveColorSource = c.Custom
        c.showLabels = 0
        SetPlotOptions(c)

    TestSection("Operator-Created Variables")
    OpenDatabase(silo_data_path("noise.silo"))

    # Do lineout on a data binning variable.
    AddPlot("Pseudocolor", "operators/DataBinning/2D/Mesh", 1, 1)
    DataBinningAtts = DataBinningAttributes()
    DataBinningAtts.numDimensions = DataBinningAtts.Two  # One, Two, Three
    DataBinningAtts.dim1BinBasedOn = DataBinningAtts.X  # X, Y, Z, Variable
    DataBinningAtts.dim1Var = "default"
    DataBinningAtts.dim1SpecifyRange = 0
    DataBinningAtts.dim1MinRange = 0
    DataBinningAtts.dim1MaxRange = 1
    DataBinningAtts.dim1NumBins = 50
    DataBinningAtts.dim2BinBasedOn = DataBinningAtts.Y  # X, Y, Z, Variable
    DataBinningAtts.dim2Var = "default"
    DataBinningAtts.dim2SpecifyRange = 0
    DataBinningAtts.dim2MinRange = 0
    DataBinningAtts.dim2MaxRange = 1
    DataBinningAtts.dim2NumBins = 50
    DataBinningAtts.dim3BinBasedOn = DataBinningAtts.Variable  # X, Y, Z, Variable
    DataBinningAtts.dim3Var = "default"
    DataBinningAtts.dim3SpecifyRange = 0
    DataBinningAtts.dim3MinRange = 0
    DataBinningAtts.dim3MaxRange = 1
    DataBinningAtts.dim3NumBins = 50
    DataBinningAtts.outOfBoundsBehavior = DataBinningAtts.Clamp  # Clamp, Discard
    DataBinningAtts.reductionOperator = DataBinningAtts.Maximum  # Average, Minimum, Maximum, StandardDeviation, Variance, Sum, Count, RMS, PDF
    DataBinningAtts.varForReduction = "hardyglobal"
    DataBinningAtts.emptyVal = 0
    DataBinningAtts.outputType = DataBinningAtts.OutputOnBins  # OutputOnBins, OutputOnInputMesh
    DataBinningAtts.removeEmptyValFromCurve = 1
    SetOperatorOptions(DataBinningAtts, 1)
    DrawPlots()
    Lineout((9, 9), (4.5, -9))
    SetActiveWindow(1)
    ResetView()
    Test("lineout_op_vars_00")
    SetActiveWindow(2)
    InitAnnotation()
    ResetView()
    SetCurveAtts()
    Test("lineout_op_vars_01")

    # delete window 2
    DeleteWindow()
    # remove plots from window 1
    DeleteAllPlots()

    # Do lineout on a data binning variable that had other operators
    OpenDatabase(silo_data_path("noise.silo"))
    AddPlot("Pseudocolor", "operators/DataBinning/2D/Mesh", 1, 1)
    SetOperatorOptions(DataBinningAtts, 1)
    AddOperator("Transform")
    AddOperator("Project")
    DrawPlots()
    Lineout((9, 9), (4.5, -9))
    SetActiveWindow(2)
    InitAnnotation()
    SetCurveAtts()
    Test("lineout_op_vars_02")

    # delete window 2
    DeleteWindow()
    # remove plots from window 1
    DeleteAllPlots()


def DoTests(t,s):
    TestLineout2D(t,s)
    TestLineout3D(t,s)
    TestMultiVarLineout2D(t,s)
    TestSAMRAI(t,s)
    TestSpecifyLineoutWindow(t,s)
    TestDynamicLineout(t,s)

def LineoutMain():
    InitAnnotation()
    la = GetGlobalLineoutAttributes()
    la.samplingOn = 1
    SetGlobalLineoutAttributes(la)

    DoTests(1, "_withSampling")

    la.samplingOn = 0
    SetGlobalLineoutAttributes(la)

    DoTests(2, "_noSampling")

    TestDynamic2()
    TestTecPlot()
    TestOperatorCreatedVariables()

# Call the main function
LineoutMain()
Exit()