Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
afp.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 import os
4 pbeastDefaultServer = 'https://pc-atlas-www.cern.ch' if os.getenv('PBEAST_SERVER_HTTPS_PROXY', '').startswith('atlasgw') else 'https://atlasop.cern.ch'
5 pbeastServer = os.getenv('PBEAST_SERVER', pbeastDefaultServer)
6 
7 import libpbeastpy; pbeast = libpbeastpy.ServerProxy(pbeastServer)
8 import logging; log = logging.getLogger("DCSCalculator2.variable")
9 
10 from bisect import bisect
11 from itertools import chain
12 from types import GenericAlias
13 
14 from DQUtils.events import process_iovs
15 from DQUtils.general import timer
16 from DQUtils.sugar import IOVSet, RANGEIOV_VAL, RunLumi, TimestampType, define_iov_type, make_iov_type
17 
18 from DCSCalculator2 import config
19 from DCSCalculator2.consts import RED, YELLOW, GREEN, GREY, GOOD, BAD, EMPTY
20 from DCSCalculator2.libcore import map_channels
21 from DCSCalculator2.subdetector import DCSC_DefectTranslate_Subdetector
22 from DCSCalculator2.variable import DefectIOV, GoodIOV, DCSC_Variable
23 
24 class DCSC_Variable_With_Mapping(DCSC_Variable):
25  def __init__(self, folder, evaluator, *, mapping=None, **kwargs):
26  super().__init__(folder, evaluator, **kwargs)
27  self.mapping = mapping
28 
29  def read(self, query_range, folder_base, folder_name):
30  result = super().read(query_range, folder_base, folder_name)
31  if self.mapping is not None:
32  result = map_channels(result, self.mapping, folder_name)
33  return result
34 
36  def make_good_iov(self, iov):
37  giov = []
38  for channel, goodness in self.evaluator(iov):
39  current = GoodIOV(iov.since, iov.until, channel, goodness)
40  current._orig_iov = iov
41  giov.append(current)
42  return giov
43 
44  def make_good_iovs(self, iovs):
45  results = []
46  for iov in iovs:
47  results.append(self.make_good_iov(iov))
48  return IOVSet(sum(zip(*results), ())) # Sort by channel first
49 
50 class DCSC_Merged_Variable(DCSC_Variable):
51  def __init__(self, folders, evaluator, *, mapping={}, **kwargs):
52  folder_merge = ','.join(folders)
53 
54  super().__init__(folder_merge, evaluator, **kwargs)
55  self.folder_names = folders
56  self.mapping = mapping
57 
58  def get_variable(self, name):
59  for var in self.variables:
60  if var.folder_name == name:
61  return var
62  raise RuntimeError("Folder '%s' not found" % name)
63 
64  def read(self, query_range, folder_base, folder_names):
65  var_iovs = []
66  folders = folder_names.split(',')
67 
68  for folder in folders:
69  iovs = super().read(query_range, folder_base, folder)
70  if folder in self.mapping:
71  iovs = map_channels(iovs, self.mapping[folder], folder)
72  var_iovs.append(iovs)
73 
74  iovs = self.merge_input_variables(*var_iovs)
75 
76  if config.opts.check_input_time:
77  self.print_time_info(iovs)
78 
79  if log.isEnabledFor(logging.INFO):
80  input_hash = hash(iovs)
81  self.input_hashes.append(input_hash)
82  #log.info(" -> Input hash: % 09x (len=%i)", input_hash, len(iovs))
83 
84  return iovs
85 
86  def merge_input_variables(self, *inputs):
87  type_bases = [iovs.iov_type for iovs in inputs]
88  base_names = [base.__name__[:-4] for base in type_bases]
89  attributes = [base.lower() for base in base_names]
90  clazz = make_iov_type('MERGER_OF_' + '_AND_'.join(base_names), tuple(['channel'] + attributes))
91 
92  inputs_by_channel = [iovs.by_channel for iovs in inputs]
93  all_channels = sorted(set(y for x in inputs_by_channel for y in x.keys()))
94 
95  result = []
96  for channel in all_channels:
97  c_inputs = [x[channel] for x in inputs_by_channel]
98  result.extend(iov for iov in self.merge_inputs(clazz, channel, *c_inputs))
99 
100  return IOVSet(result, iov_type=clazz, origin=self.folder_names)
101 
102  def merge_inputs(self, clazz, channel, *inputs):
103  result = [clazz(since, until, channel, *states) for since, until, states in process_iovs(*inputs)]
104  return IOVSet(result, iov_type=clazz, origin=self.folder_names)
105 
106 @define_iov_type
107 def PBeastIOV(channel, value):
108  "Stores the value of an object's attribute queried from pBeast"
109 
110 class TDAQC_Variable(DCSC_Variable):
111  """
112  A variable which reads data from pBeast.
113  """
114  TIME_RATIO = 1e3
115 
116  @staticmethod
117  def timeCOOL2PBeast(timestamp):
118  return int(timestamp/TDAQC_Variable.TIME_RATIO)
119 
120  @staticmethod
121  def timePBeast2COOL(timestamp):
122  return TimestampType(timestamp*TDAQC_Variable.TIME_RATIO)
123 
124  def __init__(self, query, evaluator, *, regex=False, mapping=dict(), force_mapping=False, empty_value=None):
125  super().__init__(query, evaluator)
126  self.regex = regex
127  self.mapping = mapping
128  self.force_mapping = force_mapping
129  self.empty_value = empty_value
130  self.query = query
131  self.partition, self.className, self.attribute, self.path = query.split('.', 3)
132  self.input_hashes = []
133 
134  def __repr__(self):
135  return f"<TDAQCVariable {self.query}>"
136 
137  def read(self, query_range, query, *, regex=False):
138  """
139  Read the relevant data from pBeast for this variable, and convert them to COOL-like format
140  """
141  partition, className, attribute, path = query.split('.', 3)
142 
143  log.info(f"Querying pBeast object{'s using regex' if regex else ''} {query}")
144 
145  since, until = query_range
146  since, until = TDAQC_Variable.timeCOOL2PBeast(since), TDAQC_Variable.timeCOOL2PBeast(until)
147 
148  query_data = pbeast.get_data(partition, className, attribute, path, regex, since, until)
149  data = dict.fromkeys(self.mapping.keys()) if self.force_mapping else dict()
150  if query_data:
151  data.update(query_data[0].data)
152 
153  def instantiate(since, until, channel, value):
154  if isinstance(value, list):
155  value = tuple(value)
156  return PBeastIOV(TDAQC_Variable.timePBeast2COOL(since), TDAQC_Variable.timePBeast2COOL(until), channel, value)
157 
158  iovs = []
159  for channel, entries in data.items():
160  if not entries:
161  iovs.append(PBeastIOV(*query_range, channel, self.empty_value))
162  continue
163  first = entries[0]
164  since = first.ts
165  value = first.value
166  for point in entries:
167  if point.value == value:
168  continue
169  iovs.append(instantiate(since, point.ts, channel, value))
170  since = point.ts
171  value = point.value
172  last = entries[-1]
173  iovs.append(instantiate(since, last.ts, channel, value))
174  iovs = IOVSet(iovs, iov_type=PBeastIOV, origin=query)
175 
176  if log.isEnabledFor(logging.INFO):
177  input_hash = hash(iovs)
178  self.input_hashes.append(input_hash)
179  log.info(" -> Input hash: % 09x (len=%i)", input_hash, len(iovs))
180 
181  return iovs
182 
183  def calculate_good_iovs(self, lbtime, subdetector):
184  """
185  Calculate LB-wise "good" states
186  """
187 
188  self.subdetector = subdetector
189 
190  since, until = lbtime.first, lbtime.last
191  if self.timewise_folder:
192  query_range = RANGEIOV_VAL(since.since, until.until)
193  else:
194  query_range = RANGEIOV_VAL(RunLumi(since.Run, since.LumiBlock),
195  RunLumi(until.Run, until.LumiBlock))
196 
197  # Read the database
198  iovs = self.read(query_range, self.query, regex=self.regex)
199  # Decide the states of the input iovs
200  iovs = self.make_good_iovs(iovs)
201  # Apply a mapping for input channels if necessary
202  iovs = self.map_input_channels(iovs)
203 
204  if self.timewise_folder and not config.opts.timewise:
205  # we might already know the defect mapping
206  with timer("Quantize %s (%i iovs over %i lbs)" %
207  (self.query, len(iovs), len(lbtime))):
208  # Quantize to luminosity block
209  iovs = self.quantize(lbtime, iovs)
210 
211  self.iovs = iovs
212  return self
213 
214  def make_good_iov(self, iov):
215  """
216  Determine if one input iov is good.
217  """
218  giov = GoodIOV(iov.since, iov.until, self.mapping.get(iov.channel, iov.channel), self.evaluator(iov))
219  giov._orig_iov = iov
220  return giov
221 
223  def make_good_iov(self, iov):
224  """
225  Determine if channels in one input iov are good.
226  """
227  giov = []
228  for channel, goodness in self.evaluator(iov):
229  current = GoodIOV(iov.since, iov.until, channel, goodness)
230  current._orig_iov = iov
231  giov.append(current)
232  return giov
233 
234  def make_good_iovs(self, iovs):
235  """
236  Determine whether each iov signifies a good or bad state.
237  """
238  results = []
239  for iov in iovs:
240  results.append(self.make_good_iov(iov))
241  return IOVSet(sum(zip(*results), ())) # Sort by channel first
242 
244  def make_good_iov(self, iov):
245  """
246  Determine if channels in one input iov are good.
247  """
248  giov = []
249  for bit, channel in self.mapping.get(iov.channel, dict()).items():
250  iov_value = (((iov.value >> bit) & 1) == 1) if iov.value is not None else None
251  test_iov = PBeastIOV(iov.since, iov.until, channel, iov_value)
252  current = GoodIOV(iov.since, iov.until, channel, self.evaluator(test_iov))
253  current._orig_iov = iov
254  giov.append(current)
255  return giov
256 
258  def make_good_iov(self, iov):
259  """
260  Determine if channels in one input iov are good.
261  """
262  giov = []
263  for index, channel in self.mapping.get(iov.channel, dict()).items():
264  iov_value = iov.value[index] if iov.value is not None else None
265  test_iov = PBeastIOV(iov.since, iov.until, channel, iov_value)
266  current = GoodIOV(iov.since, iov.until, channel, self.evaluator(test_iov))
267  current._orig_iov = iov
268  giov.append(current)
269  return giov
270 
271 SiT_LV_Current_Type = GenericAlias(tuple, (float,)*16)
272 def load_sit_current() -> tuple[list[float],list[SiT_LV_Current_Type]]:
273  from datetime import datetime, timezone
274  from pkg_resources import resource_string
275  sit_current = resource_string('DCSCalculator2.subdetectors.data', 'afp_sit_current.dat').decode().strip().split('\n')
276  result = dict()
277  for line in sit_current:
278  line = line.strip()
279  if not line or line[0] == '#': continue
280  line = line.split()
281  current = tuple(float(x) for x in line[1:])
282  if len(current) != 16:
283  log.warn(f"Wrong number of AFP SiT planes ({len(current)}) in the LV resource from {line[0]}. Setting thresholds to 0...")
284  current = [0] * 16
285  assert(len(current) == 16)
286  time = datetime.fromisoformat(line[0])
287  if time.tzinfo is None: time = time.replace(tzinfo=timezone.utc)
288  time = time.timestamp()
289  result[time] = current
290  keys, values = zip(*sorted(result.items()))
291  return (list(keys), list(values))
292 
293 SIT_LV_CURRENT_LOW_DATA:tuple[list[float],list[SiT_LV_Current_Type]] = load_sit_current()
294 def get_sit_current(timestamp:float) -> SiT_LV_Current_Type:
295  timestamp = timestamp / 1e9
296  keys, values = SIT_LV_CURRENT_LOW_DATA
297  index = max(bisect(keys, timestamp) - 1, 0)
298  return values[index] if values else [0] * 16
299 
300 # DCS channels
301 A_FAR_GARAGE, A_NEAR_GARAGE, C_FAR_GARAGE, C_NEAR_GARAGE = 101, 105, 109, 113
302 A_FAR_SIT_HV, A_NEAR_SIT_HV, C_FAR_SIT_HV, C_NEAR_SIT_HV = 1, 5, 9, 13
303 A_FAR_SIT_LV, A_NEAR_SIT_LV, C_FAR_SIT_LV, C_NEAR_SIT_LV = 21, 25, 29, 33
304 A_FAR_TOF_HV, C_FAR_TOF_HV = 17, 19
305 A_FAR_TOF_LV, C_FAR_TOF_LV = 37, 39
306 
307 # TDAQ channels
308 TTC_RESTART = 1000
309 STOPLESSLY_REMOVED = 5000
310 
311 A_FAR_SIT_DISABLED, A_NEAR_SIT_DISABLED, C_FAR_SIT_DISABLED, C_NEAR_SIT_DISABLED = 1001, 1005, 1009, 1013
312 A_FAR_TOF_DISABLED, C_FAR_TOF_DISABLED = 1017, 1019
313 
314 # Channel names
315 NAMING = ['FSA0', 'FSA1', 'FSA2', 'FSA3',
316  'NSA0', 'NSA1', 'NSA2', 'NSA3',
317  'FSC0', 'FSC1', 'FSC2', 'FSC3',
318  'NSC0', 'NSC1', 'NSC2', 'NSC3',
319  'TDC-A-1', 'TDC-A-2',
320  'TDC-C-1', 'TDC-C-2']
321 
322 # Channel groups
323 GARAGE = [A_FAR_GARAGE, A_NEAR_GARAGE, C_FAR_GARAGE, C_NEAR_GARAGE]
324 SIT_HV = [A_FAR_SIT_HV, A_NEAR_SIT_HV, C_FAR_SIT_HV, C_NEAR_SIT_HV]
325 SIT_LV = [A_FAR_SIT_LV, A_NEAR_SIT_LV, C_FAR_SIT_LV, C_NEAR_SIT_LV]
326 TOF_HV = [A_FAR_TOF_HV, C_FAR_TOF_HV]
327 TOF_LV = [A_FAR_TOF_LV, C_FAR_TOF_LV]
328 
329 SIT_DISABLED = [A_FAR_SIT_DISABLED, A_NEAR_SIT_DISABLED, C_FAR_SIT_DISABLED, C_NEAR_SIT_DISABLED]
330 TOF_DISABLED = [A_FAR_TOF_DISABLED, C_FAR_TOF_DISABLED]
331 
332 # Thresholds
333 SIT_HV_DEAD_BAND = 0.05
334 TOF_HV_DEAD_BAND = 0.90
335 
336 #SIT_LV_CURRENT_LOW = 0.4
337 #SIT_LV_CURRENT_LOW = [0.44, 0.40, 0.42, 0.46,
338 # 0.38, 0.35, 0.38, 0.42,
339 # 0.40, 0.39, 0.39, 0.38,
340 # 0.41, 0.40, 0.43, 0.40]
341 SIT_LV_CURRENT_LOW = get_sit_current
342 SIT_LV_CURRENT_HIGH = 0.8
343 TOF_HV_CURRENT_LOW = 600
344 TOF_LV_CURRENT_LOW = 1.4
345 
346 def mapChannels(*mapseqArgs):
347  return dict(chain(*[zip(channels, range(defectChannel, defectChannel + len(channels))) for channels, defectChannel in mapseqArgs]))
348 
349 def mapTranslatorCounts(countMap):
350  return {channel: range(channel, channel + count) for count, channels in countMap.items() for channel in channels}
351 
352 def remove_None(value, default):
353  return value if value is not None else default
354 
355 class AFP(DCSC_DefectTranslate_Subdetector):
356  folder_base = '/AFP/DCS'
357  variables = [
358 
361 
362  # AFP_(A|C)_(FAR|NEAR)_IN_GARAGE
364  'STATION',
365  lambda iov: iov.inphysics is True,
366  mapping = {1: C_FAR_GARAGE, 2: C_NEAR_GARAGE, 3: A_FAR_GARAGE, 4: A_NEAR_GARAGE}
367  ),
368 
369  # AFP_(A|C)_(FAR|NEAR)_SIT_(PARTIALLY|NOT)_OPERATIONAL_LV
371  'SIT/LV',
372  #lambda iov: SIT_LV_CURRENT_LOW <= remove_None(iov.current, 0) <= SIT_LV_CURRENT_HIGH,
373  #lambda iov: SIT_LV_CURRENT_LOW[iov.channel - SIT_LV[0]] <= remove_None(iov.current, 0) <= SIT_LV_CURRENT_HIGH,
374  lambda iov: SIT_LV_CURRENT_LOW(iov.since)[iov.channel - SIT_LV[0]] <= remove_None(iov.current, 0) <= SIT_LV_CURRENT_HIGH,
375  mapping = mapChannels(
376  ([ 9, 10, 11, 12], A_FAR_SIT_LV ),
377  ([13, 14, 15, 16], A_NEAR_SIT_LV),
378  ([ 1, 2, 3, 4], C_FAR_SIT_LV ),
379  ([ 5, 6, 7, 8], C_NEAR_SIT_LV)
380  )
381  ),
382 
383  # AFP_(A|C)_(FAR|NEAR)_SIT_(PARTIALLY|NOT)_OPERATIONAL_HV
385  ['SIT/HV', 'SIT/HV_VOLTAGE_SET'],
386  lambda iov: -remove_None(iov.hv.voltage, 0) > iov.hv_voltage_set.voltageSet - SIT_HV_DEAD_BAND,
387  mapping = {
388  'SIT/HV': mapChannels(
389  ([ 6, 7, 1, 2], A_FAR_SIT_HV ),
390  ([ 8, 3, 4, 9], A_NEAR_SIT_HV),
391  ([10, 11, 12, 5], C_FAR_SIT_HV ),
392  ([13, 14, 15, 16], C_NEAR_SIT_HV)),
393  'SIT/HV_VOLTAGE_SET': mapChannels(
394  ([ 1, 2, 3, 4], A_FAR_SIT_HV ),
395  ([ 5, 6, 7, 8], A_NEAR_SIT_HV),
396  ([ 9, 10, 11, 12], C_FAR_SIT_HV ),
397  ([13, 14, 15, 16], C_NEAR_SIT_HV))
398  }
399  ),
400 
401  # AFP_(A|C)_FAR_TOF_NOT_OPERATIONAL_LV
403  'TOF_TDC_CURRENT',
404  lambda iov: [(iov.channel, TOF_LV_CURRENT_LOW <= remove_None(iov.hptdc1_current, 0)),
405  (iov.channel + 1, TOF_LV_CURRENT_LOW <= remove_None(iov.hptdc2_current, 0))],
406  mapping = {1: A_FAR_TOF_LV, 2: C_FAR_TOF_LV}
407  ),
408 
409  # AFP_(A|C)_FAR_TOF_NOT_OPERATIONAL_HV
411  ['TOF', 'TOF_PMT_VOLTAGE_SET'],
412  lambda iov: -remove_None(iov.tof.pmt_voltage, 0) > iov.tof_pmt_voltage_set.pmt_voltageSet - TOF_HV_DEAD_BAND and -remove_None(iov.tof.pmt_current, 0) > TOF_HV_CURRENT_LOW,
413  mapping = {
414  'TOF': {1: A_FAR_TOF_HV, 2: C_FAR_TOF_HV},
415  'TOF_PMT_VOLTAGE_SET': {1: A_FAR_TOF_HV, 2: C_FAR_TOF_HV},
416  }
417  ),
418 
419 
422 
423  # AFP_TTC_RESTART
425  'ATLAS.RCStateInfo.state.RunCtrl.AFP',
426  lambda iov: iov.value == 'RUNNING',
427  mapping = {'RunCtrl.AFP': TTC_RESTART}
428  ),
429 
430  # AFP_STOPLESSLY_REMOVED
432  'ATLAS.RODBusyIS.BusyEnabled.Monitoring.afp_rodBusy-VLDB/RODBusy',
433  lambda iov: iov.value is not False,
434  mapping = {'Monitoring.afp_rodBusy-VLDB/RODBusy': {6: STOPLESSLY_REMOVED}}
435  ),
436 
437  # AFP_(A|C)_(FAR|NEAR)_(PARTIALLY|NOT)_OPERATIONAL_TDAQ
439  'ATLAS.RceMonitoring.DisabledPerm.Monitoring.RceMonitoring_RCE[34]',
440  lambda iov: iov.value is not True,
441  regex = True,
442  mapping = {
443  'Monitoring.RceMonitoring_RCE3': mapChannels(([0, 2, 4, 6], A_NEAR_SIT_DISABLED), ([8, 10, 12, 14], A_FAR_SIT_DISABLED), ([9, 11], A_FAR_TOF_DISABLED)),
444  'Monitoring.RceMonitoring_RCE4': mapChannels(([0, 2, 4, 6], C_NEAR_SIT_DISABLED), ([8, 10, 12, 14], C_FAR_SIT_DISABLED), ([9, 11], C_FAR_TOF_DISABLED)),
445  }
446  ),
447  ]
448 
449  equality_breaker = 0.0001
450 
451  dead_fraction_caution = 0 + equality_breaker
452  dead_fraction_bad = 0.25 + equality_breaker
453 
455  1: [*GARAGE, TTC_RESTART, STOPLESSLY_REMOVED, *TOF_HV],
456  2: [*TOF_DISABLED, *TOF_LV],
457  4: [*SIT_DISABLED, *SIT_LV, *SIT_HV],
458  })
459 
460  def merge_variable_states(self, states):
461  """
462  Merge input channel states across variables, taking the worst.
463 
464  Ignore configuration variables and variables without channel.
465  """
466 
467  # Remove variables without channel
468  states = [state for state in states if state and state.channel is not None]
469 
470  # More simplistic way of doing the above, but cannot handle config vars:
471  return min(state.good for state in states) if len(states) > 0 else None
472 
473  def calculate_dead_fraction(self, since, until, output_channel, states, state_iovs):
474  """
475  Calculate the dead fraction and the resulting traffic light code.
476  """
477 
478  n_total = len(states)
479  n_working = states.count(GOOD)
480  n_bad = states.count(BAD)
481  n_unfilled = states.count(EMPTY)
482 
483  assert n_total == len(self.mapping[output_channel])
484  assert n_total - n_working - n_bad - n_unfilled == 0
485 
486  n_config = n_total - n_unfilled
487  dead_fraction = 1. - n_working / n_total
488 
489  code = GREEN
490  if dead_fraction > self.dead_fraction_caution:
491  code = YELLOW
492  if dead_fraction > self.dead_fraction_bad:
493  code = RED
494 
495  if n_unfilled / n_total > self.dead_fraction_caution:
496  code = GREY
497  if n_unfilled and config.opts.mark_unfilled_grey:
498  code = GREY
499 
500  return code, dead_fraction, 0., n_config, n_working
501 
502  @staticmethod
503  def defect_translator(channel, defect_name, selector, comment):
504  def translator_core(iovs):
505  return [DefectIOV(iov.since, iov.until, defect_name, True, comment=comment(iov))
506  for iov in iovs if iov.channel == channel and not iov._is_empty and selector(iov)]
507  return translator_core
508 
509  @staticmethod
510  def defect_combinator(channels, defect_name, selector, naffected, comment):
511  def combinator_core(iovs):
512  result = []
513  channel_iovs = iovs.by_channel
514  defect_iovs = [channel_iovs.get(channel) for channel in channels]
515  for since, until, states in process_iovs(*defect_iovs):
516  matched = [(state, group) for state,group in zip(states,channels) if not state._is_empty and selector(state)]
517  if len(matched) < 2: continue # We need at least two defects
518  bad_channels = {iov.channel - group for state,group in matched for iov in state._orig_iovs if not iov.good}
519  if len(bad_channels) < naffected: continue
520  result.append(DefectIOV(since, until, defect_name, True, comment=comment()))
521  return result
522  return combinator_core
523 
524  @staticmethod
525  def color_selector(color):
526  def selector_core(iov):
527  return iov.Code == color
528  return selector_core
529 
530  @staticmethod
531  def nbad_selector(nbad):
532  if isinstance(nbad, int): nbad = [nbad]
533  def selector_core(iov):
534  return iov.NConfig - iov.NWorking in nbad
535  return selector_core
536 
537  def __init__(self, *args, **kwargs):
538  super(AFP, self).__init__(*args, **kwargs)
539  self.translators = [
540  AFP.defect_translator(*cdsc)
541  for cdsc in [
542 
545  (A_FAR_GARAGE, 'AFP_A_FAR_IN_GARAGE', AFP.color_selector(RED), AFP.comment_GARAGE),
546  (A_NEAR_GARAGE, 'AFP_A_NEAR_IN_GARAGE', AFP.color_selector(RED), AFP.comment_GARAGE),
547  (C_FAR_GARAGE, 'AFP_C_FAR_IN_GARAGE', AFP.color_selector(RED), AFP.comment_GARAGE),
548  (C_NEAR_GARAGE, 'AFP_C_NEAR_IN_GARAGE', AFP.color_selector(RED), AFP.comment_GARAGE),
549 
550  (A_FAR_SIT_HV, 'AFP_A_FAR_SIT_PARTIALLY_OPERATIONAL_HV', AFP.nbad_selector([1]), AFP.comment_SIT_HV),
551  (A_NEAR_SIT_HV, 'AFP_A_NEAR_SIT_PARTIALLY_OPERATIONAL_HV', AFP.nbad_selector([1]), AFP.comment_SIT_HV),
552  (C_FAR_SIT_HV, 'AFP_C_FAR_SIT_PARTIALLY_OPERATIONAL_HV', AFP.nbad_selector([1]), AFP.comment_SIT_HV),
553  (C_NEAR_SIT_HV, 'AFP_C_NEAR_SIT_PARTIALLY_OPERATIONAL_HV', AFP.nbad_selector([1]), AFP.comment_SIT_HV),
554  (A_FAR_SIT_HV, 'AFP_A_FAR_SIT_NOT_OPERATIONAL_HV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_HV),
555  (A_NEAR_SIT_HV, 'AFP_A_NEAR_SIT_NOT_OPERATIONAL_HV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_HV),
556  (C_FAR_SIT_HV, 'AFP_C_FAR_SIT_NOT_OPERATIONAL_HV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_HV),
557  (C_NEAR_SIT_HV, 'AFP_C_NEAR_SIT_NOT_OPERATIONAL_HV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_HV),
558 
559  (A_FAR_SIT_LV, 'AFP_A_FAR_SIT_PARTIALLY_OPERATIONAL_LV', AFP.nbad_selector([1]), AFP.comment_SIT_LV),
560  (A_NEAR_SIT_LV, 'AFP_A_NEAR_SIT_PARTIALLY_OPERATIONAL_LV', AFP.nbad_selector([1]), AFP.comment_SIT_LV),
561  (C_FAR_SIT_LV, 'AFP_C_FAR_SIT_PARTIALLY_OPERATIONAL_LV', AFP.nbad_selector([1]), AFP.comment_SIT_LV),
562  (C_NEAR_SIT_LV, 'AFP_C_NEAR_SIT_PARTIALLY_OPERATIONAL_LV', AFP.nbad_selector([1]), AFP.comment_SIT_LV),
563  (A_FAR_SIT_LV, 'AFP_A_FAR_SIT_NOT_OPERATIONAL_LV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_LV),
564  (A_NEAR_SIT_LV, 'AFP_A_NEAR_SIT_NOT_OPERATIONAL_LV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_LV),
565  (C_FAR_SIT_LV, 'AFP_C_FAR_SIT_NOT_OPERATIONAL_LV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_LV),
566  (C_NEAR_SIT_LV, 'AFP_C_NEAR_SIT_NOT_OPERATIONAL_LV', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_LV),
567  (A_FAR_SIT_LV, 'AFP_A_FAR_SIT_NOT_OPERATIONAL_LV_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_LV),
568  (A_NEAR_SIT_LV, 'AFP_A_NEAR_SIT_NOT_OPERATIONAL_LV_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_LV),
569  (C_FAR_SIT_LV, 'AFP_C_FAR_SIT_NOT_OPERATIONAL_LV_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_LV),
570  (C_NEAR_SIT_LV, 'AFP_C_NEAR_SIT_NOT_OPERATIONAL_LV_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_LV),
571 
572  (A_FAR_TOF_LV, 'AFP_A_FAR_TOF_NOT_OPERATIONAL_LV', AFP.color_selector(RED), AFP.comment_TOF_LV),
573  (C_FAR_TOF_LV, 'AFP_C_FAR_TOF_NOT_OPERATIONAL_LV', AFP.color_selector(RED), AFP.comment_TOF_LV),
574 
575  (A_FAR_TOF_HV, 'AFP_A_FAR_TOF_NOT_OPERATIONAL_HV', AFP.color_selector(RED), AFP.comment_TOF_HV),
576  (C_FAR_TOF_HV, 'AFP_C_FAR_TOF_NOT_OPERATIONAL_HV', AFP.color_selector(RED), AFP.comment_TOF_HV),
577 
578 
581  (TTC_RESTART, 'AFP_TTC_RESTART', AFP.color_selector(RED), AFP.comment_TTC_RESTART),
582  (STOPLESSLY_REMOVED, 'AFP_STOPLESSLY_REMOVED', AFP.color_selector(RED), AFP.comment_STOPLESSLY_REMOVED),
583 
584  (A_FAR_SIT_DISABLED, 'AFP_A_FAR_SIT_PARTIALLY_OPERATIONAL_TDAQ', AFP.nbad_selector([1]), AFP.comment_SIT_DISABLED),
585  (A_NEAR_SIT_DISABLED, 'AFP_A_NEAR_SIT_PARTIALLY_OPERATIONAL_TDAQ', AFP.nbad_selector([1]), AFP.comment_SIT_DISABLED),
586  (C_FAR_SIT_DISABLED, 'AFP_C_FAR_SIT_PARTIALLY_OPERATIONAL_TDAQ', AFP.nbad_selector([1]), AFP.comment_SIT_DISABLED),
587  (C_NEAR_SIT_DISABLED, 'AFP_C_NEAR_SIT_PARTIALLY_OPERATIONAL_TDAQ', AFP.nbad_selector([1]), AFP.comment_SIT_DISABLED),
588  (A_FAR_SIT_DISABLED, 'AFP_A_FAR_SIT_NOT_OPERATIONAL_TDAQ', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_DISABLED),
589  (A_NEAR_SIT_DISABLED, 'AFP_A_NEAR_SIT_NOT_OPERATIONAL_TDAQ', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_DISABLED),
590  (C_FAR_SIT_DISABLED, 'AFP_C_FAR_SIT_NOT_OPERATIONAL_TDAQ', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_DISABLED),
591  (C_NEAR_SIT_DISABLED, 'AFP_C_NEAR_SIT_NOT_OPERATIONAL_TDAQ', AFP.nbad_selector([2, 3, 4]), AFP.comment_SIT_DISABLED),
592  (A_FAR_SIT_DISABLED, 'AFP_A_FAR_SIT_NOT_OPERATIONAL_TDAQ_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_DISABLED),
593  (A_NEAR_SIT_DISABLED, 'AFP_A_NEAR_SIT_NOT_OPERATIONAL_TDAQ_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_DISABLED),
594  (C_FAR_SIT_DISABLED, 'AFP_C_FAR_SIT_NOT_OPERATIONAL_TDAQ_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_DISABLED),
595  (C_NEAR_SIT_DISABLED, 'AFP_C_NEAR_SIT_NOT_OPERATIONAL_TDAQ_3PLANES', AFP.nbad_selector([3, 4]), AFP.comment_SIT_DISABLED),
596 
597  (A_FAR_TOF_DISABLED, 'AFP_A_FAR_TOF_NOT_OPERATIONAL_TDAQ', AFP.color_selector(RED), AFP.comment_TOF_DISABLED),
598  (C_FAR_TOF_DISABLED, 'AFP_C_FAR_TOF_NOT_OPERATIONAL_TDAQ', AFP.color_selector(RED), AFP.comment_TOF_DISABLED),
599  ]
600  ] + [
601  AFP.defect_combinator(*cdsac)
602  for cdsac in [
603  ([A_FAR_SIT_LV, A_FAR_SIT_DISABLED], 'AFP_A_FAR_SIT_NOT_OPERATIONAL', AFP.nbad_selector([1]), 2, AFP.comment_SIT_COMBINATION),
604  ([A_NEAR_SIT_LV, A_NEAR_SIT_DISABLED], 'AFP_A_NEAR_SIT_NOT_OPERATIONAL', AFP.nbad_selector([1]), 2, AFP.comment_SIT_COMBINATION),
605  ([C_FAR_SIT_LV, C_FAR_SIT_DISABLED], 'AFP_C_FAR_SIT_NOT_OPERATIONAL', AFP.nbad_selector([1]), 2, AFP.comment_SIT_COMBINATION),
606  ([C_NEAR_SIT_LV, C_NEAR_SIT_DISABLED], 'AFP_C_NEAR_SIT_NOT_OPERATIONAL', AFP.nbad_selector([1]), 2, AFP.comment_SIT_COMBINATION),
607  ([A_FAR_SIT_LV, A_FAR_SIT_DISABLED], 'AFP_A_FAR_SIT_NOT_OPERATIONAL_3PLANES', AFP.nbad_selector([1, 2]), 3, AFP.comment_SIT_COMBINATION),
608  ([A_NEAR_SIT_LV, A_NEAR_SIT_DISABLED], 'AFP_A_NEAR_SIT_NOT_OPERATIONAL_3PLANES', AFP.nbad_selector([1, 2]), 3, AFP.comment_SIT_COMBINATION),
609  ([C_FAR_SIT_LV, C_FAR_SIT_DISABLED], 'AFP_C_FAR_SIT_NOT_OPERATIONAL_3PLANES', AFP.nbad_selector([1, 2]), 3, AFP.comment_SIT_COMBINATION),
610  ([C_NEAR_SIT_LV, C_NEAR_SIT_DISABLED], 'AFP_C_NEAR_SIT_NOT_OPERATIONAL_3PLANES', AFP.nbad_selector([1, 2]), 3, AFP.comment_SIT_COMBINATION),
611  ]
612  ]
613 
614 
617 
618  @staticmethod
619  def comment_GARAGE(iov):
620  return 'Station not in physics'
621 
622  @staticmethod
623  def comment_SIT_LV(iov):
624  return AFP.comment_planes(iov, 'out of nominal current', SIT_LV[0])
625 
626  @staticmethod
627  def comment_SIT_HV(iov):
628  return AFP.comment_planes(iov, 'out of nominal voltage', SIT_HV[0])
629 
630  @staticmethod
631  def comment_TOF_LV(iov):
632  return AFP.comment_tof_tdc(iov, 'with too low current', TOF_LV[0])
633 
634  @staticmethod
635  def comment_TOF_HV(iov):
636  return 'ToF PMT out of nominal voltage'
637 
638 
641 
642  @staticmethod
644  return 'AFP not in the RUNNING state'
645 
646  @staticmethod
648  return 'AFP stoplessly removed from the run'
649 
650  @staticmethod
652  return AFP.comment_planes(iov, 'removed from readout', SIT_DISABLED[0])
653 
654  @staticmethod
656  return AFP.comment_tof_tdc(iov, 'removed from readout', TOF_DISABLED[0])
657 
658 
661 
662  @staticmethod
664  return "Combination of 'partially operational' defects"
665 
666 
669 
670  @staticmethod
671  def comment_planes(iov, message, defect_offset=None, module_tagger=None):
672  return AFP.comment_device(iov, 'SiT plane', message, defect_offset, module_tagger)
673 
674  @staticmethod
675  def comment_tof_tdc(iov, message, defect_offset=None, module_tagger=None):
676  return AFP.comment_device(iov, 'ToF TDC', message, defect_offset - 16, module_tagger)
677 
678  @staticmethod
679  def comment_device(iov, device, message, defect_offset=None, module_tagger=None):
680  count = iov.NConfig - iov.NWorking
681  if count != 1:
682  device += 's'
683  comment = f"{count} {device} {message}"
684  if defect_offset is None:
685  return comment
686  iovs = sorted([orig for orig in iov._orig_iovs if orig.good is False], key=lambda x: x.channel)
687  list = [NAMING[orig.channel - defect_offset] for orig in iovs]
688  if module_tagger is not None:
689  list = [f"{module} {module_tagger(orig)}" for module,orig in zip(list,iovs)]
690  return comment + f" ({', '.join(list)})"
python.subdetectors.afp.AFP
Definition: afp.py:355
python.libcore.map_channels
def map_channels(iovs, mapping, folder)
Definition: libcore.py:39
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
AtlasMcWeight::decode
double decode(number_type binnedWeight)
Convert weight from unsigned to double.
Definition: AtlasMcWeight.cxx:32
python.subdetectors.afp.AFP.calculate_dead_fraction
def calculate_dead_fraction(self, since, until, output_channel, states, state_iovs)
Definition: afp.py:473
python.subdetectors.afp.TDAQC_Variable.calculate_good_iovs
def calculate_good_iovs(self, lbtime, subdetector)
Definition: afp.py:183
python.subdetectors.afp.DCSC_Merged_Variable
Definition: afp.py:50
runLayerRecalibration.chain
chain
Definition: runLayerRecalibration.py:175
python.subdetectors.afp.AFP.comment_SIT_HV
def comment_SIT_HV(iov)
Definition: afp.py:627
python.subdetectors.afp.AFP.comment_STOPLESSLY_REMOVED
def comment_STOPLESSLY_REMOVED(iov)
Definition: afp.py:647
python.subdetectors.afp.AFP.comment_TTC_RESTART
def comment_TTC_RESTART(iov)
TDAQ defects.
Definition: afp.py:643
python.subdetectors.afp.TDAQC_Array_Variable.make_good_iov
def make_good_iov(self, iov)
Definition: afp.py:258
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
python.subdetectors.afp.DCSC_Merged_Variable.get_variable
def get_variable(self, name)
Definition: afp.py:58
python.subdetectors.afp.DCSC_Multi_Channel_Variable
Definition: afp.py:35
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
python.sugar.iovtype.RANGEIOV_VAL
def RANGEIOV_VAL()
Definition: iovtype.py:153
python.subdetectors.afp.DCSC_Merged_Variable.merge_input_variables
def merge_input_variables(self, *inputs)
Definition: afp.py:86
python.subdetectors.afp.mapChannels
def mapChannels(*mapseqArgs)
Definition: afp.py:346
python.subdetectors.afp.TDAQC_Variable.iovs
iovs
Definition: afp.py:211
python.subdetectors.afp.TDAQC_Variable
Definition: afp.py:110
python.subdetectors.afp.AFP.mapping
mapping
Definition: afp.py:454
python.subdetectors.afp.TDAQC_Variable.path
path
Definition: afp.py:131
python.subdetectors.afp.TDAQC_Variable.input_hashes
input_hashes
Definition: afp.py:132
python.variable.DefectIOV
def DefectIOV(channel, present, comment)
Definition: variable.py:26
python.subdetectors.afp.AFP.translators
translators
Definition: afp.py:539
python.subdetectors.afp.TDAQC_Variable.read
def read(self, query_range, query, *regex=False)
Definition: afp.py:137
python.subdetectors.afp.AFP.comment_TOF_LV
def comment_TOF_LV(iov)
Definition: afp.py:631
python.subdetectors.afp.TDAQC_Variable.timePBeast2COOL
def timePBeast2COOL(timestamp)
Definition: afp.py:121
python.subdetectors.afp.TDAQC_Variable.empty_value
empty_value
Definition: afp.py:129
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.subdetectors.afp.AFP.comment_tof_tdc
def comment_tof_tdc(iov, message, defect_offset=None, module_tagger=None)
Definition: afp.py:675
python.subdetectors.afp.TDAQC_Multi_Channel_Variable
Definition: afp.py:222
python.subdetectors.afp.get_sit_current
SiT_LV_Current_Type get_sit_current(float timestamp)
Definition: afp.py:294
python.utils.AtlRunQueryTimer.timer
def timer(name, disabled=False)
Definition: AtlRunQueryTimer.py:86
python.subdetectors.afp.TDAQC_Array_Variable
Definition: afp.py:257
python.variable.GoodIOV
def GoodIOV(channel, good)
Definition: variable.py:18
python.sugar.runlumi.RunLumi
RunLumi
Definition: runlumi.py:131
python.subdetectors.afp.DCSC_Merged_Variable.__init__
def __init__(self, folders, evaluator, *mapping={}, **kwargs)
Definition: afp.py:51
python.subdetectors.afp.TDAQC_Variable.__init__
def __init__(self, query, evaluator, *regex=False, mapping=dict(), force_mapping=False, empty_value=None)
Definition: afp.py:124
python.subdetectors.afp.TDAQC_Variable.make_good_iov
def make_good_iov(self, iov)
Definition: afp.py:214
python.subdetectors.afp.TDAQC_Multi_Channel_Variable.make_good_iovs
def make_good_iovs(self, iovs)
Definition: afp.py:234
python.subdetectors.afp.DCSC_Multi_Channel_Variable.make_good_iov
def make_good_iov(self, iov)
Definition: afp.py:36
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
python.subdetectors.afp.DCSC_Merged_Variable.folder_names
folder_names
Definition: afp.py:55
python.subdetectors.afp.AFP.color_selector
def color_selector(color)
Definition: afp.py:525
python.subdetectors.afp.AFP.comment_TOF_DISABLED
def comment_TOF_DISABLED(iov)
Definition: afp.py:655
python.subdetectors.afp.AFP.comment_planes
def comment_planes(iov, message, defect_offset=None, module_tagger=None)
Comment templates.
Definition: afp.py:671
python.subdetectors.afp.load_sit_current
tuple[list[float], list[SiT_LV_Current_Type]] load_sit_current()
Definition: afp.py:272
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.subdetectors.afp.DCSC_Merged_Variable.read
def read(self, query_range, folder_base, folder_names)
Definition: afp.py:64
python.subdetectors.afp.AFP.dead_fraction_caution
int dead_fraction_caution
Definition: afp.py:451
python.subdetectors.afp.TDAQC_Variable.subdetector
subdetector
Definition: afp.py:188
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.subdetectors.afp.AFP.__init__
def __init__(self, *args, **kwargs)
Definition: afp.py:537
python.subdetectors.afp.AFP.defect_translator
def defect_translator(channel, defect_name, selector, comment)
Definition: afp.py:503
python.subdetectors.afp.mapTranslatorCounts
def mapTranslatorCounts(countMap)
Definition: afp.py:349
python.subdetectors.afp.TDAQC_Variable.__repr__
def __repr__(self)
Definition: afp.py:134
python.subdetectors.afp.PBeastIOV
def PBeastIOV(channel, value)
Definition: afp.py:107
python.events.process_iovs
def process_iovs(*iovsets)
Definition: events.py:30
python.subdetectors.afp.AFP.comment_SIT_DISABLED
def comment_SIT_DISABLED(iov)
Definition: afp.py:651
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
CaloCondBlobAlgs_fillNoiseFromASCII.comment
string comment
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:27
python.subdetectors.afp.AFP.comment_SIT_COMBINATION
def comment_SIT_COMBINATION()
Combination defects.
Definition: afp.py:663
python.subdetectors.afp.TDAQC_Variable.query
query
Definition: afp.py:130
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.subdetectors.afp.DCSC_Multi_Channel_Variable.make_good_iovs
def make_good_iovs(self, iovs)
Definition: afp.py:44
python.subdetectors.afp.AFP.comment_TOF_HV
def comment_TOF_HV(iov)
Definition: afp.py:635
python.subdetectors.afp.SIT_LV_CURRENT_LOW
SiT_LV_Current_Type SIT_LV_CURRENT_LOW
Definition: afp.py:341
python.subdetectors.afp.DCSC_Merged_Variable.mapping
mapping
Definition: afp.py:56
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:71
python.subdetectors.afp.DCSC_Variable_With_Mapping.mapping
mapping
Definition: afp.py:27
python.subdetectors.afp.DCSC_Variable_With_Mapping
Definition: afp.py:24
python.subdetectors.afp.TDAQC_Variable.mapping
mapping
Definition: afp.py:127
python.subdetectors.afp.TDAQC_Variable.timeCOOL2PBeast
def timeCOOL2PBeast(timestamp)
Definition: afp.py:117
python.subdetectors.afp.AFP.comment_SIT_LV
def comment_SIT_LV(iov)
Definition: afp.py:623
python.subdetectors.afp.DCSC_Variable_With_Mapping.__init__
def __init__(self, folder, evaluator, *mapping=None, **kwargs)
Definition: afp.py:25
python.selector.AtlRunQuerySelectorLhcOlc.selector
selector
Definition: AtlRunQuerySelectorLhcOlc.py:611
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.subdetectors.afp.AFP.dead_fraction_bad
float dead_fraction_bad
Definition: afp.py:452
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
python.subdetectors.afp.AFP.nbad_selector
def nbad_selector(nbad)
Definition: afp.py:531
python.subdetectors.afp.AFP.defect_combinator
def defect_combinator(channels, defect_name, selector, naffected, comment)
Definition: afp.py:510
python.subdetectors.afp.DCSC_Variable_With_Mapping.read
def read(self, query_range, folder_base, folder_name)
Definition: afp.py:29
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:127
python.subdetectors.afp.TDAQC_Bit_Flag_Variable
Definition: afp.py:243
python.sugar.iovtype.make_iov_type
def make_iov_type(name, variables, bases=(IOVType,), _memoized={})
Definition: iovtype.py:114
python.subdetectors.afp.TDAQC_Multi_Channel_Variable.make_good_iov
def make_good_iov(self, iov)
Definition: afp.py:223
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
python.subdetectors.afp.TDAQC_Variable.force_mapping
force_mapping
Definition: afp.py:128
python.subdetectors.afp.AFP.comment_GARAGE
def comment_GARAGE(iov)
DCS defects.
Definition: afp.py:619
python.subdetectors.afp.TDAQC_Variable.regex
regex
Definition: afp.py:126
python.subdetectors.afp.remove_None
def remove_None(value, default)
Definition: afp.py:352
python.subdetectors.afp.TDAQC_Bit_Flag_Variable.make_good_iov
def make_good_iov(self, iov)
Definition: afp.py:244
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.subdetectors.afp.AFP.comment_device
def comment_device(iov, device, message, defect_offset=None, module_tagger=None)
Definition: afp.py:679
python.subdetectors.afp.DCSC_Merged_Variable.merge_inputs
def merge_inputs(self, clazz, channel, *inputs)
Definition: afp.py:102
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65
python.subdetectors.afp.AFP.merge_variable_states
def merge_variable_states(self, states)
Definition: afp.py:460