Repository: scikit-hep/coffea (language: python)

Issue:
Bug in NanoEventsFactory.from_root() when reading in multiple files with different trigger paths
**Describe the bug**
When including multiple files (from the NanoAODv9 dataset shown below) in the NanoEventsFactory.from_root() uproot file spec, the dask.compute() function results in a KeyInFileError which I believe results from one of the files not containing a trigger path found in the other file. The reproducer works with a single file specified. This failure is not unique to these two files, however the extent of the issue is unknown.

**To Reproduce**
Steps to reproduce the behavior:
```
from coffea.nanoevents import NanoEventsFactory, NanoAODSchema
redirector="root://cmsxrootd.fnal.gov/" # This redirector doesn't seem to work on ND resources...
# redirector="root://ndcms.crc.nd.edu/"
fileset = {
    redirector+"/store/data/Run2017F/DoubleEG/NANOAOD/UL2017_MiniAODv2_NanoAODv9-v1/710000/E0416E7B-3364-D64D-910A-E83496BCD1EF.root": {'object_path': 'Events', 'steps': [0, 50]},
    redirector+"/store/data/Run2017F/DoubleEG/NANOAOD/UL2017_MiniAODv2_NanoAODv9-v1/70000/61B08DB4-292E-734A-B082-E56243B5365A.root": {'object_path': 'Events', 'steps': [0, 50]}
    }
events = NanoEventsFactory.from_root(
    fileset,
    schemaclass=NanoAODSchema,
).events().compute()
```

