75 def makeAlgs (self, config) :
76
77 sysService = config.createService( 'CP::SystematicsSvc', 'SystematicsSvc' )
78
79 if self.runSystematics is False :
80 runSystematics = self.runSystematics
81 elif config.noSystematics() is not None :
82
83
84 self.runSystematics = not config.noSystematics()
85 runSystematics = self.runSystematics
86 else :
87 runSystematics = True
88
89 if runSystematics :
90 sysService.sigmaRecommended = 1
91 if config.dataType() is DataType.Data:
92
93 self.onlySystematicsCategories = ['JER']
94 if self.onlySystematicsCategories is not None:
95
96 requested_categories =
set()
97 for category_str in self.onlySystematicsCategories:
98 try:
99 category_enum = SystematicsCategories[category_str.upper()]
100 requested_categories |= category_enum.value
101 except KeyError:
102 raise ValueError(f"Invalid systematics category passed to option 'onlySystematicsCategories': {category_str}. Must be one of {', '.join(category.name for category in SystematicsCategories)}")
103
104 if len(requested_categories):
105 sysService.systematicsRegex = "^(?=.*(" + "|".join(requested_categories) + ")|$).*"
106 if self.filterSystematics is not None:
107 sysService.systematicsRegex = self.filterSystematics
108 config.createService( 'CP::SelectionNameSvc', 'SelectionNameSvc')
109
110 if self.systematicsHistogram is not None:
111
112 allSysDumper = config.createAlgorithm( 'CP::SysListDumperAlg', 'SystematicsPrinter' )
113 allSysDumper.histogramName = self.systematicsHistogram
114 allSysDumper.RootStreamName = self.streamName
115
116 if self.separateWeightSystematics:
117
118 weightSysDumper = config.createAlgorithm( 'CP::SysListDumperAlg', 'OnlyWeightSystematicsPrinter' )
119 weightSysDumper.histogramName = f"{self.systematicsHistogram}OnlyWeights"
120 weightSysDumper.systematicsRegex = "^(GEN_|EL_EFF_|MUON_EFF_|PH_EFF_|TAUS_TRUEHADTAU_EFF_|FT_EFF_|JET_.*JvtEfficiency_|PRW_).*"
121
122 if self.metadataHistogram is not None:
123
124 if not config.flags:
125 raise ValueError ("Writing out the metadata histogram requires to pass config flags")
126 metadataHistAlg = config.createAlgorithm( 'CP::MetadataHistAlg', 'MetadataHistAlg' )
127 metadataHistAlg.histogramName = self.metadataHistogram
128 metadataHistAlg.dataType = str(config.dataType().value)
129 metadataHistAlg.campaign = str(config.dataYear()) if config.dataType() is DataType.Data else str(config.campaign().value)
130 metadataHistAlg.mcChannelNumber = str(config.dsid())
131 if config.dataType() is DataType.Data:
132 etag = "unavailable"
133 else:
134 from AthenaConfiguration.AutoConfigFlags import GetFileMD
135 metadata = GetFileMD(config.flags.Input.Files)
136 amiTags = metadata.get("AMITag", "not found!")
137 etag = str(amiTags.split("_")[0])
138 metadataHistAlg.etag = etag
139
140 if self.enableExpertMode and config._pass == 0:
141
142 warnings.simplefilter('ignore', ExpertModeWarning)
143
144 log = logging.getLogger('CommonServices')
145 bold = "\033[1m"
146 red = "\033[91m"
147 yellow = "\033[93m"
148 reset = "\033[0m"
149 log.warning(red +r"""
150 ________ _______ ______ _____ _______ __ __ ____ _____ ______ ______ _ _ ____ _ ______ _____
151 | ____\ \ / / __ \| ____| __ \__ __| | \/ |/ __ \| __ \| ____| | ____| \ | | /\ | _ \| | | ____| __ \
152 | |__ \ V /| |__) | |__ | |__) | | | | \ / | | | | | | | |__ | |__ | \| | / \ | |_) | | | |__ | | | |
153 | __| > < | ___/| __| | _ / | | | |\/| | | | | | | | __| | __| | . ` | / /\ \ | _ <| | | __| | | | |
154 | |____ / . \| | | |____| | \ \ | | | | | | |__| | |__| | |____ | |____| |\ |/ ____ \| |_) | |____| |____| |__| |
155 |______/_/ \_\_| |______|_| \_\ |_| |_| |_|\____/|_____/|______| |______|_| \_/_/ \_\____/|______|______|_____/
156
157"""
158 +reset)
159 log.warning(f"{bold}{yellow}These settings are not recommended for analysis. Make sure you know what you're doing, or disable them with `enableExpertMode: False` in `CommonServices`.{reset}")
160
161 if self.setupONNX:
162 config.createService('AthOnnx::OnnxRuntimeSvc', 'OnnxRuntimeSvc')
163
164@groupBlocks