
try: paraview.simple
except: from paraview.simple import *

import os

from subprocess import *

in_filename = "./track3p_results/OUTPUT/resonantparticles"
#in_filename = "./track3p_3T/OUTPUT/resonantparticles"
#in_filename = "./track3p_MagField/OUTPUT/resonantparticles"
print("in_filename: ", in_filename)


########################################

def get_resonant_data(filename):
  try:
    ifile = open(filename, 'r')
  except:
    print ("error: unable to open file", filename, "for reading.")
    return

  resonant_out = CSVReader(FileName=filename,
                          FieldDelimiterCharacters = ' ',
                          MergeConsecutiveDelimiters = 1,
                          HaveHeaders = 1)

  # this is necessary!  blank objects otherwise...
  resonant_out.UpdatePipeline()

  return (resonant_out)

def show_impact_time(resonant_out):

  ######################################

  lineChartView1 = CreateView('XYChartView')
  lineChartView1.ViewTime=0.0
  lineChartView1.ChartTitle = 'Total Time vs. Field Gradient'
  lineChartView1.LeftAxisTitle = 'Total Time in RF Cycle'
  lineChartView1.BottomAxisTitle = 'Field Gradient'


  ######################################
  pf1 = ProgrammableFilter(registrationName='ProgrammableFilter1', Input=resonant_out)
  pf1.OutputDataSetType = 'vtkTable'
  pf1.CopyArrays = 0
  pf1.RequestUpdateExtentScript = ''
  pf1.PythonPath = ''
  pf1.RequestInformationScript = ''
  pf1.Script = \
"""\
import math
import numpy

try:
  import warnings
  warnings.simplefilter("ignore", numpy.ComplexWarning)
except:
  pass

input = self.GetInput()

s1 = input.GetColumn(0)
e1 = input.GetColumn(9)

n1 = s1.GetNumberOfTuples()
scale = 1.0/1.0e7

# Field
col_s = vtk.vtkDoubleArray()
col_s.SetName("Field")
col_s.SetNumberOfTuples(n1)
for i in range(n1):
  col_s.SetValue(i, scale * s1.GetValue(i))

# Time
col_e = vtk.vtkDoubleArray()
col_e.SetName("Time")
col_e.SetNumberOfTuples(n1)
for i in range(n1):
  col_e.SetValue(i, e1.GetValue(i))



####################
# populate the graph

output = self.GetOutputDataObject(0)
output.AddColumn(col_s)
output.AddColumn(col_e)
"""

  pd1 = PlotData(registrationName='PlotData1', Input=pf1)
  #######################################

  pr1 = GetDisplayProperties(pd1)
  pr1.Visibility = 0
  pr1.UseIndexForXAxis = 0
  pr1.XArrayName = 'Field'
  pr1.AttributeType = 'Row Data'
  pr1.SeriesVisibility = ['Time', '1']
  pr1.SeriesLineStyle = ['Time', '0']
  pr1.SeriesMarkerStyle = ['Time', '1']

  pr1.SeriesColor = ['Field',                  '0.0', '1.0', '0.0', \
                     'Time',                  '1.0', '0.0', '0.0', \
                     'vtkOriginalIndices', '0.0', '0.0', '0.0']

  pr1.Visibility = 1
  Show(pd1, lineChartView1, 'XYChartRepresentation')
  return lineChartView1


def show_impact_energy(resonant_out):

  ######################################

  lineChartView2 = CreateView('XYChartView')
  lineChartView2.ViewTime=0.0
  lineChartView2.ChartTitle = 'Impact Energy vs. Field Gradient'
  lineChartView2.LeftAxisTitle = 'Impact Energy [eV]'
  lineChartView2.BottomAxisTitle = 'Field Gradient'


  ######################################
  pf2 = ProgrammableFilter(registrationName='ProgrammableFilter2', Input=resonant_out)
  pf2.OutputDataSetType = 'vtkTable'
  pf2.CopyArrays = 0
  pf2.RequestUpdateExtentScript = ''
  pf2.PythonPath = ''
  pf2.RequestInformationScript = ''
  pf2.Script = \
"""\
import math
import numpy

try:
  import warnings
  warnings.simplefilter("ignore", numpy.ComplexWarning)
except:
  pass

input = self.GetInput()

s1 = input.GetColumn(0)
e1 = input.GetColumn(5)

n1 = s1.GetNumberOfTuples()
scale = 1.0/1.0e7

# Field
col_s = vtk.vtkDoubleArray()
col_s.SetName("Field")
col_s.SetNumberOfTuples(n1)
for i in range(n1):
  col_s.SetValue(i, scale * s1.GetValue(i))

# Time
col_e = vtk.vtkDoubleArray()
col_e.SetName("Energy")
col_e.SetNumberOfTuples(n1)
for i in range(n1):
  col_e.SetValue(i, e1.GetValue(i))



####################
# populate the graph

output = self.GetOutputDataObject(0)
output.AddColumn(col_s)
output.AddColumn(col_e)
"""

  pd2 = PlotData(registrationName='PlotData2', Input=pf2)
  #######################################

  pr2 = GetDisplayProperties(pd2)
  pr2.Visibility = 0
  pr2.UseIndexForXAxis = 0
  pr2.XArrayName = 'Field'
  pr2.AttributeType = 'Row Data'
  pr2.SeriesVisibility = ['Energy', '1']
  pr2.SeriesLineStyle = ['Energy', '0']
  pr2.SeriesMarkerStyle = ['Energy', '1']

  pr2.SeriesColor = ['Field',                  '0.0', '1.0', '0.0', \
                     'Energy',                  '1.0', '0.0', '0.0', \
                     'vtkOriginalIndices', '0.0', '0.0', '0.0']

  pr2.Visibility = 1
  Show(pd2, lineChartView2, 'XYChartRepresentation')
  return lineChartView2

################################################################################

paraview.simple._DisableFirstRenderCameraReset()

SetActiveView(None)

#filename = get_filename()
filename = in_filename 

if filename == "":
  print ("Resonant particles macro cancelled.")
else:
  print("filename:", filename)

resonant_out = get_resonant_data(filename)

# ----------------------------------------------------------------
# setup view layouts
# ----------------------------------------------------------------

lineChartView1 = show_impact_time(resonant_out)
lineChartView2 = show_impact_energy(resonant_out)
layout1 = CreateLayout(name='resonant particles plot')
layout1.SplitVertical(0, 0.500000)
layout1.AssignView(1, lineChartView1)
layout1.AssignView(2, lineChartView2)

# ----------------------------------------------------------------
# restore active view
SetActiveView(lineChartView2)
Render()