**Output**
```
---------------------------------------------------------------------------
KeyInFileError                            Traceback (most recent call last)
Cell In[13], [line 10](vscode-notebook-cell:?execution_count=13&line=10)
      [2](vscode-notebook-cell:?execution_count=13&line=2) redirector="root://ndcms.crc.nd.edu/"
      [3](vscode-notebook-cell:?execution_count=13&line=3) fileset = {
      [4](vscode-notebook-cell:?execution_count=13&line=4)     redirector+"/store/data/Run2017F/DoubleEG/NANOAOD/UL2017_MiniAODv2_NanoAODv9-v1/710000/E0416E7B-3364-D64D-910A-E83496BCD1EF.root": {'object_path': 'Events', 'steps': [0, 50]},
      [5](vscode-notebook-cell:?execution_count=13&line=5)     redirector+"/store/data/Run2017F/DoubleEG/NANOAOD/UL2017_MiniAODv2_NanoAODv9-v1/70000/61B08DB4-292E-734A-B082-E56243B5365A.root": {'object_path': 'Events', 'steps': [0, 50]}
      [6](vscode-notebook-cell:?execution_count=13&line=6)     }
      [7](vscode-notebook-cell:?execution_count=13&line=7) events = NanoEventsFactory.from_root(
      [8](vscode-notebook-cell:?execution_count=13&line=8)     fileset,
      [9](vscode-notebook-cell:?execution_count=13&line=9)     schemaclass=NanoAODSchema,
---> [10](vscode-notebook-cell:?execution_count=13&line=10) ).events().compute()

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:342](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:342), in DaskMethodsMixin.compute(self, **kwargs)
    [318](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:318) def compute(self, **kwargs):
    [319](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:319)     """Compute this dask collection
    [320](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:320) 
    [321](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:321)     This turns a lazy Dask collection into its in-memory equivalent.
   (...)
    [340](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:340)     dask.compute
    [341](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:341)     """
--> [342](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:342)     (result,) = compute(self, traverse=False, **kwargs)
    [343](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:343)     return result

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:628](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:628), in compute(traverse, optimize_graph, scheduler, get, *args, **kwargs)
    [625](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:625)     postcomputes.append(x.__dask_postcompute__())
    [627](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:627) with shorten_traceback():
--> [628](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:628)     results = schedule(dsk, keys, **kwargs)
    [630](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/dask/base.py:630) return repack([f(r, *a) for r, (f, a) in zip(results, postcomputes)])

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1256](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1256), in _UprootOpenAndRead.__call__(self, blockwise_args)
   [1242](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1242)     except self.allowed_exceptions as err:
   [1243](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1243)         return (
   [1244](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1244)             self.mock_empty(backend="cpu"),
   [1245](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1245)             _report_failure(
   (...)
   [1253](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1253)             ),
   [1254](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1254)         )
-> [1256](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1256) return self._call_impl(
   [1257](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1257)     file_path, object_path, i_step_or_start, n_steps_or_stop, is_chunk
   [1258](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1258) )

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1214](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1214), in _UprootOpenAndRead._call_impl(self, file_path, object_path, i_step_or_start, n_steps_or_stop, is_chunk)
   [1208](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1208)     start, stop = min((i_step_or_start * events_per_step), num_entries), min(
   [1209](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1209)         (i_step_or_start + 1) * events_per_step, num_entries
   [1210](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1210)     )
   [1212](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1212) assert start <= stop
-> [1214](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:1214) return self.read_tree(ttree, start, stop)

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:949](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:949), in UprootReadMixin.read_tree(self, tree, start, stop)
    [945](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:945) # If reading this buffer loads a permitted key, read from the tree
    [946](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:946) # We might not have _all_ keys if e.g. buffer A requires one
    [947](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:947) # but not two of the keys required for buffer B
    [948](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:948) if all(k in self.common_keys for k in keys_for_buffer):
--> [949](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:949)     container[buffer_key] = mapping[buffer_key]
    [950](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:950) # Otherwise, introduce a placeholder
    [951](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:951) else:
    [952](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:952)     container[buffer_key] = awkward.typetracer.PlaceholderArray(
    [953](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:953)         nplike=nplike,
    [954](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:954)         shape=(awkward.typetracer.unknown_length,),
    [955](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:955)         dtype=dtype,
    [956](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/_dask.py:956)     )

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/factory.py:114](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/factory.py:114), in _TranslatedMapping.__getitem__(self, index)
    [113](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/factory.py:113) def __getitem__(self, index):
--> [114](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/factory.py:114)     return self._mapping[self._func(index)]

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:94](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:94), in BaseSourceMapping.__getitem__(self, key)
     [92](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:92)     if self._access_log is not None:
     [93](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:93)         self._access_log.append(handle_name)
---> [94](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:94)     handle = self.get_column_handle(
     [95](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:95)         self._column_source(uuid, treepath), handle_name
     [96](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:96)     )
     [97](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:97)     stack.append(
     [98](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:98)         self.extract_column(
     [99](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:99)             handle, start, stop, use_ak_forth=self._use_ak_forth
    [100](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:100)         )
    [101](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:101)     )
    [102](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/base.py:102) elif node.startswith("!"):

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/uproot.py:155](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/uproot.py:155), in UprootSourceMapping.get_column_handle(self, columnsource, name)
    [154](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/uproot.py:154) def get_column_handle(self, columnsource, name):
--> [155](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/coffea/nanoevents/mapping/uproot.py:155)     return columnsource[name]

File [~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1646](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1646), in HasBranches.__getitem__(self, where)
   [1644](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1644)         return got
   [1645](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1645)     else:
-> [1646](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1646)         raise uproot.KeyInFileError(
   [1647](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1647)             original_where,
   [1648](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1648)             keys=self.keys(recursive=recursive),
   [1649](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1649)             file_path=self._file.file_path,
   [1650](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1650)             object_path=self.object_path,
   [1651](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1651)         )
   [1653](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1653) else:
   [1654](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1654)     raise uproot.KeyInFileError(
   [1655](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1655)         original_where,
   [1656](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1656)         keys=self.keys(recursive=recursive),
   [1657](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1657)         file_path=self._file.file_path,
   [1658](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1658)         object_path=self.object_path,
   [1659](https://vscode-remote+ssh-002dremote-002bearth-002ecrc-002end-002eedu.vscode-resource.vscode-cdn.net/afs/crc.nd.edu/user/a/atownse2/Public/RSTriPhoton/test/~/micromamba/envs/triphoton-env/lib/python3.11/site-packages/uproot/behaviors/TBranch.py:1659)     )

KeyInFileError: not found: 'HLT_DoubleMu5_Upsilon_DoubleEle3_CaloIdL_TrackIdL'

    Available keys: 'HLT_DiMu9_Ele9_CaloIdL_TrackIdL', 'HLT_Mu8_DiEle12_CaloIdL_TrackIdL', 'HLT_DiMu9_Ele9_CaloIdL_TrackIdL_DZ', 'HLT_Mu8_DiEle12_CaloIdL_TrackIdL_DZ', 'HLT_Ele16_Ele12_Ele8_CaloIdL_TrackIdL', 'HLT_DoubleMu2_Jpsi_DoubleTrk1_Phi'...

in file root://ndcms.crc.nd.edu:1094//store/data/Run2017F/DoubleEG/NANOAOD/UL2017_MiniAODv2_NanoAODv9-v1/70000/61B08DB4-292E-734A-B082-E56243B5365A.root
in object /Events;1
```

