code: def need_data(self, i):
          
  
          # If we are not caching, we always grab data from the raw source
          if self.caching is False:
              return False
  
          logger.debug("Checking cache for data availability at %s." % self.part.location.logstring())
  
          try:
              # Tell the DataController that we are going to be reading from the file
              with self.read_lock:
                  self.read_count.value += 1
                  self.has_read_lock.append(os.getpid())
  
              self.dataset.opennc()
              # Test if the cache has the data we need
              # If the point we request contains fill values,
              # we need data
              cached_lookup = self.dataset.get_values('domain', timeinds=[np.asarray([i])], point=self.part.location)
              logger.debug("Type of result: %s" % type(cached_lookup))
              logger.debug("Double mean of result: %s" % np.mean(np.mean(cached_lookup)))
              logger.debug("Type of Double mean of result: %s" % type(np.mean(np.mean(cached_lookup))))
              if type(np.mean(np.mean(cached_lookup))) == np.ma.core.MaskedConstant:
                  need = True
                  logger.debug("I NEED data.  Got back: %s" % cached_lookup)
              else:
                  need = False
                  logger.debug("I DO NOT NEED data")
          except StandardError:
              # If the time index doesnt even exist, we need
              need = True
              logger.debug("I NEED data (no time index exists in cache)")
          finally:
              self.dataset.closenc()
              with self.read_lock:
                  self.read_count.value -= 1
                  self.has_read_lock.remove(os.getpid())
  
          return need
docs: Method to test if cache contains the data that
              the particle needs