@@ -509,6 +509,19 @@ def _drop(
509509 }
510510
511511
512+ class _EmptyField :
513+ """Empty field that can replace a missing detector_number in NXdetector."""
514+
515+ def __init__ (self , sizes : dict [str , int ]):
516+ self .attrs = {}
517+ self .sizes = sizes .copy ()
518+ self .dims = tuple (sizes .keys ())
519+ self .shape = tuple (sizes .values ())
520+
521+ def __getitem__ (self , key : Any ) -> sc .Variable :
522+ return sc .empty (dims = self .dims , shape = self .shape , unit = None )
523+
524+
512525class _StrippedDetector (snx .NXdetector ):
513526 """Detector definition without large geometry or event data for ScippNexus.
514527
@@ -518,11 +531,22 @@ class _StrippedDetector(snx.NXdetector):
518531 def __init__ (
519532 self , attrs : dict [str , Any ], children : dict [str , snx .Field | snx .Group ]
520533 ):
521- children = _drop (children , (snx .NXoff_geometry , snx .NXevent_data ))
522- # Histogram mode detectors may not have a detector_number, as it is not needed
523- # for grouping data by detector id.
534+ # We get the 'data' sizes before the NXdata is dropped
535+ field_sizes = None
536+ if ('detector_number' not in children ) and ('data' in children ):
537+ if 'value' in children ['data' ]:
538+ field_sizes = children ['data' ]['value' ].sizes .copy ()
539+
540+ children = _drop (
541+ children , (snx .NXoff_geometry , snx .NXevent_data , snx .NXdata , snx .NXlog )
542+ )
543+
524544 if 'detector_number' in children :
525545 children ['data' ] = children ['detector_number' ]
546+ elif field_sizes is not None :
547+ field_sizes .pop ('time' , None )
548+ children ['data' ] = _EmptyField (sizes = field_sizes )
549+
526550 super ().__init__ (attrs = attrs , children = children )
527551
528552
0 commit comments