**Desktop:**
- NAME="Red Hat Enterprise Linux Server"
- VERSION="7.9 (Maipo)"


Discussion / hints:
I think I understand the issue now, the problem is that when I'm trying to skim the NanoAOD uproot is looking for a L1 or HLT field based on the union of the forms for each file and one of the files doesn't have this field. I'm not sure what the solution is, but the workaround is to not include the HLT or L1 fields in the skimmed outputs. 
I think this means we need a feature in uproot or somewhere in between nanoevents and uproot to generate a column of zeros/Falses/etc. when the column isn't found in the underlying tree. 
@jpivarski what would be the best way to achieve this?
Here's a tool: [ak.merge_union_of_records](https://awkward-array.org/doc/main/reference/generated/ak.merge_union_of_records.html)

Given one dataset that has record fields `trig1` and `trig2`,

```python
events1 = ak.Array([{"trig1": False, "trig2": False}, {"trig1": True, "trig2": True}])
```

and another dataset that has record fields `trig2` and `trig3`,

```python
events2 = ak.Array([{"trig2": False, "trig3": False}, {"trig2": True, "trig3": True}])
```

concatenating them produces a union-type:

```python
ak.concatenate((events1, events2))
```

```
type: 4 * union[
    {
        trig1: bool,
        trig2: bool
    },
    {
        trig2: bool,
        trig3: bool
    }
]
[{trig1: False, trig2: False},
 {trig1: True, trig2: True},
 {trig2: False, trig3: False},
 {trig2: True, trig3: True}]
```

