66def compute_lumi_many_channels(lbs, lumis, iovs, exclude_iovsets=[], good_runs=None):
67 """
68 Compute luminosity per channel for an IOVSet iovs using
69 lbs, lumis from fetch_lumi_inputs.
70
71 exclude_iovsets is a list of IOVSets for channels to be excluded from the
72 calculation such as not_ready, busy, etc.
73
74 good_runs is an optional set of runs to consider, such as the set of runs
75 which are OK for physics.
76
77 Return type is a dictionary of {channel name: lumi}
78 """
79
80 chans, iovsets = iovs.chans_iovsets
81 result = {}
82
83
84
85
86
87
88
89
90
91
92
93
94
95 num_exclude = len(exclude_iovsets)
96 full_iovsets = exclude_iovsets
97 full_iovsets.extend(iovsets)
98 inputs = process_iovs(lbs, lumis, *full_iovsets)
99 for since, until, states in inputs:
100
101
102
103 (lb, lumi), defectstates = states[:2], states[2:]
104 excludes, defects = defectstates[:num_exclude], defectstates[num_exclude:]
105
106
107
108
109 if not lb or not lumi or any(excludes):
110 continue
111
112
113 if good_runs and since.run not in good_runs:
114 continue
115
116
117 lumi = (lb.EndTime - lb.StartTime)/1e9 * lumi.LBAvInstLumi
118
119 for name, defect_iov in zip(chans, defects):
120 if defect_iov:
121 result[name] = result.get(name, 0) + lumi
122
123 return result
124