92 PropagateDefectsToStatus=True) :
93 """
94 Schedule algorithms to create ITk strip defect conditions data and to emulate
95 defects by dropping ITk strip RDOs overlapping with such defects. ModuleDefectProb controls the number of
96 defect strip modules and DefectProb the number of defect strips. If a strip group is overlapping with
97 a single strip defect, the strip group will be split.
98 """
99
100 from InDetDefectsEmulation.StripDefectsEmulatorConfig import (
101 ITkStripDefectsEmulatorCondAlgCfg,
102 ITkStripDefectsEmulatorAlgCfg,
103 ITkStripDefectsEmulatorToDetectorElementStatusCondAlgCfg,
104 DefectsHistSvcCfg,
105 moduleDefect,
106 combineModuleDefects,
107
108 EVEN_INDEX
109 )
111
112 if HistogramFileName is None or len(HistogramFileName) ==0 :
113 HistogramGroupName = None
114 if HistogramGroupName is not None :
115 cfg.merge( DefectsHistSvcCfg(flags, HistogramGroup=HistogramGroupName, FileName=HistogramFileName))
116
117
118 fractions=mergeFractions(StripDefectProb,[1.],coldNoiseDefectProb,coldNoiseNDefectFractions)
119 if fractions is None :
120 fractions = [1.]
121
122
123
124 expectation_value = expectationValue(fractions)
125 coldNoiseDefectProb=coldNoiseDefectProb/expectation_value if expectation_value>0. else 0.
126
127 cold_noise_phi_range=EVEN_INDEX if coldNoiseDefectsEvenOnly else [-99,99]
128
129
130
131 if True :
132 module_pattern, module_defect_prob, fractions, ignore_NoiseProbability,ignore_NoiseShape, cornerDefectParam, cornerDefectFractions = combineModuleDefects([
133
134
135 moduleDefect(bec=[-2,-2],layer=[0,99], phi_range=cold_noise_phi_range,eta_range=[14,17],
136 side_range=[0,0,1,1],
137 all_rows=False,
138 probability=[ModuleDefectProb,
139 StripDefectProb+coldNoiseDefectProb,
140 ],
141 fractionsOfNDefects=[fractions]),
142 moduleDefect(bec=[2,2],layer=[0,99], phi_range=cold_noise_phi_range,eta_range=[14,17],
143 side_range=[0,0,1,1],
144 all_rows=False,
145 probability=[ModuleDefectProb,
146 StripDefectProb+coldNoiseDefectProb
147 ],
148 fractionsOfNDefects=[fractions]),
149 moduleDefect(bec=[-2,-2],layer=[0,99], phi_range=[-99,99],eta_range=[14,17],
150 side_range=[0,0,1,1],
151 all_rows=False,
152 probability=[ModuleDefectProb,
153 StripDefectProb
154 ]),
155 moduleDefect(bec=[2,2],layer=[0,99], phi_range=[-99,99],eta_range=[14,17],
156 side_range=[0,0,1,1],
157 all_rows=False,
158 probability=[ModuleDefectProb,
159 StripDefectProb
160 ]),
161 moduleDefect(bec=[-2,-2],layer=[0,99], phi_range=[-99,99],eta_range=[-99,99],
162 side_range=[0,0,1,1],
163 all_rows=False,
164 probability=[ModuleDefectProb,
165 StripDefectProb
166 ]),
167 moduleDefect(bec=[-1,1],layer=[0,1], phi_range=[-99,99],eta_range=[-99,99],
168 side_range=[0,0,1,1],
169 all_rows=False,
170 probability=[ModuleDefectProb,
171 StripDefectProb
172 ]),
173 moduleDefect(bec=[-1,1],layer=[2,99], phi_range=[-99,99],eta_range=[-99,99],
174 side_range=[0,0,1,1],
175 all_rows=False,
176 probability=[ModuleDefectProb,
177 StripDefectProb
178 ]),
179 moduleDefect(bec=[2,2],layer=[0,99], phi_range=[-99,99],eta_range=[-99,99],
180 side_range=[0,0,1,1],
181 all_rows=False,
182 probability=[ModuleDefectProb,
183 StripDefectProb
184 ])])
185 NDefectFractionsPerPattern = fractions
186
187 if NoiseProb > 0. :
188
189 import math
190 def norm(dist) :
191 scale = sum(dist)
192 return [elm/scale if scale > 0. else 0. for elm in dist]
193 def gaussDist(mean, width, n) :
194 scale = -1./(2*width)
195 return norm([ math.exp( scale *math.pow(i - mean,2.) ) for i in range(0,n) ])
196
197 time_bin_dist = gaussDist(1.51,0.03,3)
198
199
200 defects=[]
201 for length in [15093,18093,18981,23981,24092,24180,26223,27093,28980,30807,30808,31981,32223,40161,48360,54580,54581,60162] :
202
203 defects += [ moduleDefect(column_or_strip_length=[length-1,length+1],
204 probability=[],
205 noiseProbability=NoiseProb * 0.5*( 1 + length / 37627.5 ),
206 noiseShape=time_bin_dist)]
207 module_pattern_noise, ignore_module_defect_prob, ignore_fractions, NoiseProbability,NoiseShape,cornerDefectParam,cornerDefectFractions = combineModuleDefects(defects)
208 else :
209 module_pattern_noise=[]
210 NoiseProbability=[]
211 NoiseShape=[]
212
213
214 cfg.merge( ITkStripDefectsEmulatorCondAlgCfg(flags,
215
216 HistogramGroupName=f"/{HistogramGroupName}/StripEmulatedDefects/" if HistogramGroupName is not None else "",
217 MaxRandomPositionAttempts=MaxRandomPositionAttempts,
218 ModulePatterns=module_pattern,
219 DefectProbabilities=module_defect_prob,
220 NDefectFractionsPerPattern = NDefectFractionsPerPattern,
221 CornerDefectParamsPerPattern=[],
222 NCornerDefectFractionsPerPattern=[],
223 RngPerDefectType=RngPerDefectType,
224 DefectsInputFiles=DefectsInputFiles,
225 DefectsOutputFile=DefectsOutputFile,
226 FillHistogramsPerPattern=FillHistogramsPerPattern,
227 FillEtaPhiHistogramsPerPattern=FillEtaPhiHistogramsPerPattern,
228 WriteKey="ITkStripEmulatedDefects",
229 ))
230
231
232 cfg.merge( ITkStripDefectsEmulatorAlgCfg(flags,
233
234 EmulatedDefectsKey="ITkStripEmulatedDefects",
235 ModulePatterns=module_pattern_noise,
236 NoiseProbability = NoiseProbability,
237 NoiseShape = NoiseShape,
238
239 HistogramGroupName=f"/{HistogramGroupName}/StripRejectedRDOs/" if HistogramGroupName is not None else "",
240 OutputLevel=INFO))
241
242 if PropagateDefectsToStatus :
243
244 cfg.merge(ITkStripDefectsEmulatorToDetectorElementStatusCondAlgCfg(flags,
245 name="ITkStripDefectsEmulatorToDetectorElementStatusCondAlg",
246 EmulatedDefectsKey="ITkStripEmulatedDefects",
247 WriteKey="ITkStripDetectorElementStatusFromEmulatedDefects"))
248 strip_det_el_status_cond_alg=cfg.getCondAlgo("ITkStripDetectorElementStatusCondAlgNoByteStreamErrors")
249 strip_det_el_status_cond_alg.ConditionsSummaryTool.SCTDetElStatusCondDataBaseKey="ITkStripDetectorElementStatusFromEmulatedDefects"
250