but [ak.merge_union_of_records](https://awkward-array.org/doc/main/reference/generated/ak.merge_union_of_records.html) replaces a union of records with different sets of fields with a single record type that has all fields, some of which are nullable with `None` values where the records didn't originally have them. (This is like an outer join.)

```python
ak.merge_union_of_records(ak.concatenate((events1, events2)))
```

```
type: 4 * {
    trig1: ?bool,
    trig2: bool,
    trig3: ?bool
}
[{trig1: False, trig2: False, trig3: None},
 {trig1: True, trig2: True, trig3: None},
 {trig1: None, trig2: False, trig3: False},
 {trig1: None, trig2: True, trig3: True}]
```

This retains the distinction between triggers that were defined but didn't fire and triggers that weren't defined, and that would carry through slices (would mask as `None` rather than remove). You could also get rid of that with [ak.fill_none](https://awkward-array.org/doc/main/reference/generated/ak.fill_none.html) `value=False`.

```python
ak.fill_none(ak.merge_union_of_records(ak.concatenate((events1, events2))), value=False)
```

```
type: 4 * {
    trig1: bool,
    trig2: bool,
    trig3: bool
}
[{trig1: False, trig2: False, trig3: False},
 {trig1: True, trig2: True, trig3: False},
 {trig1: False, trig2: False, trig3: False},
 {trig1: False, trig2: True, trig3: True}]
```
I'll check to see if this works on typetracers and forms tomorrow. Thanks!
@atownse2 Could you please try this with the version of coffea out of the master branch?

Fix patch:
diff --git a/src/coffea/dataset_tools/manipulations.py b/src/coffea/dataset_tools/manipulations.py
index d71d06e3d..e515ce2bf 100644
--- a/src/coffea/dataset_tools/manipulations.py
+++ b/src/coffea/dataset_tools/manipulations.py
@@ -101,10 +101,8 @@ def slice_files(fileset: FilesetSpec, theslice: Any = slice(None)) -> FilesetSpe
 
 def _default_filter(name_and_spec):
     name, spec = name_and_spec
-    thesteps = spec["steps"]
-    return thesteps is not None and (
-        len(thesteps) > 1 or (thesteps[0][1] - thesteps[0][0]) > 0
-    )
+    num_entries = spec["num_entries"]
+    return num_entries is not None and num_entries > 0
 
 
 def filter_files(
diff --git a/src/coffea/dataset_tools/preprocess.py b/src/coffea/dataset_tools/preprocess.py
index edb20598a..e8dd761e5 100644
--- a/src/coffea/dataset_tools/preprocess.py
+++ b/src/coffea/dataset_tools/preprocess.py
@@ -146,6 +146,7 @@ def get_steps(
                 "file": arg.file,
                 "object_path": arg.object_path,
                 "steps": out_steps,
+                "num_entries": num_entries,
                 "uuid": out_uuid,
                 "form": form_json,
                 "form_hash_md5": form_hash,
@@ -159,6 +160,7 @@ def get_steps(
                     "file": "junk",
                     "object_path": "junk",
                     "steps": [[0, 0]],
+                    "num_entries": 0,
                     "uuid": "junk",
                     "form": "junk",
                     "form_hash_md5": "junk",
@@ -187,12 +189,14 @@ class UprootFileSpec:
 @dataclass
 class CoffeaFileSpec(UprootFileSpec):
     steps: list[list[int]]
+    num_entries: int
     uuid: str
 
 
 @dataclass
 class CoffeaFileSpecOptional(CoffeaFileSpec):
     steps: list[list[int]] | None
+    num_entriees: int | None
     uuid: str | None
 
 
@@ -235,11 +239,14 @@ def _normalize_file_info(file_info):
             None if not isinstance(maybe_finfo, dict) else maybe_finfo.get("uuid", None)
         )
         this_file = normed_files[ifile]
-        this_file += (3 - len(this_file)) * (None,) + (maybe_uuid,)
+        this_file += (4 - len(this_file)) * (None,) + (maybe_uuid,)
         normed_files[ifile] = this_file
     return normed_files
 
 
+_trivial_file_fields = {"run", "luminosityBlock", "event"}
+
+
 def preprocess(
     fileset: FilesetSpecOptional,
     step_size: None | int = None,
@@ -295,7 +302,7 @@ def preprocess(
     files_to_preprocess = {}
     for name, info in fileset.items():
         norm_files = _normalize_file_info(info)
-        fields = ["file", "object_path", "steps", "uuid"]
+        fields = ["file", "object_path", "steps", "num_entries", "uuid"]
         ak_norm_files = awkward.from_iter(norm_files)
         ak_norm_files = awkward.Array(
             {field: ak_norm_files[str(ifield)] for ifield, field in enumerate(fields)}
@@ -322,10 +329,10 @@ def preprocess(
 
     for name, processed_files in all_processed_files.items():
         processed_files_without_forms = processed_files[
-            ["file", "object_path", "steps", "uuid"]
+            ["file", "object_path", "steps", "num_entries", "uuid"]
         ]
 
-        forms = processed_files[["form", "form_hash_md5"]][
+        forms = processed_files[["file", "form", "form_hash_md5", "num_entries"]][
             ~awkward.is_none(processed_files.form_hash_md5)
         ]
 
@@ -333,27 +340,71 @@ def preprocess(
             forms.form_hash_md5.to_numpy(), return_index=True
         )
 
-        dict_forms = []
-        for form in forms[unique_forms_idx].form:
-            dict_form = awkward.forms.from_json(decompress_form(form)).to_dict()
-            fields = dict_form.pop("fields")
-            dict_form["contents"] = {
-                field: content for field, content in zip(fields, dict_form["contents"])
-            }
-            dict_forms.append(dict_form)
+        dataset_forms = []
+        unique_forms = forms[unique_forms_idx]
+        for thefile, formstr, num_entries in zip(
+            unique_forms.file, unique_forms.form, unique_forms.num_entries
+        ):
+            # skip trivially filled or empty files
+            form = awkward.forms.from_json(decompress_form(formstr))
+            if num_entries >= 0 and set(form.fields) != _trivial_file_fields:
+                dataset_forms.append(form)
+            else:
+                warnings.warn(
+                    f"{thefile} has fields {form.fields} and num_entries={num_entries} "
+                    "and has been skipped during form-union determination. You will need "
+                    "to skip this file when processing. You can either manually remove it "
+                    "or, if it is an empty file, dynamically remove it with the function "
+                    "dataset_tools.filter_files which takes the output of preprocess and "
+                    ", by default, removes empty files each dataset in a fileset."
+                )
 
-        union_form = {}
+        union_array = None
         union_form_jsonstr = None
-        while len(dict_forms):
-            form = dict_forms.pop()
-            union_form.update(form)
-        if len(union_form) > 0:
-            union_form_jsonstr = awkward.forms.from_dict(union_form).to_json()
+        while len(dataset_forms):
+            new_array = awkward.Array(dataset_forms.pop().length_zero_array())
+            if union_array is None:
+                union_array = new_array
+            else:
+                union_array = awkward.to_packed(
+                    awkward.merge_union_of_records(
+                        awkward.concatenate([union_array, new_array]), axis=0
+                    )
+                )
+                union_array.layout.parameters.update(new_array.layout.parameters)
+        if union_array is not None:
+            union_form = union_array.layout.form
+
+            for icontent, content in enumerate(union_form.contents):
+                if isinstance(content, awkward.forms.IndexedOptionForm):
+                    if (
+                        not isinstance(content.content, awkward.forms.NumpyForm)
+                        or content.content.primitive != "bool"
+                    ):
+                        raise ValueError(
+                            "IndexedOptionArrays can only contain NumpyArrays of "
+                            "bools in mergers of flat-tuple-like schemas!"
+                        )
+                    parameters = (
+                        content.content.parameters.copy()
+                        if content.content.parameters is not None
+                        else {}
+                    )
+                    # re-create IndexOptionForm with parameters of lower level array
+                    union_form.contents[icontent] = awkward.forms.IndexedOptionForm(
+                        content.index,
+                        content.content,
+                        parameters=parameters,
+                        form_key=content.form_key,
+                    )
+
+            union_form_jsonstr = union_form.to_json()
 
         files_available = {
             item["file"]: {
                 "object_path": item["object_path"],
                 "steps": item["steps"],
+                "num_entries": item["num_entries"],
                 "uuid": item["uuid"],
             }
             for item in awkward.drop_none(processed_files_without_forms).to_list()
@@ -361,12 +412,13 @@ def preprocess(
 
         files_out = {}
         for proc_item, orig_item in zip(
-            processed_files.to_list(), all_ak_norm_files[name].to_list()
+            processed_files_without_forms.to_list(), all_ak_norm_files[name].to_list()
         ):
             item = orig_item if proc_item is None else proc_item
             files_out[item["file"]] = {
                 "object_path": item["object_path"],
                 "steps": item["steps"],
+                "num_entries": item["num_entries"],
                 "uuid": item["uuid"],
             }
 
diff --git a/src/coffea/nanoevents/mapping/base.py b/src/coffea/nanoevents/mapping/base.py
index 3d87b410c..00557f93d 100644
--- a/src/coffea/nanoevents/mapping/base.py
+++ b/src/coffea/nanoevents/mapping/base.py
@@ -56,11 +56,11 @@ def preload_column_source(self, uuid, path_in_source, source):
         self._cache[key] = source
 
     @abstractmethod
-    def get_column_handle(self, columnsource, name):
+    def get_column_handle(self, columnsource, name, allow_missing):
         pass
 
     @abstractmethod
-    def extract_column(self, columnhandle, start, stop, **kwargs):
+    def extract_column(self, columnhandle, start, stop, allow_missing, **kwargs):
         pass
 
     @classmethod
@@ -87,16 +87,21 @@ def __getitem__(self, key):
             elif node == "!skip":
                 skip = True
                 continue
-            elif node == "!load":
+            elif node.startswith("!load"):
                 handle_name = stack.pop()
                 if self._access_log is not None:
                     self._access_log.append(handle_name)
+                allow_missing = node == "!loadallowmissing"
                 handle = self.get_column_handle(
-                    self._column_source(uuid, treepath), handle_name
+                    self._column_source(uuid, treepath), handle_name, allow_missing
                 )
                 stack.append(
                     self.extract_column(
-                        handle, start, stop, use_ak_forth=self._use_ak_forth
+                        handle,
+                        start,
+                        stop,
+                        allow_missing,
+                        use_ak_forth=self._use_ak_forth,
                     )
                 )
             elif node.startswith("!"):
diff --git a/src/coffea/nanoevents/mapping/uproot.py b/src/coffea/nanoevents/mapping/uproot.py
index 0e6c12785..19d5070cb 100644
--- a/src/coffea/nanoevents/mapping/uproot.py
+++ b/src/coffea/nanoevents/mapping/uproot.py
@@ -2,6 +2,7 @@
 import warnings
 
 import awkward
+import numpy
 import uproot
 
 from coffea.nanoevents.mapping.base import BaseSourceMapping, UUIDOpener
@@ -48,6 +49,22 @@ def _lazify_form(form, prefix, docstr=None):
         )
         if parameters:
             form["parameters"] = parameters
+    elif form["class"] == "IndexedOptionArray":
+        if (
+            form["content"]["class"] != "NumpyArray"
+            or form["content"]["primitive"] != "bool"
+        ):
+            raise ValueError(
+                "Only boolean NumpyArrays can be created dynamically if "
+                "missing in file!"
+            )
+        assert prefix.endswith("!load")
+        form["form_key"] = quote(prefix + "allowmissing,!index")
+        form["content"] = _lazify_form(
+            form["content"], prefix + "allowmissing,!content", docstr=docstr
+        )
+        if parameters:
+            form["parameters"] = parameters
     elif form["class"] == "RecordArray":
         newfields, newcontents = [], []
         for field, value in zip(form["fields"], form["contents"]):
@@ -151,14 +168,30 @@ def preload_column_source(self, uuid, path_in_source, source):
         key = self.key_root() + tuple_to_key((uuid, path_in_source))
         self._cache[key] = source
 
-    def get_column_handle(self, columnsource, name):
+    def get_column_handle(self, columnsource, name, allow_missing):
+        if allow_missing:
+            return columnsource[name] if name in columnsource else None
         return columnsource[name]
 
-    def extract_column(self, columnhandle, start, stop, use_ak_forth=True):
+    def extract_column(
+        self, columnhandle, start, stop, allow_missing, use_ak_forth=True
+    ):
         # make sure uproot is single-core since our calling context might not be
+        if allow_missing and columnhandle is None:
+
+            return awkward.contents.IndexedOptionArray(
+                awkward.index.Index64(numpy.full(stop - start, -1, dtype=numpy.int64)),
+                awkward.contents.NumpyArray(numpy.array([], dtype=bool)),
+            )
+        elif not allow_missing and columnhandle is None:
+            raise RuntimeError(
+                "Received columnhandle of None when missing column in file is not allowed!"
+            )
+
         interp = columnhandle.interpretation
         interp._forth = use_ak_forth
-        return columnhandle.array(
+
+        the_array = columnhandle.array(
             interp,
             entry_start=start,
             entry_stop=stop,
@@ -166,6 +199,14 @@ def extract_column(self, columnhandle, start, stop, use_ak_forth=True):
             interpretation_executor=uproot.source.futures.TrivialExecutor(),
         )
 
+        if allow_missing:
+            the_array = awkward.contents.IndexedOptionArray(
+                awkward.index.Index64(numpy.arange(stop - start, dtype=numpy.int64)),
+                awkward.contents.NumpyArray(the_array),
+            )
+
+        return the_array
+
     def __len__(self):
         return self._stop - self._start
 


Test patch:
diff --git a/tests/test_dataset_tools.py b/tests/test_dataset_tools.py
index 58b4bea96..329029b3b 100644
--- a/tests/test_dataset_tools.py
+++ b/tests/test_dataset_tools.py
@@ -122,6 +122,7 @@
                     [28, 35],
                     [35, 40],
                 ],
+                "num_entries": 40,
                 "uuid": "a9490124-3648-11ea-89e9-f5b55c90beef",
             }
         },
@@ -140,6 +141,7 @@
                     [28, 35],
                     [35, 40],
                 ],
+                "num_entries": 40,
                 "uuid": "a210a3f8-3648-11ea-a29f-f5b55c90beef",
             }
         },
@@ -161,6 +163,7 @@
                     [28, 35],
                     [35, 40],
                 ],
+                "num_entries": 40,
                 "uuid": "a9490124-3648-11ea-89e9-f5b55c90beef",
             }
         },
@@ -179,11 +182,13 @@
                     [28, 35],
                     [35, 40],
                 ],
+                "num_entries": 40,
                 "uuid": "a210a3f8-3648-11ea-a29f-f5b55c90beef",
             },
             "tests/samples/nano_dimuon_not_there.root": {
                 "object_path": "Events",
                 "steps": None,
+                "num_entries": None,
                 "uuid": None,
             },
         },
