docs: def find_data(self, subject_ids=None, visit_ids=None, **kwargs):
          """
          Find all data within a repository, registering filesets, fields and
          provenance with the found_fileset, found_field and found_provenance
          methods, respectively
  
          Parameters
          ----------
          subject_ids : list(str)
              List of subject IDs with which to filter the tree with. If
              None all are returned
          visit_ids : list(str)
              List of visit IDs with which to filter the tree with. If
              None all are returned
  
          Returns
          -------
          filesets : list[Fileset]
              All the filesets found in the repository
          fields : list[Field]
              All the fields found in the repository
          records : list[Record]
              The provenance records found in the repository
          """
          all_filesets = []
          all_fields = []
          all_records = []
          for session_path, dirs, files in os.walk(self.root_dir):
              relpath = op.relpath(session_path, self.root_dir)
              path_parts = relpath.split(op.sep) if relpath != '.' else []
              ids = self._extract_ids_from_path(path_parts, dirs, files)
              if ids is None:
                  continue
              subj_id, visit_id, from_study = ids
              # Check for summaries and filtered IDs
              if subj_id == self.SUMMARY_NAME:
                  subj_id = None
              elif subject_ids is not None and subj_id not in subject_ids:
                  continue
              if visit_id == self.SUMMARY_NAME:
                  visit_id = None
              elif visit_ids is not None and visit_id not in visit_ids:
                  continue
              # Map IDs into ID space of study
              subj_id = self.map_subject_id(subj_id)
              visit_id = self.map_visit_id(visit_id)
              # Determine frequency of session|summary
              if (subj_id, visit_id) == (None, None):
                  frequency = 'per_study'
              elif subj_id is None:
                  frequency = 'per_visit'
              elif visit_id is None:
                  frequency = 'per_subject'
              else:
                  frequency = 'per_session'
              filtered_files = self._filter_files(files, session_path)
              for fname in filtered_files:
                  basename = split_extension(fname)[0]
                  all_filesets.append(
                      Fileset.from_path(
                          op.join(session_path, fname),
                          frequency=frequency,
                          subject_id=subj_id, visit_id=visit_id,
                          repository=self,
                          from_study=from_study,
                          potential_aux_files=[
                              f for f in filtered_files
                              if (split_extension(f)[0] == basename and
                                  f != fname)],
                          **kwargs))
              for fname in self._filter_dirs(dirs, session_path):
                  all_filesets.append(
                      Fileset.from_path(
                          op.join(session_path, fname),
                          frequency=frequency,
                          subject_id=subj_id, visit_id=visit_id,
                          repository=self,
                          from_study=from_study,
                          **kwargs))
              if self.FIELDS_FNAME in files:
                  with open(op.join(session_path,
                                    self.FIELDS_FNAME), 'r') as f:
                      dct = json.load(f)
                  all_fields.extend(
                      Field(name=k, value=v, frequency=frequency,
                            subject_id=subj_id, visit_id=visit_id,
                            repository=self, from_study=from_study,
                            **kwargs)
                      for k, v in list(dct.items()))
              if self.PROV_DIR in dirs:
                  if from_study is None:
                      raise ArcanaRepositoryError(
                          "Found provenance directory in session directory (i.e."
                          " not in study-specific sub-directory)")
                  base_prov_dir = op.join(session_path, self.PROV_DIR)
                  for fname in os.listdir(base_prov_dir):
                      all_records.append(Record.load(
                          split_extension(fname)[0],
                          frequency, subj_id, visit_id, from_study,
                          op.join(base_prov_dir, fname)))
          return all_filesets, all_fields, all_records