239
239
240
240
from argparse import ArgumentDefaultsHelpFormatter , ArgumentParser
241
241
from collections import OrderedDict
242
+ from collections .abc import Mapping
242
243
from io import StringIO
243
244
from os .path import abspath , expanduser , expandvars , isfile , join
244
245
import re
@@ -620,38 +621,68 @@ def parse_pipeline_config(config):
620
621
binning , _ = split (name , sep = '.' )
621
622
622
623
bin_split = config ['binning' ].get (binning + '.split' , None )
623
- if bin_split is not None : # Use multiple MultiDimBinning(s)
624
- bin_split = OneDimBinning (** eval (config .get ('binning' , binning + '.split' )))
625
-
626
- bins = [[] for i in range (bin_split .size )]
624
+ if bin_split is not None :
625
+ # User requested split into several event samples with their
626
+ # own MultiDimBinning definitions.
627
+ try :
628
+ bin_split = eval (bin_split ) # pylint: disable=eval-used
629
+ except :
630
+ assert isinstance (bin_split , str )
631
+ # Just split original str into individual selection strs
632
+ bin_split = split (bin_split )
633
+ else :
634
+ assert isinstance (bin_split , Mapping )
635
+ # If input can be parsed as dict, split events according to
636
+ # the presumably contained OneDimBinning definition
637
+ bin_split = OneDimBinning (** bin_split )
638
+
639
+ nselections = len (bin_split )
640
+ # instantiate the OneDimBinnings corresponding to each selection
641
+ bins = [[] for i in range (nselections )]
627
642
for bin_name in order :
628
643
def_raw = config .get ('binning' , binning + '.' + bin_name )
629
- kwargs = eval (def_raw )
644
+ kwargs = eval (def_raw ) # pylint: disable=eval-used
630
645
if isinstance (kwargs , list ):
631
- assert len (kwargs ) == bin_split .size
646
+ # Dedicated OneDimBinning kwargs for each selection
647
+ assert len (kwargs ) == nselections
632
648
else :
633
- kwargs = [kwargs ] * bin_split .size
634
- for i in range (bin_split .size ):
635
- kw = kwargs [i ]
636
- bins [i ].append (OneDimBinning (bin_name , ** kw ))
649
+ # Broadcast the universal OneDimBinning kwargs across
650
+ # all selections
651
+ kwargs = [kwargs ] * nselections
652
+ for i , kw in enumerate (kwargs ):
653
+ bins [i ].append (OneDimBinning (name = bin_name , ** kw ))
637
654
638
655
mask = config ['binning' ].get (binning + '.mask' , None )
639
656
if mask is not None :
640
- mask = eval (mask )
657
+ mask = eval (mask ) # pylint: disable=eval-used
641
658
if isinstance (mask [0 ], list ):
642
- assert len (mask ) == bin_split .size
659
+ # Dedicated mask for each selection
660
+ assert len (mask ) == nselections
643
661
else :
644
- mask = [mask ] * bin_split .size
662
+ # Broadcast the universal mask across all selections
663
+ mask = [mask ] * nselections
645
664
else :
646
- mask = [mask ] * bin_split .size
665
+ # No mask for any selection
666
+ mask = [None ] * nselections
647
667
648
668
multibins = []
649
- for i in range (bin_split .size ):
650
- multibins .append (MultiDimBinning (bins [i ], name = binning + f"_{ i } " , mask = mask [i ]))
669
+ for i in range (nselections ):
670
+ mb = MultiDimBinning (
671
+ dimensions = bins [i ],
672
+ name = binning + f"_{ i } " ,
673
+ mask = mask [i ]
674
+ )
675
+ multibins .append (mb )
651
676
652
- binning_dict [binning ] = VarBinning (multibins , bin_split , name = binning )
677
+ binning_dict [binning ] = VarBinning (
678
+ binnings = multibins ,
679
+ selections = bin_split ,
680
+ name = binning ,
681
+ mask = mask
682
+ )
653
683
654
- else : # Use only one MultiDimBinning
684
+ else :
685
+ # Requested only one single MultiDimBinning for all events
655
686
bins = []
656
687
for bin_name in order :
657
688
try :
@@ -680,7 +711,7 @@ def parse_pipeline_config(config):
680
711
)
681
712
raise
682
713
try :
683
- bins .append (OneDimBinning (bin_name , ** kwargs ))
714
+ bins .append (OneDimBinning (name = bin_name , ** kwargs ))
684
715
except :
685
716
logging .error (
686
717
"Failed to instantiate new `OneDimBinning` from '%s'"
@@ -691,9 +722,11 @@ def parse_pipeline_config(config):
691
722
# Get the bin mask, if there is one
692
723
mask = config ['binning' ].get (binning + '.mask' , None )
693
724
if mask is not None :
694
- mask = eval (mask )
725
+ mask = eval (mask ) # pylint: disable=eval-used
695
726
# Create the binning object
696
- binning_dict [binning ] = MultiDimBinning (bins , name = binning , mask = mask )
727
+ binning_dict [binning ] = MultiDimBinning (
728
+ dimensions = bins , name = binning , mask = mask
729
+ )
697
730
698
731
699
732
stage_dicts = OrderedDict ()
0 commit comments