# -*- coding: UTF-8 no BOM -*-

import numpy as np

try:
  import h5py
except (ImportError) as e:
  pass #  sys.stderr.write('\nREMARK: h5py module not available \n\n')

class Result():
  """
  General class for result parsing.

  Needs h5py to be installed
  """
  
  def __init__(self,resultsFile):
    self.data=h5py.File(resultsFile,"r")
    self.Npoints=self.data.attrs['Number of Materialpoints']
    print("Opened {} with {} points".format(resultsFile,self.Npoints))

  def getCrystallite(self,labels,inc,constituent=1,points=None):
    if points is None: points = np.array(np.array(range(self.Npoints)))
    results = {}
    mapping=self.data['mapping/crystallite']
    for instance in self.data['increments/%s/crystallite/'%inc]:
      dsets = list(self.data['increments/%s/crystallite/%s'%(inc,instance)].keys())
      for label in labels:
        if label in dsets and label not in results:
          shape = np.shape(self.data['increments/%s/crystallite/%s/%s'%(inc,instance,label)])[1:]
          results[label] = np.nan*np.ones(np.array((self.Npoints,)+shape))
    for myPoint in range(len(points)):
      matPoint = points[myPoint]
      pos = mapping[matPoint,constituent-1]
      if pos[0] != 0:
        try:
          for label in labels:
            results[label][matPoint,...] = self.data['increments/%s/crystallite/%s/%s'%(inc,pos[0],label)][pos[1],...]
        except:
          pass
    return results
