docs: def analyze(self, time: int=None) -> typing.Tuple[float, float, int, int]:
          """
          Determine noise, curvature, range, and domain of specified array.
  
          :param: pixel to inch ratio
          :param: time (column) to use.
  
          :return: curvature
          :return: noise
          :return: range
          :return: domain
          """
          if not time:
              time = int(len(self.times) / 2)
          if self.domains[time] == 0:
              yhat, residuals, mean_residual, error = self._get_fit(time)
              yhat_p = self.ddiff(yhat)
              yhat_pp = self.ddiff(yhat_p)
              noise = self._get_noise(residuals)
              curvature = (1 / self.ratio) * (1 / len(yhat_pp)) * np.sqrt(si.simps(yhat_pp ** 2))
              rng = (self.ratio * (np.max(self.averagedata[:, time]) -
                                   np.min(self.averagedata[:, time])))
              dmn = self.ratio * len(self.averagedata[:, time])
  
              self.noises[time] = np.log10(noise)
              self.curves[time] = np.log10(curvature)
              self.ranges[time] = np.log10(rng)
              self.domains[time] = np.log10(dmn)
          return self.noises[time], self.curves[time], self.ranges[time], self.domains[time]