cms-nanoAOD / nanoAOD-tools

Tools for working with NanoAOD (requiring only python + root, not CMSSW)
42 stars 326 forks source link

Fix crash when no entries are pre-selected in an event #303

Closed meisonlikesicecream closed 1 year ago

meisonlikesicecream commented 1 year ago

NanoAODTools crashes if no entries in an input file got pre-selected due to adding a cut and/or jsonInput in postprocessor.py. This PR fixes that by not processing the input file if 0 entries got pre-selected.

The error message when this crash occurs can be seen below:

== CMSSW: nanoAODv5 or higher: True
== CMSSW: Traceback (most recent call last):
== CMSSW:   File "/srv/crabPostProc.py", line 131, in <module>
== CMSSW:     p.run()
== CMSSW:   File "/srv/CMSSW_12_3_0_pre2/python/PhysicsTools/NanoAODTools/postprocessing/framework/postprocessor.py", line 236, in run
== CMSSW:     (nall, npass, timeLoop) = eventLoop(
== CMSSW:   File "/srv/CMSSW_12_3_0_pre2/python/PhysicsTools/NanoAODTools/postprocessing/framework/eventloop.py", line 82, in eventLoop
== CMSSW:     ret = m.analyze(e)
== CMSSW:   File "/srv/CMSSW_12_3_0_pre2/python/PhysicsTools/NanoAODTools/postprocessing/modules/jme/jetmetUncertainties.py", line 334, in analyze
== CMSSW:     jets = Collection(event, self.jetBranchName)
== CMSSW:   File "/srv/CMSSW_12_3_0_pre2/python/PhysicsTools/NanoAODTools/postprocessing/framework/datamodel.py", line 116, in __init__
== CMSSW:     self._len = getattr(event, "n" + prefix)
== CMSSW:   File "/srv/CMSSW_12_3_0_pre2/python/PhysicsTools/NanoAODTools/postprocessing/framework/datamodel.py", line 18, in __getattr__
== CMSSW:     return self._tree.readBranch(name)
== CMSSW:   File "/srv/CMSSW_12_3_0_pre2/python/PhysicsTools/NanoAODTools/postprocessing/framework/treeReaderArrayTools.py", line 89, in readBranch
== CMSSW:     ret = _vr.Get()[0]
== CMSSW: ReferenceError: attempt to access a null-pointer
clelange commented 1 year ago

Thank you! One could simplify the code to avoid an additional elif, but this does the job, so I'll merge it.