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