@@ -313,6 +318,7 @@ def test_filter_files():
                 "tests/samples/nano_dy.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [7, 14], [14, 21], [21, 28], [28, 35], [35, 40]],
+                    "num_entries": 40,
                     "uuid": "a9490124-3648-11ea-89e9-f5b55c90beef",
                 }
             },
@@ -324,6 +330,7 @@ def test_filter_files():
                 "tests/samples/nano_dimuon.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [7, 14], [14, 21], [21, 28], [28, 35], [35, 40]],
+                    "num_entries": 40,
                     "uuid": "a210a3f8-3648-11ea-a29f-f5b55c90beef",
                 }
             },
@@ -342,6 +349,7 @@ def test_max_files():
                 "tests/samples/nano_dy.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [7, 14], [14, 21], [21, 28], [28, 35], [35, 40]],
+                    "num_entries": 40,
                     "uuid": "a9490124-3648-11ea-89e9-f5b55c90beef",
                 }
             },
@@ -353,6 +361,7 @@ def test_max_files():
                 "tests/samples/nano_dimuon.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [7, 14], [14, 21], [21, 28], [28, 35], [35, 40]],
+                    "num_entries": 40,
                     "uuid": "a210a3f8-3648-11ea-a29f-f5b55c90beef",
                 }
             },
