docs: def get_secondary_strain_data(self, strain_data=None):
          '''
          Calculate the following and add to data dictionary:
          1) 2nd invarient of strain
          2) Dilatation rate
          3) e1h and e2h
          4) err
  
          :param dict strain_data:
              Strain data dictionary (as described) - will overwrite current
              data if input
  
          '''
          if strain_data:
              self.data = strain_data
  
          if not isinstance(self.data, dict):
              raise ValueError('Strain data not input or incorrectly formatted')
  
          # Check to ensure essential attributes are in data dictionary
          for essential_key in DATA_VARIABLES:
              if essential_key not in self.data:
                  print(self.data)
                  raise ValueError('Essential strain information %s missing!'
                                   % essential_key)
          self.data_variables = deepcopy(DATA_VARIABLES)
  
          # Second Invarient
          self.data['2nd_inv'] = np.sqrt(
              (self.data['exx'] ** 2.) +
              (self.data['eyy'] ** 2.) +
              2.0 * (self.data['exy'] ** 2.))
          # Dilatation
          self.data['dilatation'] = self.data['exx'] + self.data['eyy']
          # err
          self.data['err'] = -1. * self.data['dilatation']
          center_normal_rate = (self.data['exx'] +
                                self.data['eyy']) / 2.
          radius_rate = np.sqrt((self.data['exx'] -
                                 center_normal_rate) ** 2. +
                                (self.data['exy'] ** 2.))
          # e1h and e2h
          self.data['e1h'] = center_normal_rate - radius_rate
          self.data['e2h'] = center_normal_rate + radius_rate
          self.data['area'] = np.zeros(self.get_number_observations())
          self.data_variables.extend(['2nd_inv', 'dilatation', 'err', 'e1h',
                                      'e2h'])