Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
DefectsEmulatorCondAlgBase.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
5 
7 #include "CLHEP/Random/RandPoisson.h"
8 #include "CLHEP/Random/RandFlat.h"
9 
10 #include "HistUtil.h"
12 #include <numeric>
13 #include <cmath>
14 
15 namespace InDet{
16 
17  DefectsEmulatorCondAlgBase::DefectsEmulatorCondAlgBase(const std::string &name, ISvcLocator *pSvcLocator)
18  : AthReentrantAlgorithm(name, pSvcLocator)
19  {}
20 
21  StatusCode DefectsEmulatorCondAlgBase::initializeBase(unsigned int n_masks, unsigned int wafer_hash_max){
22  ATH_CHECK(m_rndmSvc.retrieve());
23  m_rngName = name()+"RandomEngine";
26 
27  if (!m_histSvc.name().empty() && !m_histogramGroupName.value().empty()) {
28  ATH_CHECK(m_histSvc.retrieve());
30  // allow histogramming for at most 6 different pixel module types
31  // histgram for additional module types will end up in the last histogram
32  unsigned int n_pattern_for_histogramming = m_fillHistogramsPerPattern ? m_modulePattern.size() : 1;
33  constexpr unsigned int n_different_matrices_max=6;
34  m_dimPerHist.resize(n_pattern_for_histogramming);
35  m_hist.resize(n_pattern_for_histogramming);
36  if (!m_groupDefectHistNames.empty()) {
37  m_groupDefectHists.resize(n_pattern_for_histogramming);
38  }
39  for (unsigned int pattern_i=0; pattern_i < n_pattern_for_histogramming; ++pattern_i) {
40  m_dimPerHist[pattern_i].reserve(n_different_matrices_max);
41  m_hist[pattern_i].reserve(n_different_matrices_max);
42  }
43  std::vector<std::string> hist_name {
44  "matrix_type_id_per_module;Matrix type ID per module",
45  "defect_module;Module is defect",
46  "defects_per_module;Defect cells per module"};
47  for (const std::string &group_name: m_groupDefectHistNames) {
49  hname << group_name << "defects_per_module;" << group_name <<" defects per module";
50  hist_name.push_back(hname.str());
51  }
52  m_moduleHist.resize(n_pattern_for_histogramming);
53  unsigned int max_y_axis = (((wafer_hash_max+99)/100+9)/10)*10;
54 
55  for (unsigned int pattern_i=0; pattern_i<m_moduleHist.size(); ++pattern_i) {
56  m_moduleHist.at(pattern_i).resize(hist_name.size(), nullptr);
57  for (unsigned int hist_i=0; hist_i<hist_name.size(); ++hist_i) {
58  // support idHashes from 0 to 10k
59  std::string::size_type pos = hist_name.at(hist_i).find(";");
60  HistUtil::StringCat a_name;
61  a_name << hist_name[hist_i].substr(0, (pos != std::string::npos ? pos : hist_name[hist_i].size())) << "_" << pattern_i;
62  HistUtil::StringCat a_title;
63  a_title << hist_name[hist_i].substr((pos != std::string::npos ? pos+1 : 0), hist_name[hist_i].size())
64  << " ( module pattern " << pattern_i << ")";
65  {
67  m_moduleHist.at(pattern_i).at(hist_i) = new TH2F(a_name.str().c_str(), a_title.str().c_str(),
68  100, -0.5, 100-0.5,
69  max_y_axis, -0.5, max_y_axis-0.5);
70  }
71  m_moduleHist[pattern_i][hist_i]->GetXaxis()->SetTitle("ID hash % 100");
72  m_moduleHist[pattern_i][hist_i]->GetYaxis()->SetTitle("ID hash / 100");
73  ATH_MSG_VERBOSE("Create histogram pattern " << pattern_i << " hist " << hist_i << " name " << a_name.str().c_str()
74  << " -> " << m_moduleHist[pattern_i][hist_i]->GetName());
75  if ( m_histSvc->regHist(m_histogramGroupName.value() + m_moduleHist[pattern_i][hist_i]->GetName(),
76  m_moduleHist[pattern_i][hist_i]).isFailure() ) {
77  return StatusCode::FAILURE;
78  }
79  }
80  }
81 
82  unsigned int n_eta_phi_histograms = m_fillEtaPhiHistogramsPerPattern ? m_modulePattern.size() : 1;
83  for (unsigned int pos_i=0; pos_i<m_defectModuleEtaPhiHist.size(); ++pos_i) {
84  m_defectModuleEtaPhiHist.at(pos_i).resize(n_eta_phi_histograms, nullptr);
85  m_defectModuleEtaLayerHist.at(pos_i).resize(n_eta_phi_histograms, nullptr);
86  }
87  std::array<std::string_view, kNPosHists> pos_hist_name {
88  "defect_modules",
89  "modules_with_defects"
90  };
91  std::array<std::string_view, kNPosHists> pos_hist_title {
92  "Defect modules",
93  "Modules with defects"
94  };
95  for (unsigned pattern_i=0; pattern_i< n_eta_phi_histograms; ++pattern_i) {
96  for (unsigned int pos_i=0; pos_i<m_defectModuleEtaPhiHist.size(); ++pos_i) {
97  {
98  HistUtil::StringCat a_name;
99  a_name << pos_hist_name.at(pos_i) << "_zr" << "_" << pattern_i;
100  HistUtil::StringCat a_title;
101  a_title << pos_hist_title.at(pos_i) << " vs global zr" << " ( module pattern " << pattern_i << ")";
102  {
104  m_defectModuleEtaPhiHist.at(pos_i).at(pattern_i) = new TH2F(a_name.str().c_str(), a_title.str().c_str(),
105  200, -3000, 3000,
106  200, 0, 1050
107  );
108  }
109  if ( m_histSvc->regHist(m_histogramGroupName.value() + m_defectModuleEtaPhiHist.at(pos_i).at(pattern_i)->GetName(),
110  m_defectModuleEtaPhiHist.at(pos_i).at(pattern_i)).isFailure() ) {
111  return StatusCode::FAILURE;
112  }
113  }
114  {
115  HistUtil::StringCat a_name;
116  a_name << pos_hist_name.at(pos_i) << "_xy" << "_" << pattern_i;
117  HistUtil::StringCat a_title;
118  a_title << pos_hist_title.at(pos_i) << " vs global xy" << " ( module pattern " << pattern_i << ")";
119  {
121  m_defectModuleEtaLayerHist.at(pos_i).at(pattern_i) = new TH2F(a_name.str().c_str(), a_title.str().c_str(),
122  200, -1050,1050,
123  200, -1050,1050
124  );
125  }
126  if ( m_histSvc->regHist(m_histogramGroupName.value() + m_defectModuleEtaLayerHist.at(pos_i).at(pattern_i)->GetName(),
127  m_defectModuleEtaLayerHist.at(pos_i).at(pattern_i)).isFailure() ) {
128  return StatusCode::FAILURE;
129  }
130  }
131  }
132  }
133 
134  if (n_masks>1) {
135  m_maxNGroupDefects.resize( n_masks-1, 0u);
136  for (const std::vector<std::vector<float> > &fractions_per_pattern : m_perPatternAndMaskFractions) {
137  for (unsigned int mask_i=0; mask_i<n_masks-1; ++mask_i) {
138  m_maxNGroupDefects[mask_i] = std::max(m_maxNGroupDefects[mask_i], static_cast<unsigned int>(fractions_per_pattern[mask_i].size()));
139  }
140  }
141 
142  if (m_groupDefectHistNames.size() != n_masks-1) {
143  ATH_MSG_FATAL("m_groupDefectHistNames does not contain a name per mask starting from the second mask "
144  "(the first mask must be the full matrix)");
145  return StatusCode::FAILURE;
146  }
147  if (m_maxNGroupDefects.size() != n_masks-1) {
148  ATH_MSG_FATAL("m_maxNGroupDefects does not contain a upper bin value for number of expected defects "
149  "per mask starting from the second mask (the first mask must be the full matrix)");
150  return StatusCode::FAILURE;
151  }
152  }
153  }
154 
155  return StatusCode::SUCCESS;
156  }
157 
158 
159  StatusCode DefectsEmulatorCondAlgBase::checkProbabilities(unsigned int n_probabilities) const {
160  if (!(m_modulePattern.size() == m_defectProbability.size()
162  && ModuleIdentifierMatchUtil::verifyElementCount<double>(m_defectProbability.value(), n_probabilities))) {
163  if (m_modulePattern.size() != m_defectProbability.size()) {
164  ATH_MSG_ERROR( "size difference modulePattern vs defectProbability : " << m_modulePattern.size() << " != " << m_defectProbability.size() << "?");
165  }
167  if (!ret) {
168  ATH_MSG_ERROR( "Order problem in modulePattern : " << ret << "?");
169  }
170  ret = ModuleIdentifierMatchUtil::verifyElementCount<double>(m_defectProbability.value(), n_probabilities);
171  if (!ret) {
172  ATH_MSG_ERROR( "Size problem in defectProbability : " << ret << " ( n_prob" << n_probabilities << ")?");
173  }
174  }
175  return m_modulePattern.size() == m_defectProbability.size()
177  && ModuleIdentifierMatchUtil::verifyElementCount<double>(m_defectProbability.value(), n_probabilities)
178  ? StatusCode::SUCCESS : StatusCode::FAILURE;
179  }
180 
183  ATH_MSG_WARNING("No defect parameters for " << m_modulesWithoutDefectParameters << " modules.");
184  }
185  return StatusCode::SUCCESS;
186  }
187 
188 
189  unsigned int DefectsEmulatorCondAlgBase::throwNumberOfDefects(CLHEP::HepRandomEngine *rndmEngine,
190  const std::vector<unsigned int> &module_pattern_idx,
191  unsigned int n_masks,
192  unsigned int n_cells,
193  std::vector<unsigned int> &n_mask_defects) const
194  {
195  n_mask_defects.clear();
196  n_mask_defects.resize(n_masks, 0u);
197 
198  // to avoid throwing random numbers if not necessary
199  // first identify the masks for which random numbers need to be thrown.
200  std::vector<bool> has(n_masks, false);
201  for (unsigned int mask_i=n_masks; mask_i-->1; ) {
202  for (unsigned int match_i: module_pattern_idx) {
203  assert(!m_perPatternAndMaskFractions.at(match_i).at(mask_i-1).empty());
204  if (m_perPatternAndMaskFractions.at(match_i).at(mask_i-1).back()>0.) {
205  has[mask_i]=true;
206  break;
207  }
208  }
209  }
210 
211  for (unsigned int mask_i=n_masks; mask_i-->1; ) {
212  assert( mask_i>0);
213  float prob = !has.at(mask_i) ? 1. : CLHEP::RandFlat::shoot(rndmEngine,1.);
214 
215  for (unsigned int match_i: module_pattern_idx) {
216  unsigned int n_mask_defects_idx=m_perPatternAndMaskFractions.at(match_i).at(mask_i-1).size();
217  for (; n_mask_defects_idx-->0 && prob <= m_perPatternAndMaskFractions[match_i][mask_i-1][n_mask_defects_idx];);
218  if (++n_mask_defects_idx < m_perPatternAndMaskFractions[match_i][mask_i-1].size()) {
219  n_mask_defects[mask_i] = n_mask_defects_idx+1;
220  break;
221  }
222 
223  prob -= m_perPatternAndMaskFractions[match_i][mask_i-1].back();
224  if (prob<=0.f) break;
225  }
226  }
227  double defect_prob = totalProbability(module_pattern_idx,kCellDefectProb);
228  n_mask_defects[0]= static_cast<unsigned int>(std::max(0,static_cast<int>(
229  CLHEP::RandPoisson::shoot(rndmEngine,
230  n_cells * defect_prob))));
231  return std::accumulate(n_mask_defects.begin(),n_mask_defects.end(), 0u);
232  }
233 
234  void DefectsEmulatorCondAlgBase::printSummaryOfDefectGeneration([[maybe_unused]] unsigned int n_masks,
235  unsigned int n_error,
236  unsigned int n_defects_total,
237  const std::vector<std::array<unsigned int,kNCounts> >&counts) const {
238  assert(counts.size() == n_masks+1 );
239  msg(MSG::INFO) << "Total cells: " << counts[0][kNElements] << ", module design of wrong type: " << n_error << ", defects "
240  << n_defects_total << ".\n";
241  for (unsigned int mask_i=0; mask_i < counts.size(); ++mask_i) {
242  msg() << "Defect " << (mask_i==0 ? "cells" : (mask_i>m_groupDefectHistNames.size() ? "modules" : m_groupDefectHistNames.at(mask_i-1)))
243  << " " << counts[mask_i][kNDefects] << " / " << counts[mask_i][kNElements];
244  if (counts[mask_i][kNRetries]>0 || counts[mask_i][kNMaxRtriesExceeded]>0) {
245  msg() << "(";
246  if (counts[mask_i][kNRetries]>0) {
247  msg() << "retries " << counts[mask_i][kNRetries];
248  if (counts[mask_i][kNMaxRtriesExceeded]>0) {
249  msg() << ";";
250  }
251  }
252  if (counts[mask_i][kNMaxRtriesExceeded]>0) {
253  msg() << "exceeded max attempts " << counts[mask_i][kNMaxRtriesExceeded];
254  }
255  msg() << ")";
256  }
257  if (counts[mask_i][kMaxDefectsPerModule]>0) {
258  msg() << " max/module " <<counts[mask_i][kMaxDefectsPerModule];
259  }
260  if (mask_i+1<counts.size()) {
261  msg() << ".\n";
262  }
263  }
264  msg() << endmsg;
265  }
266 
267  std::pair<unsigned int,unsigned int> DefectsEmulatorCondAlgBase::findHist(unsigned int pattern_i, unsigned int n_rows, unsigned int n_cols) const {
268  unsigned int key=(n_rows << 16) | n_cols;
269  assert( pattern_i < m_dimPerHist.size());
270  assert( pattern_i < m_hist.size());
271  unsigned int matrix_type_id;
272  {
273  std::vector<unsigned int>::const_iterator global_iter = std::find(m_matrixTypeId.begin(), m_matrixTypeId.end(), key );
274  if (global_iter != m_matrixTypeId.end()) {
275  matrix_type_id = global_iter - m_matrixTypeId.begin();
276  }
277  else {
278  matrix_type_id =m_matrixTypeId.size();
279  m_matrixTypeId.push_back(key);
280  }
281  }
282 
283  std::vector<unsigned int>::const_iterator iter = std::find(m_dimPerHist[pattern_i].begin(), m_dimPerHist[pattern_i].end(), key );
284  if (iter == m_dimPerHist[pattern_i].end()) {
286  name << "defects_" << pattern_i << "_" << (matrix_type_id) << "_" << n_rows << "_" << n_cols;
288  title << "Defects for " << n_rows << "(rows) #times " << n_cols << " (columns) ID " << (matrix_type_id) << ", pattern " << pattern_i;
289  {
291  m_hist[pattern_i].push_back(new TH2F(name.str().c_str(), title.str().c_str(),
292  n_cols, -0.5, n_cols-0.5,
293  n_rows, -0.5, n_rows-0.5
294  ));
295  }
296  m_hist[pattern_i].back()->GetXaxis()->SetTitle("offline column");
297  m_hist[pattern_i].back()->GetYaxis()->SetTitle("offline row");
298  if ( m_histSvc->regHist(m_histogramGroupName.value() + name.str(),m_hist[pattern_i].back()).isFailure() ) {
299  throw std::runtime_error("Failed to register histogram.");
300  }
301  m_dimPerHist[pattern_i].push_back(key);
302 
303  if (!m_groupDefectHists.empty()) {
304  assert( pattern_i < m_groupDefectHists.size());
305  assert( m_groupDefectHistNames.size() == m_maxNGroupDefects.size());
306  m_groupDefectHists[pattern_i].emplace_back();
307  m_groupDefectHists[pattern_i].back().resize(m_groupDefectHistNames.size());
308  for (unsigned int group_i=0u; group_i < m_groupDefectHistNames.size(); ++group_i) {
309  const std::string &group_name = m_groupDefectHistNames[group_i];
311  hname << "n_" << group_name << "_" << pattern_i << "_" << matrix_type_id << "_" << n_rows << "_" << n_cols;
312  HistUtil::StringCat htitle;
313  htitle << "Number of " << group_name << " defects for " << n_rows << "(rows) #times " << n_cols << " (columns) ID "
314  << (matrix_type_id) << ", pattern " << pattern_i;
315 
316  {
318  assert(group_i < m_groupDefectHists[pattern_i].back().size());
319  m_groupDefectHists[pattern_i].back()[group_i]= new TH1F(hname.str().c_str(), htitle.str().c_str(),
320  m_maxNGroupDefects[group_i]+1, -0.5,m_maxNGroupDefects[group_i]+.5);
321  }
322  if (m_histSvc->regHist(m_histogramGroupName.value() + m_groupDefectHists[pattern_i].back()[group_i]->GetName(),
323  m_groupDefectHists[pattern_i].back()[group_i]).isFailure() ) {
324  throw std::runtime_error("Failed to register histogram.");
325  }
326  }
327  }
328  return std::make_pair(static_cast<unsigned int>(m_hist[pattern_i].size()-1), matrix_type_id);
329  }
330  else {
331  return std::make_pair(static_cast<unsigned int>(iter-m_dimPerHist[pattern_i].begin()), matrix_type_id);
332  }
333  }
334 
335  namespace {
336  MsgStream &operator<<(MsgStream &out, const std::vector<float> &values) {
337  for (float value : values) {
338  out << " " << value;
339  }
340  return out;
341  }
342  }
343 
345  if (n_masks>1) {
346  if (m_nDefectFractionsPerPattern.size() != m_modulePattern.size()) {
347  ATH_MSG_ERROR("The number of fraction lists per pattern does not match the number of module patterns: "
348  << m_nDefectFractionsPerPattern.size() << " != " << m_modulePattern.size());
349  return StatusCode::FAILURE;
350  }
351  if (m_defectProbability.size() != m_modulePattern.size()) {
352  ATH_MSG_ERROR("The number of probability lists per pattern does not match the number of module patterns: "
353  << m_defectProbability.size() << " != " << m_modulePattern.size());
354  return StatusCode::FAILURE;
355  }
357  for (unsigned int pattern_i=0; pattern_i< m_perPatternAndMaskFractions.size(); ++pattern_i) {
358  m_perPatternAndMaskFractions[pattern_i].reserve( n_masks-1);
359  m_perPatternAndMaskFractions[pattern_i].emplace_back();
360  if (m_defectProbability[pattern_i].size() != kCellDefectProb + n_masks) {
361  ATH_MSG_ERROR("There should be one probability for the module to be defect, one probability for a pixel/strip etc. "
362  "to be defect and one probability for each group to be defect i.e. "
363  << (kCellDefectProb + n_masks) << " probabilities, but there are "
364  << m_defectProbability.size() << " for pattern " << pattern_i);
365  return StatusCode::FAILURE;
366  }
367  double sum=0.;
368  for (unsigned int value_i=0; value_i< m_nDefectFractionsPerPattern[pattern_i].size(); ++value_i) {
369  if (m_nDefectFractionsPerPattern[pattern_i][value_i]<0.) {
370  if (value_i+1 < m_nDefectFractionsPerPattern[pattern_i].size()) {
371  if (m_perPatternAndMaskFractions[pattern_i].size() == n_masks-1) {
372  ATH_MSG_ERROR("More fraction lists than number of masks: "
373  << m_perPatternAndMaskFractions[pattern_i].size()+1 << " > " << (n_masks-1)
374  << " for pattern " << pattern_i);
375  return StatusCode::FAILURE;
376  }
377  m_perPatternAndMaskFractions[pattern_i].emplace_back();
378  sum=0.;
379  }
380  }
381  else {
382  sum += m_nDefectFractionsPerPattern[pattern_i][value_i];
383  m_perPatternAndMaskFractions[pattern_i].back().push_back(sum);
384  }
385  }
386  for (unsigned int mask_i=0; mask_i< m_perPatternAndMaskFractions[pattern_i].size(); ++mask_i) {
387  if ( m_perPatternAndMaskFractions[pattern_i][mask_i].empty()
388  || std::abs(m_perPatternAndMaskFractions[pattern_i][mask_i].back()-1.)>1e-5) {
389  ATH_MSG_ERROR("Empty fraction list or fractions do not add up to 1: "
390  << (!m_perPatternAndMaskFractions[pattern_i][mask_i].empty()
391  ?m_perPatternAndMaskFractions[pattern_i][mask_i].back() : -1.f)
392  << " for pattern " << pattern_i << ", mask " << mask_i
393  << " (" << m_groupDefectHistNames.at(mask_i) << ")");
394  return StatusCode::FAILURE;
395  }
396  ATH_MSG_DEBUG("Fractions for pattern " << pattern_i << " mask " << mask_i
397  << " (" << m_groupDefectHistNames.at(mask_i) << "):"
398  << m_perPatternAndMaskFractions[pattern_i][mask_i]);
399  assert( pattern_i < m_defectProbability.size() );
400  assert( kNProb + mask_i < m_defectProbability[pattern_i].size() );
401  for (float &value : m_perPatternAndMaskFractions[pattern_i][mask_i] ) {
402  value *= m_defectProbability[pattern_i][kNProb+mask_i];
403  }
404  ATH_MSG_DEBUG("Probabilities for pattern " << pattern_i << " mask " << mask_i
405  << " (" << m_groupDefectHistNames.at(mask_i) << ") for 1.."
406  << m_perPatternAndMaskFractions[pattern_i][mask_i].size() << " defects:"
407  << m_perPatternAndMaskFractions[pattern_i][mask_i]);
408  }
409  }
410  }
411  return checkProbabilities(kCellDefectProb+n_masks);
412  }
413 
415  if (!m_cornerDefectParamsPerPattern.empty()) {
416  if (m_cornerDefectParamsPerPattern.size() != m_modulePattern.size()) {
417  ATH_MSG_ERROR("Expected exactly one set of corner defect parameters per module pattern but the numbers disagree "
418  << m_cornerDefectParamsPerPattern.size() << " != " << m_modulePattern.size());
419  return StatusCode::FAILURE;
420  }
422  ATH_MSG_ERROR("Expected exactly one set of n corner fractions per module pattern but the numbers disagree "
424  return StatusCode::FAILURE;
425  }
427  for (unsigned int pattern_i=0; pattern_i < m_cornerDefectParamsPerPattern.size(); ++pattern_i) {
428  if (m_cornerDefectParamsPerPattern[pattern_i].empty()) continue;
430  ATH_MSG_ERROR("Mismatch in number of corner defect parameters for pattern " << pattern_i << ". Expected " << kNCornerDefectParams
431  << " but got " << m_cornerDefectParamsPerPattern[pattern_i].size() );
432  return StatusCode::FAILURE;
433  }
434  if (m_cornerDefectNCornerFractionsPerPattern[pattern_i].size()>4) {
435  ATH_MSG_ERROR("Too many Fractions for corner defects for pattern " << pattern_i <<
436  ". Expected fractions for at most 4 corners but got " << m_cornerDefectNCornerFractionsPerPattern[pattern_i].size()
437  << ".");
438  return StatusCode::FAILURE;
439  }
440  double scale = std::accumulate( m_cornerDefectNCornerFractionsPerPattern.value()[pattern_i].begin(),
441  m_cornerDefectNCornerFractionsPerPattern.value()[pattern_i].end(),
442  0.);
443  if (std::abs(scale-1.)>1e-3) {
444  ATH_MSG_ERROR("The fractions for corner defects in 1.." << m_cornerDefectNCornerFractionsPerPattern[pattern_i].size()
445  << " corner(s) for pattern " << pattern_i << " do not add up to ~1 but " << scale);
446  return StatusCode::FAILURE;
447  }
450  double total = 0.;
451  for (double fraction : m_cornerDefectNCornerFractionsPerPattern[pattern_i]) {
452  total += fraction * scale;
453  m_perPatternCornerDefectNCornerCummulativeProb[pattern_i].push_back( static_cast<float>(total) );
454  }
455  }
456  }
457  return StatusCode::SUCCESS;
458  }
459 
460 
461  void DefectsEmulatorCondAlgBase::histogramDefectModule(unsigned int module_pattern_i,
462  unsigned int hist_pattern_i,
463  unsigned int id_hash,
464  const Amg::Vector3D &center) const {
465  assert( hist_pattern_i < m_moduleHist.size() );
466  unsigned int ids_per_col = static_cast<unsigned int>(m_moduleHist[hist_pattern_i][kDefectModule]->GetNbinsX());
467  unsigned int bin_i=m_moduleHist[hist_pattern_i][kDefectModule]->GetBin( id_hash%ids_per_col+1, id_hash/ids_per_col+1);
468  m_moduleHist[hist_pattern_i][kDefectModule]->SetBinContent(bin_i,1);
469  unsigned int eta_phi_pattern_i = m_fillEtaPhiHistogramsPerPattern ? module_pattern_i : 0;
470  assert( kDefectModulePos < m_defectModuleEtaPhiHist.size());
471  assert( eta_phi_pattern_i < m_defectModuleEtaPhiHist[kDefectModulePos].size() );
472  m_defectModuleEtaPhiHist[kDefectModulePos][eta_phi_pattern_i]->Fill(center.z(), center.perp());
473  m_defectModuleEtaLayerHist[kDefectModulePos][eta_phi_pattern_i]->Fill(center.x(), center.y());
474  }
475 
476  void DefectsEmulatorCondAlgBase::fillPerModuleHistograms(unsigned int module_pattern_i,
477  unsigned int pattern_hist_i,
478  unsigned int matrix_histogram_index,
479  unsigned int matrix_index,
480  unsigned int module_i,
481  unsigned int n_masks,
482  const std::vector<unsigned int> &n_mask_defects,
483  const Amg::Vector3D &center) const
484  {
485  // all the following histograms are expected to have the same binning
486  // i.e. one bin per ID hash organised in a matrix
487  assert( pattern_hist_i < m_moduleHist.size());
488  assert( kMatrixTypeId < m_moduleHist[pattern_hist_i].size());
489  assert( kDefectModule < m_moduleHist[pattern_hist_i].size());
490  unsigned int ids_per_col = static_cast<unsigned int>(m_moduleHist[pattern_hist_i][kDefectModule]->GetNbinsX());
491  unsigned int bin_i=m_moduleHist[pattern_hist_i][kDefectModule]->GetBin( module_i%ids_per_col+1, module_i/ids_per_col+1);
492  unsigned int mask_i=n_masks;
493  for (; --mask_i>0; ) {
494  assert( mask_i < n_mask_defects.size() && mask_i>0);
495  if (!m_groupDefectHists.empty()) {
496  m_groupDefectHists[pattern_hist_i][matrix_histogram_index][mask_i-1]->Fill(n_mask_defects[mask_i]);
497  }
498  assert( (kDefectCell+mask_i) < m_moduleHist[pattern_hist_i].size());
499  m_moduleHist[pattern_hist_i][kDefectCell+mask_i]->SetBinContent(bin_i, n_mask_defects[mask_i]);
500  }
501  assert( (kDefectCell+mask_i) < m_moduleHist[pattern_hist_i].size());
502  m_moduleHist[pattern_hist_i][kDefectCell+mask_i]->SetBinContent(bin_i, n_mask_defects[mask_i]);
503  m_moduleHist[pattern_hist_i][kMatrixTypeId]->SetBinContent(bin_i, matrix_index+1 );
504  unsigned int n_defects_total = std::accumulate(n_mask_defects.begin(),n_mask_defects.end(), 0u);
505  if (n_defects_total>0) {
506  unsigned int eta_phi_pattern_i = m_fillEtaPhiHistogramsPerPattern ? module_pattern_i : 0;
507  assert( kModulesWithDefectsPos < m_defectModuleEtaPhiHist.size());
508  assert( eta_phi_pattern_i < m_defectModuleEtaPhiHist[kModulesWithDefectsPos].size() );
509  m_defectModuleEtaPhiHist[kModulesWithDefectsPos][eta_phi_pattern_i]->Fill(center.z(), center.perp());
510  m_defectModuleEtaLayerHist[kModulesWithDefectsPos][eta_phi_pattern_i]->Fill(center.x(), center.y(),n_defects_total);
511  }
512  }
513 
514 
515 }// namespace closure
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
InDet::DefectsEmulatorCondAlgBase::m_rngName
std::string m_rngName
Definition: DefectsEmulatorCondAlgBase.h:87
InDet::operator<<
MsgStream & operator<<(MsgStream &, const GNNTrackReaderTool &)
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
InDet::DefectsEmulatorCondAlgBase::m_rndmSvc
ServiceHandle< IAthRNGSvc > m_rndmSvc
Definition: DefectsEmulatorCondAlgBase.h:44
InDet::DefectsEmulatorCondAlgBase::kMaxDefectsPerModule
@ kMaxDefectsPerModule
Definition: DefectsEmulatorCondAlgBase.h:148
InDet::DefectsEmulatorCondAlgBase::m_nDefectFractionsPerPattern
Gaudi::Property< std::vector< std::vector< double > > > m_nDefectFractionsPerPattern
Definition: DefectsEmulatorCondAlgBase.h:54
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
dqt_zlumi_pandas.hname
string hname
Definition: dqt_zlumi_pandas.py:279
InDet::DefectsEmulatorCondAlgBase::findHist
std::pair< unsigned int, unsigned int > findHist(unsigned int pattern_i, unsigned int n_rows, unsigned int n_cols) const
Definition: DefectsEmulatorCondAlgBase.cxx:267
InDet::DefectsEmulatorCondAlgBase::kDefectModulePos
@ kDefectModulePos
Definition: DefectsEmulatorCondAlgBase.h:220
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
InDet
Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
InDet::DefectsEmulatorCondAlgBase::initializeCornerDefects
StatusCode initializeCornerDefects()
Definition: DefectsEmulatorCondAlgBase.cxx:414
InDet::DefectsEmulatorCondAlgBase::throwNumberOfDefects
unsigned int throwNumberOfDefects(CLHEP::HepRandomEngine *rndmEngine, const std::vector< unsigned int > &module_pattern_idx, unsigned int n_masks, unsigned int n_cells, std::vector< unsigned int > &n_mask_defects) const
Definition: DefectsEmulatorCondAlgBase.cxx:189
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
InDet::DefectsEmulatorCondAlgBase::totalProbability
double totalProbability(const std::vector< unsigned int > &module_pattern_idx, unsigned int prob_idx) const
Compute the total probability using the probabilities associated to the given list of patterns.
Definition: DefectsEmulatorCondAlgBase.h:115
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
python.ROOTUtils.protect
def protect(obj)
Definition: python/ROOTUtils.py:14
InDet::DefectsEmulatorCondAlgBase::DefectsEmulatorCondAlgBase
DefectsEmulatorCondAlgBase(const std::string &name, ISvcLocator *pSvcLocator)
Definition: DefectsEmulatorCondAlgBase.cxx:17
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
InDet::DefectsEmulatorCondAlgBase::m_histogramGroupName
Gaudi::Property< std::string > m_histogramGroupName
Definition: DefectsEmulatorCondAlgBase.h:81
athena.value
value
Definition: athena.py:124
InDet::DefectsEmulatorCondAlgBase::kNElements
@ kNElements
Definition: DefectsEmulatorCondAlgBase.h:143
InDet::DefectsEmulatorCondAlgBase::m_perPatternAndMaskFractions
std::vector< std::vector< std::vector< float > > > m_perPatternAndMaskFractions
Definition: DefectsEmulatorCondAlgBase.h:65
HistUtil::StringCat
Definition: HistUtil.h:41
InDet::DefectsEmulatorCondAlgBase::m_histSvc
ServiceHandle< ITHistSvc > m_histSvc
Definition: DefectsEmulatorCondAlgBase.h:79
InDet::DefectsEmulatorCondAlgBase::m_fillEtaPhiHistogramsPerPattern
Gaudi::Property< bool > m_fillEtaPhiHistogramsPerPattern
Definition: DefectsEmulatorCondAlgBase.h:85
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
yodamerge_tmp.scale
scale
Definition: yodamerge_tmp.py:138
covarianceTool.prob
prob
Definition: covarianceTool.py:678
python.TrigEgammaMonitorHelper.TH2F
def TH2F(name, title, nxbins, bins_par2, bins_par3, bins_par4, bins_par5=None, bins_par6=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:45
DefectsEmulatorCondAlgBase.h
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
python.Bindings.values
values
Definition: Control/AthenaPython/python/Bindings.py:805
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
InDet::DefectsEmulatorCondAlgBase::m_perPatternCornerDefectNCornerCummulativeProb
std::vector< std::vector< float > > m_perPatternCornerDefectNCornerCummulativeProb
Definition: DefectsEmulatorCondAlgBase.h:66
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
InDet::DefectsEmulatorCondAlgBase::m_defectProbability
Gaudi::Property< std::vector< std::vector< double > > > m_defectProbability
Definition: DefectsEmulatorCondAlgBase.h:51
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
InDet::DefectsEmulatorCondAlgBase::printSummaryOfDefectGeneration
void printSummaryOfDefectGeneration(unsigned int n_masks, unsigned int n_error, unsigned int n_defects_total, const std::vector< std::array< unsigned int, kNCounts > > &counts) const
Definition: DefectsEmulatorCondAlgBase.cxx:234
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDet::DefectsEmulatorCondAlgBase::histogramDefectModule
void histogramDefectModule(unsigned int module_pattern_i, unsigned int hist_pattern_i, unsigned int id_hash, const Amg::Vector3D &center) const
Definition: DefectsEmulatorCondAlgBase.cxx:461
InDet::DefectsEmulatorCondAlgBase::kNCornerDefectParams
@ kNCornerDefectParams
Definition: DefectsEmulatorCondAlgBase.h:103
covarianceTool.title
title
Definition: covarianceTool.py:542
mc.group_name
group_name
Definition: mc.PhPy8EG_A14NNPDF23_NNLOPS_example.py:33
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
InDet::DefectsEmulatorCondAlgBase::initializeProbabilities
StatusCode initializeProbabilities(unsigned int n_masks)
Definition: DefectsEmulatorCondAlgBase.cxx:344
InDet::ModuleIdentifierMatchUtil::verifyModulePatternList
bool verifyModulePatternList(const std::vector< std::vector< int > > &arr)
Verify whether a list of module identifier patterns is consistent.
Definition: ModuleIdentifierMatchUtil.h:99
InDet::DefectsEmulatorCondAlgBase::kNDefects
@ kNDefects
Definition: DefectsEmulatorCondAlgBase.h:144
hist_file_dump.f
f
Definition: hist_file_dump.py:141
InDet::DefectsEmulatorCondAlgBase::finalize
virtual StatusCode finalize() override
Definition: DefectsEmulatorCondAlgBase.cxx:181
HistUtil.h
InDet::DefectsEmulatorCondAlgBase::m_modulePattern
Gaudi::Property< std::vector< std::vector< int > > > m_modulePattern
Definition: DefectsEmulatorCondAlgBase.h:47
InDet::DefectsEmulatorCondAlgBase::m_cornerDefectNCornerFractionsPerPattern
Gaudi::Property< std::vector< std::vector< double > > > m_cornerDefectNCornerFractionsPerPattern
Definition: DefectsEmulatorCondAlgBase.h:62
InDet::DefectsEmulatorCondAlgBase::kNMaxRtriesExceeded
@ kNMaxRtriesExceeded
Definition: DefectsEmulatorCondAlgBase.h:146
InDet::DefectsEmulatorCondAlgBase::kMatrixTypeId
@ kMatrixTypeId
Definition: DefectsEmulatorCondAlgBase.h:228
InDet::DefectsEmulatorCondAlgBase::kCornerDefectProb
@ kCornerDefectProb
Definition: DefectsEmulatorCondAlgBase.h:96
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
InDet::DefectsEmulatorCondAlgBase::m_fillHistogramsPerPattern
Gaudi::Property< bool > m_fillHistogramsPerPattern
Definition: DefectsEmulatorCondAlgBase.h:83
InDet::DefectsEmulatorCondAlgBase::kNProb
@ kNProb
Definition: DefectsEmulatorCondAlgBase.h:92
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
RNGWrapper.h
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
InDet::DefectsEmulatorCondAlgBase::checkProbabilities
StatusCode checkProbabilities(unsigned int n_probabilities) const
Consistency check of module patterns, probabilities.
Definition: DefectsEmulatorCondAlgBase.cxx:159
InDet::DefectsEmulatorCondAlgBase::initializeBase
StatusCode initializeBase(unsigned int n_masks, unsigned int wafer_hash_max)
Definition: DefectsEmulatorCondAlgBase.cxx:21
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDet::DefectsEmulatorCondAlgBase::m_histogrammingEnabled
bool m_histogrammingEnabled
Definition: DefectsEmulatorCondAlgBase.h:236
InDet::DefectsEmulatorCondAlgBase::kModulesWithDefectsPos
@ kModulesWithDefectsPos
Definition: DefectsEmulatorCondAlgBase.h:221
AthCommonMsg< Gaudi::Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
HistUtil::ProtectHistogramCreation
Definition: HistUtil.h:14
InDet::DefectsEmulatorCondAlgBase::m_maxNGroupDefects
std::vector< unsigned int > m_maxNGroupDefects
Definition: DefectsEmulatorCondAlgBase.h:209
InDet::DefectsEmulatorCondAlgBase::kNRetries
@ kNRetries
Definition: DefectsEmulatorCondAlgBase.h:145
InDet::DefectsEmulatorCondAlgBase::m_modulesWithoutDefectParameters
std::atomic< unsigned int > m_modulesWithoutDefectParameters
Definition: DefectsEmulatorCondAlgBase.h:234
ModuleIdentifierMatchUtil.h
python.TrigEgammaMonitorHelper.TH1F
def TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:24
InDet::DefectsEmulatorCondAlgBase::kDefectCell
@ kDefectCell
Definition: DefectsEmulatorCondAlgBase.h:230
InDet::DefectsEmulatorCondAlgBase::kCellDefectProb
@ kCellDefectProb
Definition: DefectsEmulatorCondAlgBase.h:91
InDet::DefectsEmulatorCondAlgBase::m_cornerDefectParamsPerPattern
Gaudi::Property< std::vector< std::vector< double > > > m_cornerDefectParamsPerPattern
Definition: DefectsEmulatorCondAlgBase.h:58
InDet::DefectsEmulatorCondAlgBase::m_groupDefectHistNames
std::vector< std::string > m_groupDefectHistNames
Definition: DefectsEmulatorCondAlgBase.h:208
InDet::DefectsEmulatorCondAlgBase::kDefectModule
@ kDefectModule
Definition: DefectsEmulatorCondAlgBase.h:229
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
HistUtil::StringCat::str
const std::string & str() const
Definition: HistUtil.h:47
InDet::DefectsEmulatorCondAlgBase::fillPerModuleHistograms
void fillPerModuleHistograms(unsigned int module_pattern_i, unsigned int pattern_hist_i, unsigned int matrix_histogram_index, unsigned int matrix_index, unsigned int module_i, unsigned int n_masks, const std::vector< unsigned int > &n_mask_defects, const Amg::Vector3D &center) const
Definition: DefectsEmulatorCondAlgBase.cxx:476