@@ -372,6 +381,7 @@ def test_slice_files():
                 "tests/samples/nano_dimuon_not_there.root": {
                     "object_path": "Events",
                     "steps": None,
+                    "num_entries": None,
                     "uuid": None,
                 }
             },
@@ -390,6 +400,7 @@ def test_max_chunks():
                 "tests/samples/nano_dy.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [7, 14], [14, 21]],
+                    "num_entries": 40,
                     "uuid": "a9490124-3648-11ea-89e9-f5b55c90beef",
                 }
             },
@@ -401,6 +412,7 @@ def test_max_chunks():
                 "tests/samples/nano_dimuon.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [7, 14], [14, 21]],
+                    "num_entries": 40,
                     "uuid": "a210a3f8-3648-11ea-a29f-f5b55c90beef",
                 }
             },
@@ -419,6 +431,7 @@ def test_slice_chunks():
                 "tests/samples/nano_dy.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [14, 21], [28, 35]],
+                    "num_entries": 40,
                     "uuid": "a9490124-3648-11ea-89e9-f5b55c90beef",
                 }
             },
@@ -430,6 +443,7 @@ def test_slice_chunks():
                 "tests/samples/nano_dimuon.root": {
                     "object_path": "Events",
                     "steps": [[0, 7], [14, 21], [28, 35]],
+                    "num_entries": 40,
                     "uuid": "a210a3f8-3648-11ea-a29f-f5b55c90beef",
                 }
             },