ATLAS Offline Software
LArEM_Base_ID.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
11 #include <cmath>
12 
14 #include "LArEM_region.h"
15 #include "IdDict/IdDictDefs.h"
16 #include "CxxUtils/StrFormat.h"
17 #include "CxxUtils/trapping_fp.h"
18 
20 
21 
22 LArEM_Base_ID::LArEM_Base_ID (const std::string& name, bool supercell)
23  : CaloIDHelper (name),
24  m_slar (supercell ? 1 : 0)
25 {
26  m_REGION_INDEX = 999;
27  m_ETA_INDEX = 999;
28  m_PHI_INDEX = 999;
29  m_SLAR_INDEX = 999;
30  m_LAR_INDEX = 999;
31  m_EM_INDEX = 999;
32  m_BEC_INDEX = 999;
33  m_SAMPLING_INDEX = 999;
35  m_two_sym_sides = 1;
36 }
37 
38 
40 {
43  for (; first != last; ++first) delete (*first);
44 }
45 
47 {
48  return(m_slar_impl.unpack(id)) != 0;
49 }
50 
51 
52 int LArEM_Base_ID::eta_min(const Identifier regId) const
53 {
54  ExpandedIdentifier expId;
55  IdContext context = region_context();
56  if(!get_expanded_id(regId, expId, &context)) {
57  int result = -999;
58  for (unsigned int i = 0; i < m_full_em_range.size(); ++i) {
59  const Range& range = m_full_em_range[i];
60  if (range.match(expId)) {
61  const Range::field& eta_field = range[m_ETA_INDEX];
62  if (eta_field.has_minimum()) {
63  int etamin = eta_field.get_minimum();
64  if (-999 == result) {
65  result = etamin;
66  }
67  else {
68  if (etamin < result) result = etamin;
69  }
70  }
71  }
72  }
73  return (result);
74  }
75  return (-999);
76 }
77 
78 int LArEM_Base_ID::eta_max(const Identifier regId) const
79 {
80  ExpandedIdentifier expId;
81  IdContext context = region_context();
82  if(!get_expanded_id(regId, expId, &context)) {
83  int result = -999;
84  for (unsigned int i = 0; i < m_full_em_range.size(); ++i) {
85  const Range& range = m_full_em_range[i];
86  if (range.match(expId)) {
87  const Range::field& eta_field = range[m_ETA_INDEX];
88  if (eta_field.has_maximum()) {
89  int etamax = eta_field.get_maximum();
90  if (result < etamax) result = etamax;
91  }
92  }
93  }
94  return (result);
95  }
96  return (-999); // default
97 }
98 
100 {
101  ExpandedIdentifier expId;
102  IdContext region_cntxt = region_context();
103  if(!get_expanded_id(regId, expId, &region_cntxt)) {
104  int result = -999;
105  for (unsigned int i = 0; i < m_full_em_range.size(); ++i) {
106  const Range& range = m_full_em_range[i];
107  if (range.match(expId)) {
108  const Range::field& phi_field = range[m_PHI_INDEX];
109  if (phi_field.has_minimum()) {
110  int phimin = phi_field.get_minimum();
111  if (-999 == result) {
112  result = phimin;
113  }
114  else {
115  if (phimin < result) result = phimin;
116  }
117  }
118  }
119  }
120  return (result);
121  }
122  return (-999); // default
123 }
124 
125 int LArEM_Base_ID::phi_max(const Identifier regId) const
126 {
127  ExpandedIdentifier expId;
128  IdContext context = region_context();
129  if(!get_expanded_id(regId, expId, &context)) {
130  int result = -999;
131  for (unsigned int i = 0; i < m_full_em_range.size(); ++i) {
132  const Range& range = m_full_em_range[i];
133  if (range.match(expId)) {
134  const Range::field& phi_field = range[m_PHI_INDEX];
135  if (phi_field.has_maximum()) {
136  int phimax = phi_field.get_maximum();
137  if (result < phimax) result = phimax;
138  }
139  }
140  }
141  return (result);
142  }
143  return (-999); // default
144 }
145 
146 void LArEM_Base_ID::region_id_checks ( int barrel_ec, int sampling, int region ) const
147 {
148  // Check that id is within allowed range
149 
150  // Fill expanded id
152  expId << barrel_ec << sampling << region ;
153 
154  if (!m_full_region_range.match(expId)) {
155  std::string errorMessage = "LArEM_Base_ID::region_id_checks() result is not OK: ID, range = "
156  + std::string(expId) + " , " + (std::string)m_full_region_range;
157  throw LArID_Exception(errorMessage , 5);
158  }
159 }
160 
161 
162 void LArEM_Base_ID::channel_id_checks ( int barrel_ec, int sampling, int region,
163  int eta, int phi ) const
164 {
165  // Check that id is within allowed range
166 
167  // Fill expanded id
169  expId << barrel_ec << sampling << region << eta << phi << m_slar ;
170 
171  if (!m_full_em_range.match(expId)) {
172  std::string errorMessage = "LArEM_Base_ID::channel_id_checks() result is not OK: ID, range = "
173  + std::string(expId) + " , " + (std::string)m_full_em_range;
174  throw LArID_Exception(errorMessage , 6);
175  }
176 }
177 
179  int eta, int phi ) const
180 {
181  // Check that id is within allowed range
182 
183  // Fill expanded id
184  ExpandedIdentifier expId;
185 
186  IdContext context = region_context();
187  if (get_expanded_id(regionId, expId, &context)) {
188  std::string errorMessage = "LArEM_Base_ID::channel_id_checks(regId) result is not OK: ID = "
189  + show_to_string(regionId) ;
190  throw LArID_Exception(errorMessage , 6);
191  }
192 
193  expId << eta << phi << m_slar;
194 
195  if (!m_full_em_range.match(expId)) {
196  std::string errorMessage = "LArEM_Base_ID::channel_id_checks(regId) result is not OK: ID, range = "
197  + std::string(expId) + " , " + (std::string)m_full_em_range;
198  throw LArID_Exception(errorMessage , 6);
199  }
200 }
201 
202 
203 
204 
205 int LArEM_Base_ID::get_expanded_id (const Identifier& id, ExpandedIdentifier& exp_id, const IdContext* context) const
206 {
207  // We assume that the context is >= region
208  exp_id.clear();
209  exp_id << lar_field_value()
210  << lar_em_field_value()
211  << barrel_ec(id)
212  << sampling(id)
213  << region(id);
214  if(context && context->end_index() >= m_ETA_INDEX) {
215  exp_id << eta(id);
216  if(context->end_index() >= m_PHI_INDEX) {
217  exp_id << phi(id);
218  if ( context->end_index() >= m_SLAR_INDEX) {
219  exp_id << (unsigned)is_supercell(id);
220  }
221  }
222  }
223  return (0);
224 }
225 
227 {
228  MsgStream log(m_msgSvc, "LArEM_Base_ID" );
229  if(!dict()) {
230  if(m_msgSvc) {
231  log << MSG::ERROR << "initLevelsFromDict - dictionary NOT initialized "
232  << endmsg;
233  }
234  else {
235  std::cout << "LArEM_Base_ID::initLevelsFromDict - dictionary NOT initialized "
236  << std::endl ;
237  }
238  return (1);
239  }
240 
241  // Find out which identifier field corresponds to each level.
242 
243  m_LAR_INDEX = 999 ;
244  m_EM_INDEX = 999 ;
245  m_BEC_INDEX = 999 ;
246  m_SAMPLING_INDEX = 999 ;
247  m_REGION_INDEX = 999 ;
248  m_ETA_INDEX = 999 ;
249  m_PHI_INDEX = 999 ;
250  m_SLAR_INDEX = 999 ;
251 
252  // Find a EM region
253  IdDictField* field = dict()->find_field("subdet") ;
254  if (field) {
255  m_LAR_INDEX = field->m_index ;
256  }
257  else {
258  if(m_msgSvc) {
259  log << MSG::ERROR << "initLevelsFromDict - unable to find 'subdet' field "
260  << endmsg;
261  }
262  else {
263  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'subdet' field "
264  << std::endl ;
265  }
266  return (1);
267  }
268 
269  field = dict()->find_field("part") ;
270  if (field) {
271  m_EM_INDEX = field->m_index ;
272  }
273  else {
274  if(m_msgSvc) {
275  log << MSG::ERROR << "initLevelsFromDict - unable to find 'part' field "
276  << endmsg;
277  }
278  else {
279  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'part' field "
280  << std::endl ;
281  }
282  return (1);
283  }
284 
285  field = dict()->find_field("barrel-endcap") ;
286  if (field) {
287  m_BEC_INDEX = field->m_index ;
288  }
289  else {
290  if(m_msgSvc) {
291  log << MSG::ERROR << "initLevelsFromDict - unable to find 'barrel-endcap' field "
292  << endmsg;
293  }
294  else {
295  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'barrel-endcap' field "
296  << std::endl ;
297  }
298  return (1);
299  }
300 
301  field = dict()->find_field("sampling") ;
302  if (field) {
303  m_SAMPLING_INDEX = field->m_index ;
304  }
305  else {
306  if(m_msgSvc) {
307  log << MSG::ERROR << "initLevelsFromDict - unable to find 'sampling' field "
308  << endmsg;
309  }
310  else {
311  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'sampling' field "
312  << std::endl ;
313  }
314  return (1);
315  }
316 
317  field = dict()->find_field("region") ;
318  if (field) {
319  m_REGION_INDEX = field->m_index ;
320  }
321  else {
322  if(m_msgSvc) {
323  log << MSG::ERROR << "initLevelsFromDict - unable to find 'region' field "
324  << endmsg;
325  }
326  else {
327  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'region' field "
328  << std::endl ;
329  }
330  return (1);
331  }
332 
333  field = dict()->find_field("eta") ;
334  if (field) {
335  m_ETA_INDEX = field->m_index ;
336  }
337  else {
338  if(m_msgSvc) {
339  log << MSG::ERROR << "initLevelsFromDict - unable to find 'eta' field "
340  << endmsg;
341  }
342  else {
343  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'eta' field "
344  << std::endl ;
345  }
346  return (1);
347  }
348 
349  field = dict()->find_field("phi") ;
350  if (field) {
351  m_PHI_INDEX = field->m_index ;
352  }
353  else {
354  if(m_msgSvc) {
355  log << MSG::ERROR << "initLevelsFromDict - unable to find 'phi' field "
356  << endmsg;
357  }
358  else {
359  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'phi' field "
360  << std::endl ;
361  }
362  return (1);
363  }
364 
365  field = dict()->find_field("is-slar") ;
366  if (field) {
367  m_SLAR_INDEX = field->m_index ;
368  }
369  else {
370  if(m_msgSvc) {
371  log << MSG::ERROR << "initLevelsFromDict - unable to find 'is-slar' field "
372  << endmsg;
373  }
374  else {
375  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'is-slar' field "
376  << std::endl ;
377  }
378  return (1);
379  }
380 
381  // Set the field implementations
382 
384  if ( !group ){
385  log << MSG::ERROR << "initLevelsFromDict - cannot find " << group_name
386  << " group' field " << endmsg;
387  }
388  else {
389  m_em_region_index = group->regions()[0]->m_index;
390  }
392 
393  m_lar_impl = region.m_implementation[m_LAR_INDEX];
394  m_em_impl = region.m_implementation[m_EM_INDEX];
395  m_bec_impl = region.m_implementation[m_BEC_INDEX];
396  m_sampling_impl = region.m_implementation[m_SAMPLING_INDEX];
397  m_region_impl = region.m_implementation[m_REGION_INDEX];
398  m_eta_impl = region.m_implementation[m_ETA_INDEX];
399  m_phi_impl = region.m_implementation[m_PHI_INDEX];
400  m_slar_impl = region.m_implementation[m_SLAR_INDEX];
401 
402  if (!m_quiet) {
403  if(m_msgSvc) {
404  log << MSG::DEBUG << "decode index and bit fields for each level: " << endmsg;
405  log << MSG::DEBUG << "lar " << m_lar_impl.show_to_string() << endmsg;
406  log << MSG::DEBUG << "em " << m_em_impl.show_to_string() << endmsg;
407  log << MSG::DEBUG << "bec " << m_bec_impl.show_to_string() << endmsg;
408  log << MSG::DEBUG << "samp " << m_sampling_impl.show_to_string() << endmsg;
409  log << MSG::DEBUG << "reg " << m_region_impl.show_to_string() << endmsg;
410  log << MSG::DEBUG << "eta " << m_eta_impl.show_to_string() << endmsg;
411  log << MSG::DEBUG << "phi " << m_phi_impl.show_to_string() << endmsg;
412  log << MSG::DEBUG << "is-slar " << m_slar_impl.show_to_string() << endmsg;
413  }
414  else {
415  std::cout << "decode index and bit fields for each level: " << std::endl;
416  std::cout << "lar " << m_lar_impl.show_to_string() << std::endl;
417  std::cout << "em " << m_em_impl.show_to_string() << std::endl;
418  std::cout << "bec " << m_bec_impl.show_to_string() << std::endl;
419  std::cout << "samp " << m_sampling_impl.show_to_string() << std::endl;
420  std::cout << "reg " << m_region_impl.show_to_string() << std::endl;
421  std::cout << "eta " << m_eta_impl.show_to_string() << std::endl;
422  std::cout << "phi " << m_phi_impl.show_to_string() << std::endl;
423  std::cout << "is-slar " << m_slar_impl.show_to_string() << std::endl;
424  }
425  }
426 
427 
428  return(0) ;
429 }
430 
431 
433 {
434  if (channels().init (*this, "channels",
436  m_SLAR_INDEX))
437  return 1;
438  if (regions().init (*this, "regions",
441  return 1;
442 
443  return (0);
444 }
445 
446 
447 int
449  const std::string& group_name)
450 /*=================================================================*/
451 {
452  MsgStream log(m_msgSvc, "LArEM_Base_ID" );
453 
454  log << MSG::DEBUG << "initialize_base_from_dictionary" << endmsg;
455 
456  // Check whether this helper should be reinitialized
457  if (!reinitialize(dict_mgr)) {
458  log << MSG::DEBUG << "Request to reinitialize not satisfied - tags have not changed" << endmsg;
459  return (0);
460  }
461  else {
462  if(m_msgSvc)log << MSG::DEBUG << "(Re)initialize" << endmsg;
463  }
464 
465  // init base object
467  "LArCalorimeter"))
468  return (1);
469 
470  // initialize dictionary version
471  AtlasDetectorID::setDictVersion(dict_mgr, "LArCalorimeter");
472 
473  // Initialize the field indices
474  if (initLevelsFromDict(group_name)) return (1);
475 
476  // Find value for the field LAr Calorimeter
477  const IdDictDictionary* atlasDict = dict_mgr.find_dictionary ("ATLAS");
478  int larField = -1;
479  if (atlasDict->get_label_value("subdet", "LArCalorimeter", larField)) {
480  if(m_msgSvc) {
481  log << MSG::ERROR << "Could not get value for label 'LArCalorimeter' of field 'subdet' in dictionary "
482  << atlasDict->m_name
483  << endmsg;
484  }
485  else {
486  std::cout << "Could not get value for label 'LArCalorimeter' of field 'subdet' in dictionary "
487  << atlasDict->m_name
488  << std::endl;
489  }
490  return (1);
491  }
492 
493  // Find value for the field LArEM
494  int larEmField = -1;
495  if (dict()->get_label_value("part", "LArEM", larEmField)) {
496  if(m_msgSvc) {
497  log << MSG::ERROR << "Could not get value for label 'LArEM' of field 'part' in dictionary "
498  << dict()->m_name
499  << endmsg;
500  }
501  else {
502  std::cout << "Could not get value for label 'LArEM' of field 'part' in dictionary "
503  << dict()->m_name
504  << std::endl;
505  }
506  return (1);
507  }
508 
509  // Set up id for region and range prefix
510  ExpandedIdentifier reg_id;
511  reg_id.add(larField);
512  reg_id.add(larEmField);
513  Range prefix;
514 
516  m_full_region_range = dict()->build_multirange(reg_id, group_name, prefix, "region");
517 
518  if (!m_quiet) {
519  if(m_msgSvc) {
520  log << MSG::DEBUG << " initialize_from_dict : "
521  << endmsg;
522  log << MSG::DEBUG << " region range -> " << (std::string)m_full_region_range
523  << endmsg;
524  log << MSG::DEBUG << " channel range -> " << (std::string)m_full_em_range
525  << endmsg;
526  }
527  else {
528  std::cout << " LArEM_Base_ID::initialize_from_dict : "
529  << std::endl;
530  std::cout << " region range -> " << (std::string)m_full_region_range
531  << std::endl;
532  std::cout << " channel range -> " << (std::string)m_full_em_range
533  << std::endl;
534  }
535  }
536 
537  // initialize m_two_sym_sides
538  m_two_sym_sides = ( dictionaryVersion() == "fullAtlas" );
539 
540 
541  // Setup the hash tables
542  if(init_hashes()) return (1);
543 
544  // initialize dictionary regions
545  if (fill_vec_of_dict_regions (group_name)) return 1;
546 
547  m_vecOfPhiMin.resize(regions().hash_max());
548  for (unsigned int i = 0; i < regions().hash_max(); ++i) {
549  Identifier regId = region_id(i);
550  m_vecOfPhiMin[i] = phi_min_init(regId);
551  }
552 
553 
554  // Setup for hash calculation
555 
556  // We use the structure of the region definitions in the
557  // dictionary to optimize. Specifically, each dict region
558  // corresponds to two regions of uniform eta/phi granularity (+/-
559  // in barrel/endcap). The lookup table only needs to contain the
560  // hash offset for each region and the number of phi cells.
561 
562  // The implementation requires:
563 
564  // 1) a lookup table for each region containing hash offset and
565  // nphi
566  // 2) a decoder to access the "index" corresponding to the
567  // bec/samp/reg fields. These fields use 8 bits, so the
568  // vector has a length of 256 for only 36 regions.
569 
570 
571  // Create decoder for fields bec to region
573  m_bec_impl.bits() +
577  m_bec_reg_impl.set_bits(bits, bits_offset);
578 
579  // std::cout << "bec_reg " << m_bec_reg_impl.decode_index() << " "
580  // << (std::string)m_bec_reg_impl.ored_field() << " "
581  // << std::hex << m_bec_reg_impl.mask() << " "
582  // << m_bec_reg_impl.zeroing_mask() << " "
583  // << std::dec << m_bec_reg_impl.shift()
584  // << " " << m_bec_reg_impl.bits() << " " <<m_bec_reg_impl.bits_offset()
585  // << std::endl;
586 
587 
588  // Set up vector as lookup table for hash calculation.
589  m_hash_calcs.resize(256);
590  for (unsigned int i = 0; i < m_full_em_range.size(); ++i) {
591  const Range* range = &m_full_em_range[i];
592  ExpandedIdentifier exp_id = range->minimum ();
593  HashCalc hc;
594 
596  exp_id[m_SAMPLING_INDEX],
597  exp_id[m_REGION_INDEX],
598  exp_id[m_ETA_INDEX],
599  exp_id[m_PHI_INDEX]);
601  hc.m_hash = min_neg;
602  Identifier minReg = region_id(min) ;
603  hc.m_etamin = eta_min(minReg);
604  hc.m_phimin = phi_min(minReg);
605  hc.m_nphi = (*range)[m_PHI_INDEX].get_indices();
607 
608  // Flip sign for bec if 2 symmetric sides (ATLAS case, not TB)
609  if(m_two_sym_sides) {
610  Identifier min1 = channel_id (-exp_id[m_BEC_INDEX],
611  exp_id[m_SAMPLING_INDEX],
612  exp_id[m_REGION_INDEX],
613  exp_id[m_ETA_INDEX],
614  exp_id[m_PHI_INDEX]);
616  hc.m_hash = min_pos;
617  m_hash_calcs[m_bec_reg_impl.unpack(min1)] = hc;
618  }
619 
620 
621  if (m_bec_reg_impl.unpack(min) > 255) {
622  if(m_msgSvc) {
623  log << MSG::WARNING << "min > 255 "
624  << i << " "
625  << show_to_string(min) << " "
626  << m_bec_reg_impl.unpack(min) << " "
627  << endmsg;
628  }
629  else {
630  std::cout << "min > 255 "
631  << i << " "
632  << show_to_string(min) << " "
633  << m_bec_reg_impl.unpack(min) << " "
634  << std::endl;
635  }
636  }
637  }
638 
639 // Some detailed printout
640 // ExpandedIdentifier exp_id = range->maximum ();
641 // Identifier max = channel_id (exp_id[m_BEC_INDEX],
642 // exp_id[m_SAMPLING_INDEX],
643 // exp_id[m_REGION_INDEX],
644 // exp_id[m_ETA_INDEX],
645 // exp_id[m_PHI_INDEX]);
646 // Identifier max0 = channel_id (-exp_id[m_BEC_INDEX],
647 // exp_id[m_SAMPLING_INDEX],
648 // exp_id[m_REGION_INDEX],
649 // exp_id[m_ETA_INDEX],
650 // exp_id[m_PHI_INDEX]);
651 // std::cout << "channel ranges, id, hash "
652 // << i << " "
653 // << show_to_string(min) << " "
654 // << show_to_string(max0) << " "
655 // << show_to_string(min1) << " "
656 // << show_to_string(max) << " "
657 // << channel_hash_binary_search(min) << " "
658 // << channel_hash_binary_search(min1) << " "
659 // << min_pos << " "
660 // << range->cardinality() << " "
661 // << std::endl;
662 // }
663 
664  // Check hash calculation
665  for (unsigned int i = 0; i < channels().hash_max(); ++i) {
666  Identifier id = channel_id(i);
667  if (channel_hash(id) != i) {
668  if(m_msgSvc) {
669  log << MSG::ERROR << "channel ranges, id, hash "
670  << show_to_string(id) << " "
671  << channel_hash(id) << " "
672  << i
673  << endmsg;
674  }
675  else {
676  std::cout << " ***** Error ";
677  std::cout << "channel ranges, id, hash "
678  << show_to_string(id) << " "
679  << channel_hash(id) << " "
680  << i
681  << std::endl;
682  }
683  }
684  }
685 
686  // Setup hash tables for finding neighbors (at the end of initialisation,
687  // to benefit from optimization
688  if(m_do_neighbours) {
689  if(init_neighbors()) return (1);
690  }
691 
692  return 0;
693 }
694 
695 
697  std::vector<IdentifierHash>& neighbourList) const
698 {
699  int result = 1;
700 
701  neighbourList.clear();
702 
703  if(!m_do_neighbours) {
704  if(m_msgSvc) {
705  MsgStream log(m_msgSvc, "LArEM_Base_ID" );
706  log << MSG::WARNING << "neighbours not initialized !!! returning empty list" << endmsg;
707  }
708  else {
709  std::cout << " WARNING: neighbours not initialized !!! returning empty list " << std::endl;
710  }
711  return result;
712  }
713 
714  if(id >= channel_hash_max()) {
715  if(m_msgSvc) {
716  MsgStream log(m_msgSvc, "LArEM_Base_ID" );
717  log << MSG::WARNING << "neighbours requested for non-existing channel -- id/max " << id << "/"
718  << channel_hash_max() << endmsg;
719  }
720  else {
721  std::cout << " neighbours requested for non-existing channel -- id/max " << id << "/"
722  << channel_hash_max() << std::endl;
723  }
724  return result;
725  }
726 
727  const short int maxNeighb=22;
728  IdentifierHash neighbList[maxNeighb];
729  int neighbourIndex = 0;
730 
731  // cell index
732  unsigned int index=id;
733 
734  //
735  // .... find in which region is the cell
736  //
737  auto itr = std::upper_bound(m_cells.begin(), m_cells.end(), index);
738  unsigned short int regionN = (itr - m_cells.begin()) - 1;
739  assert (regionN < m_vecOfRegions.size());
740  // get pointer to this region
741  LArEM_region* emRegion = m_vecOfRegions[regionN];
742  // retrieve characteristic numbers for this region
743  short int nPhi = emRegion->phiN();
744  float gPhi = emRegion->phiGranularity();
745  unsigned int minHash = emRegion->hashMin();
746  unsigned int maxHash = emRegion->hashMax();
747 
748  bool corners2DOnly = ( (option & LArNeighbours::all2D)
750  //
751  // .... previous neighbour in phi
752  //
753  IdentifierHash prevNeighbInPhi=NOT_VALID_HASH;
754  if( (option & LArNeighbours::prevInPhi)
755  || corners2DOnly ){
756  if(!get_prevInPhi(emRegion, index, nPhi, minHash, neighbourIndex, neighbList)){
757  // always 1 and only 1 neighbour in phi in ATLAS, but 0 or 1 neighbour in phi in TB
758  prevNeighbInPhi=neighbList[neighbourIndex-1];
759  if( corners2DOnly ){
760  neighbourIndex--;
761  }
762  }
763  }
764 
765  //
766  // ....next neighbour in phi
767  //
768  IdentifierHash nextNeighbInPhi=NOT_VALID_HASH;
769  if( (option & LArNeighbours::nextInPhi)
770  || corners2DOnly ){
771  if(!get_nextInPhi(emRegion, index, nPhi, minHash, neighbourIndex, neighbList)){
772  // always 1 and only 1 neighbour in phi in ATLAS, but 0 or 1 neighbour in phi in TB
773  nextNeighbInPhi=neighbList[neighbourIndex-1];
774  if( corners2DOnly ){
775  neighbourIndex--;
776  }
777  }
778  }
779 
780  //
781  // ....previous neighbours in eta
782  //
783  unsigned int nPrevBiggerCell=NOT_VALID_HASH;
784  if( (option & LArNeighbours::prevInEta) ){
785  get_prevInEta(emRegion, index, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
786  }
787 
788  //
789  // ....next neighbours in eta
790  //
791  unsigned int nNextBiggerCell=NOT_VALID_HASH;
792  if( (option & LArNeighbours::nextInEta) ){
793  get_nextInEta(emRegion, index, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
794  }
795 
796  //
797  // ....corners in the same sampling
798  //
799  if( (option & LArNeighbours::corners2D) ){
800  if(prevNeighbInPhi != NOT_VALID_HASH){
801  unsigned int index1=prevNeighbInPhi;
802  int oldNeighbourIndex = neighbourIndex;
803  // allow only 1 corner cell in order to avoid the problem of
804  // non-mutual neighbourness
805  // since the cells come ordered in phi it should be the last cell for
806  // prevNeighbInPhi as starting points
807  get_prevInEta(emRegion, index1, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
808  if ( neighbourIndex > oldNeighbourIndex+1 ) {
809  neighbList[oldNeighbourIndex] = neighbList[neighbourIndex-1];
810  neighbourIndex = oldNeighbourIndex+1;
811  }
812  oldNeighbourIndex = neighbourIndex;
813  get_nextInEta(emRegion, index1, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
814  if ( neighbourIndex > oldNeighbourIndex+1 ) {
815  neighbList[oldNeighbourIndex] = neighbList[neighbourIndex-1];
816  neighbourIndex = oldNeighbourIndex+1;
817  }
818  }
819 
820  if(nextNeighbInPhi != NOT_VALID_HASH){
821  unsigned int index2=nextNeighbInPhi;
822  int oldNeighbourIndex = neighbourIndex;
823  // allow only 1 corner cell in order to avoid the problem of
824  // non-mutual neighbourness
825  // since the cells come ordered in phi it should be the 1st cell for
826  // nextNeighbInPhi
827  get_prevInEta(emRegion, index2, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
828  if ( neighbourIndex > oldNeighbourIndex+1 ) {
829  neighbourIndex = oldNeighbourIndex+1;
830  }
831  oldNeighbourIndex = neighbourIndex;
832  get_nextInEta(emRegion, index2, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
833  if ( neighbourIndex > oldNeighbourIndex+1 ) {
834  neighbourIndex = oldNeighbourIndex+1;
835  }
836  }
837  }
838 
839  //
840  // .... neighbours in sampling (common code)
841  // EM caracteristics = granularity changes in both eta and phi + partial overlap of samplings
842  //
843  if( (option & LArNeighbours::upAndDown) ) {
844  // granularity of the initial region
845  double gEta = (double)(emRegion->etaGranularity());
846  // initial eta
847  int nEta = int( (index-minHash) / nPhi);
848  double absEta = (double)(emRegion->etaMin()) + (double)(nEta * gEta);
849 
850  // previous neighbours in sampling
851  if( (option & LArNeighbours::prevInSamp) ){
852  get_prevInSamp(emRegion, index, nPhi, minHash, gEta, gPhi, absEta, neighbourIndex, neighbList);
853  }
854 
855  // next neighbours in sampling
856  if( (option & LArNeighbours::nextInSamp) ){
857  get_nextInSamp(emRegion, index, nPhi, minHash, gEta, gPhi, absEta, neighbourIndex, neighbList);
858  }
859  }
860 
861  //
862  // .... neighbours across subdet
863  //
865  // granularity of the initial region
866  double gEta = (double)(emRegion->etaGranularity());
867  // initial eta
868  int nEta = int( (index-minHash) / nPhi);
869  double absEta = (double)(emRegion->etaMin()) + (double)(nEta * gEta);
870 
871  // prev neighbours in subdet
872  if( (option & LArNeighbours::prevSubDet) ){
873  get_prevInSubdet(emRegion, index, nPhi, minHash, gEta, gPhi, absEta, neighbourIndex, neighbList);
874  }
875  // next neighbours in subdet
876  if( (option & LArNeighbours::nextSubDet) ){
877  get_nextInSubdet(emRegion, index, nPhi, minHash, gEta, gPhi, absEta, neighbourIndex, neighbList);
878  }
879  }
880 
881 
882  neighbourList.resize(neighbourIndex);
883  if (neighbourIndex > 0) {
884  if (neighbourIndex <= maxNeighb) {
885  std::copy (&neighbList[0], &neighbList[neighbourIndex], neighbourList.begin());
886  result = 0 ;
887  } else {
888  if(m_msgSvc) {
889  MsgStream log(m_msgSvc, "LArEM_Base_ID" );
890  log << MSG::WARNING << " more than 22 neighbours for this cell, NONE will be retained" << endmsg;
891  }
892  else {
893  std::cout << "WARNING: more than 22 neighbours for this cell, NONE will be retained " << neighbourIndex << std::endl;
894  }
895  }
896  }
897 
898  return result;
899 }
900 
901 
902 int LArEM_Base_ID::get_prevInPhi(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
903  int& neighbourIndex, IdentifierHash* neighbList)
904 {
905  int result = 1;
906  unsigned int nIndex = index-1;
907  if(!emRegion->isPhiMin(index)) {
908  if( ((index-minHash)%(nPhi)) == 0 ) nIndex=index+nPhi-1;
909  IdentifierHash nHash = nIndex;
910  neighbList[neighbourIndex] = nHash;
911  neighbourIndex++;
912  result = 0;
913  }
914  return result;
915 }
916 
917 int LArEM_Base_ID::get_nextInPhi(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
918  int& neighbourIndex, IdentifierHash* neighbList)
919 {
920  int result = 1;
921  if(!emRegion->isPhiMax(index)) {
922  unsigned int nIndex = index+1;
923  if( ((index-minHash+1)%(nPhi)) == 0 ) nIndex=index-nPhi+1;
924  IdentifierHash nHash = nIndex;
925  neighbList[neighbourIndex] = nHash;
926  neighbourIndex++;
927  result = 0;
928  }
929  return result;
930 }
931 
932 int LArEM_Base_ID::get_prevInEta(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const float& gPhi,
933  const unsigned int& minHash,
934  int& neighbourIndex, IdentifierHash* neighbList, unsigned int& nBiggerCell) const
935 {
936  int result = 1;
937 
938  unsigned int nIndex = 0;
939  IdentifierHash nHash = 0;
940 
941  if( emRegion->isEtaMin(index)){
942  // eta == etaMin -> go to previous region in eta
943  short int nPrevEtaRegion = emRegion->prevEtaRegion();
944  // no neighbour if no previous region in eta
945  if( nPrevEtaRegion != NOT_VALID_REGION ) {
946  LArEM_region* prevEmRegion = m_vecOfRegions[nPrevEtaRegion];
947  if(emRegion->isFirstBarrelRegion()) {
948  // special case: barrel middle
949  unsigned int minHashMinus = prevEmRegion->hashMin();
950  nIndex = minHashMinus + index-minHash ;
951  nHash = nIndex;
952  neighbList[neighbourIndex] = nHash;
953  neighbourIndex++;
954  result = 0;
955  }
956  else {
957  // Tell clang to optimize assuming that FP exceptions can trap.
958  // Otherwise, it can vectorize the division, which can lead to
959  // spurious division-by-zero traps from unused vector lanes.
961  short int nPhiMinus = prevEmRegion->phiN();
962  float gPhiMinus= prevEmRegion->phiGranularity();
963  unsigned int maxHashMinus = prevEmRegion->hashMax();
964  float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
965  float rPhi = (index-minHash)*gPhi+emRegion->phiMin();
966  int nPhiMinusFirst = int(std::floor((rPhi -prevEmRegion->phiMin())
967  /gPhiMinus+phiMargin))
968  +maxHashMinus-nPhiMinus;
969  int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevEmRegion->phiMin())
970  /gPhiMinus+phiMargin))
971  +maxHashMinus-nPhiMinus;
972  if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
973 
974  for(int i=nPhiMinusFirst; i<nPhiMinusNext; i++){
975  nIndex = i ;
976  if(nIndex != nBiggerCell) {
977  nHash = nIndex;
978  neighbList[neighbourIndex] = nHash;
979  neighbourIndex++;
980  result = 0;
981  }
982  // to avoid duplicated cells in corners
983  if(gPhi < gPhiMinus && nBiggerCell == NOT_VALID_HASH) nBiggerCell=nIndex;
984  }
985  }
986  }
987  }
988  else {
989  // stay in same region (1 neighbour)
990  nIndex = index - nPhi;
991  nHash = nIndex;
992  neighbList[neighbourIndex] = nHash;
993  neighbourIndex++;
994  result = 0;
995  }
996  return result;
997 }
998 
999 int LArEM_Base_ID::get_nextInEta(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const float& gPhi,
1000  const unsigned int& maxHash,
1001  int& neighbourIndex, IdentifierHash* neighbList, unsigned int& nBiggerCell) const
1002 {
1003  int result = 1;
1004 
1005  unsigned int nIndex = 0;
1006  IdentifierHash nHash = 0;
1007 
1008  if( emRegion->isEtaMax(index)){
1009  // eta == etaMax -> go to next region in eta
1010  short int nNextEtaRegion = emRegion->nextEtaRegion();
1011  // no neighbour if no next region in eta
1012  if( nNextEtaRegion != NOT_VALID_REGION ) {
1013  // Tell clang to optimize assuming that FP exceptions can trap.
1014  // Otherwise, it can vectorize the division, which can lead to
1015  // spurious division-by-zero traps from unused vector lanes.
1017  LArEM_region* nextEmRegion = m_vecOfRegions[nNextEtaRegion];
1018  float gPhiPlus= nextEmRegion->phiGranularity();
1019  unsigned int minHashPlus = nextEmRegion->hashMin();
1020  float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
1021  float rPhi = (index+nPhi-maxHash)*gPhi+emRegion->phiMin();
1022  int nPhiPlusFirst = int(std::floor((rPhi -nextEmRegion->phiMin())
1023  /gPhiPlus+phiMargin))+minHashPlus;
1024  int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextEmRegion->phiMin())
1025  /gPhiPlus+phiMargin))+minHashPlus;
1026  if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
1027 
1028  for(int i=nPhiPlusFirst; i<nPhiPlusNext; i++){
1029  nIndex = i ;
1030  if(nIndex != nBiggerCell) {
1031  nHash = nIndex;
1032  neighbList[neighbourIndex] = nHash;
1033  neighbourIndex++;
1034  result = 0;
1035  }
1036  // to avoid duplicated cells in corners
1037  if(gPhi < gPhiPlus && nBiggerCell == NOT_VALID_HASH) nBiggerCell=nIndex;
1038  }
1039  }
1040  }
1041  else {
1042  // stay in same region (1 neighbour)
1043  nIndex = index + nPhi;
1044  nHash = nIndex;
1045  neighbList[neighbourIndex] = nHash;
1046  neighbourIndex++;
1047  result = 0;
1048  }
1049  return result;
1050 }
1051 
1052 int LArEM_Base_ID::get_prevInSamp(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
1053  const double& gEta, const float& gPhi, const double& absEta,
1054  int& neighbourIndex, IdentifierHash* neighbList) const
1055 {
1056  int result = 1;
1057 
1058  // neighbours' indices
1059  unsigned int nIndex=0;
1060  // neighbours' hash
1061  IdentifierHash nHash=0;
1062 
1063  // previous region in sampling
1064  const std::vector<short int>& prevSampRegion= emRegion->prevSamplingRegion();
1065  int nPrevSampReg = prevSampRegion.size();
1066  if(nPrevSampReg > 0) {
1067  for(int ireg=0; ireg<nPrevSampReg; ireg++) {
1068  LArEM_region* prevEmRegion = m_vecOfRegions[prevSampRegion[ireg]];
1069  // eta granularity of previous region in sampling
1070  double gEtaMinus= (double)(prevEmRegion->etaGranularity());
1071  // starting eta of prev region
1072  double minEtaMinus = (double)(prevEmRegion->etaMin());
1073  double maxEtaMinus = (double)(prevEmRegion->etaMax());
1074  double margin = 0.25*std::min(gEta,gEtaMinus);
1075  if((minEtaMinus < absEta+gEta-margin) && (absEta+margin < maxEtaMinus)) {
1076  // Tell clang to optimize assuming that FP exceptions can trap.
1077  // Otherwise, it can vectorize the division, which can lead to
1078  // spurious division-by-zero traps from unused vector lanes.
1080 
1081  // phi granularity of previous region in sampling
1082  float gPhiMinus= prevEmRegion->phiGranularity();
1083  // max phi of previous region in sampling
1084  short int nPhiMinus = prevEmRegion->phiN();
1085  // first hash of previous region in sampling
1086  unsigned int minHashMinus = prevEmRegion->hashMin();
1087  float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
1088  // phi 'coordinate' in initial region
1089  float rPhi = ((index-minHash)%nPhi)*gPhi+emRegion->phiMin();
1090  int nPhiMinusFirst = int(std::floor((rPhi -prevEmRegion->phiMin())
1091  /gPhiMinus+phiMargin));
1092  int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevEmRegion->phiMin())
1093  /gPhiMinus+phiMargin));
1094  if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
1095 
1096  // eta 'coordinate' in initial region
1097  double fEtaMinus = (absEta-minEtaMinus) / gEtaMinus + margin ;
1098  // eta 'coordinate' in initial region + 1
1099  double fEtaMaxMinus = (absEta+gEta-minEtaMinus) / gEtaMinus + margin ;
1100  int nEtaMinus = int(fEtaMinus);
1101  int nEtaMaxMinus = int(fEtaMaxMinus);
1102  if ( nEtaMaxMinus == nEtaMinus ) nEtaMaxMinus++;
1103  for(int i=nEtaMinus; i<nEtaMaxMinus; i++) {
1104  for (int j=nPhiMinusFirst; j<nPhiMinusNext;j++) {
1105  nIndex = minHashMinus + i * nPhiMinus + j;
1106  if( (nIndex >= prevEmRegion->hashMin()) && (nIndex < prevEmRegion->hashMax()) ) {
1107  nHash = nIndex;
1108  neighbList[neighbourIndex] = nHash;
1109  neighbourIndex++;
1110  result = 0;
1111  }
1112  }
1113  }
1114  } // end eta condition
1115  } // loop on ireg
1116  }
1117  return result;
1118 }
1119 
1120 int LArEM_Base_ID::get_nextInSamp(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
1121  const double& gEta, const float& gPhi, const double& absEta,
1122  int& neighbourIndex, IdentifierHash* neighbList) const
1123 {
1124  int result = 1;
1125 
1126  // neighbours' indices
1127  unsigned int nIndex=0;
1128  // neighbours' hash
1129  IdentifierHash nHash=0;
1130 
1131  const std::vector<short int>& nextSampRegion= emRegion->nextSamplingRegion();
1132  int nNextSampReg = nextSampRegion.size();
1133  if(nNextSampReg > 0) {
1134  for(int ireg=0; ireg<nNextSampReg; ireg++) {
1135  LArEM_region* nextEmRegion = m_vecOfRegions[nextSampRegion[ireg]];
1136  double gEtaPlus = (double)(nextEmRegion->etaGranularity());
1137  float gPhiPlus= nextEmRegion->phiGranularity();
1138  double minEtaPlus = (double)(nextEmRegion->etaMin());
1139  double maxEtaPlus = (double)(nextEmRegion->etaMax());
1140  double margin = 0.25*std::min(gEta,gEtaPlus);
1141  if((minEtaPlus < absEta+gEta-margin) && (absEta+margin < maxEtaPlus)) {
1142  // Tell clang to optimize assuming that FP exceptions can trap.
1143  // Otherwise, it can vectorize the division, which can lead to
1144  // spurious division-by-zero traps from unused vector lanes.
1146 
1147  short int nPhiPlus = nextEmRegion->phiN();
1148  unsigned int minHashPlus = nextEmRegion->hashMin();
1149  float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
1150  // phi 'coordinate' in initial region
1151  float rPhi = ((index-minHash)%nPhi)*gPhi+emRegion->phiMin();
1152  int nPhiPlusFirst = int(std::floor((rPhi -nextEmRegion->phiMin())
1153  /gPhiPlus+phiMargin));
1154  int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextEmRegion->phiMin())
1155  /gPhiPlus+phiMargin));
1156  if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
1157 
1158  double fEtaPlus = (absEta-minEtaPlus) / gEtaPlus + margin ;
1159  // eta 'coordinate' in initial region + 1
1160  double fEtaMaxPlus = (absEta+gEta-minEtaPlus) / gEtaPlus + margin ;
1161  int nEtaPlus = int(fEtaPlus) ;
1162  int nEtaMaxPlus = int(fEtaMaxPlus) ;
1163  if (nEtaMaxPlus == nEtaPlus) nEtaMaxPlus++;
1164 
1165  for(int i=nEtaPlus; i<nEtaMaxPlus; i++){
1166  for(int j=nPhiPlusFirst; j<nPhiPlusNext; j++){
1167  nIndex = minHashPlus + i * nPhiPlus + j;
1168  if( (nIndex >= nextEmRegion->hashMin()) && (nIndex < nextEmRegion->hashMax()) ) {
1169  nHash = nIndex;
1170  neighbList[neighbourIndex] = nHash;
1171  neighbourIndex++;
1172  result = 0;
1173  }
1174  }
1175  }
1176  } // end eta condition
1177  } // end loop on regions
1178  }
1179  return result;
1180 }
1181 
1182 
1183 int LArEM_Base_ID::get_prevInSubdet(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
1184  const double& gEta, const float& gPhi, const double& absEta,
1185  int& neighbourIndex, IdentifierHash* neighbList) const
1186 {
1187  int result = 1;
1188 
1189  // neighbours' indices
1190  unsigned int nIndex=0;
1191  // neighbours' hash
1192  IdentifierHash nHash=0;
1193 
1194  // previous region in sampling
1195  const std::vector<short int>& prevSubdetRegion= emRegion->prevSubdetRegion();
1196  int nPrevSubdetReg = prevSubdetRegion.size();
1197  if(nPrevSubdetReg > 0) {
1198  for(int ireg=0; ireg<nPrevSubdetReg; ireg++) {
1199  LArEM_region* prevEmRegion = m_vecOfRegions[prevSubdetRegion[ireg]];
1200  // eta granularity of previous region in sampling
1201  double gEtaMinus= (double)(prevEmRegion->etaGranularity());
1202  // starting eta of prev region
1203  double minEtaMinus = (double)(prevEmRegion->etaMin());
1204  double maxEtaMinus = (double)(prevEmRegion->etaMax());
1205  double margin = 0.25*std::min(gEta,gEtaMinus);
1206  if((minEtaMinus < absEta+gEta-margin) && (absEta+margin < maxEtaMinus)) {
1207  // Tell clang to optimize assuming that FP exceptions can trap.
1208  // Otherwise, it can vectorize the division, which can lead to
1209  // spurious division-by-zero traps from unused vector lanes.
1211 
1212  // phi granularity of previous region in sampling
1213  float gPhiMinus= prevEmRegion->phiGranularity();
1214  // max phi of previous region in sampling
1215  short int nPhiMinus = prevEmRegion->phiN();
1216  // first hash of previous region in sampling
1217  unsigned int minHashMinus = prevEmRegion->hashMin();
1218  float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
1219  // phi 'coordinate' in initial region
1220  float rPhi = ((index-minHash)%nPhi)*gPhi+emRegion->phiMin();
1221  int nPhiMinusFirst = int(std::floor((rPhi -prevEmRegion->phiMin())
1222  /gPhiMinus+phiMargin));
1223  int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevEmRegion->phiMin())
1224  /gPhiMinus+phiMargin));
1225  if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
1226  // eta 'coordinate' in initial region
1227  double fEtaMinus = (absEta-minEtaMinus) / gEtaMinus + margin ;
1228  // eta 'coordinate' in initial region + 1
1229  double fEtaMaxMinus = (absEta+gEta-minEtaMinus) / gEtaMinus + margin ;
1230  int nEtaMinus = int(fEtaMinus);
1231  int nEtaMaxMinus = int(fEtaMaxMinus);
1232  if ( nEtaMaxMinus == nEtaMinus ) nEtaMaxMinus++;
1233 
1234  for(int i=nEtaMinus; i<nEtaMaxMinus; i++) {
1235  for (int j=nPhiMinusFirst; j<nPhiMinusNext;j++) {
1236  nIndex = minHashMinus + i * nPhiMinus + j;
1237  if( (nIndex >= prevEmRegion->hashMin()) && (nIndex < prevEmRegion->hashMax()) ) {
1238  nHash = nIndex;
1239  neighbList[neighbourIndex] = nHash;
1240  neighbourIndex++;
1241  result = 0;
1242  }
1243  }
1244  }
1245  } // end eta condition
1246  } // loop on ireg
1247  }
1248  return result;
1249 }
1250 
1251 int LArEM_Base_ID::get_nextInSubdet(const LArEM_region* emRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
1252  const double& gEta, const float& gPhi, const double& absEta,
1253  int& neighbourIndex, IdentifierHash* neighbList) const
1254 {
1255  int result = 1;
1256 
1257  // neighbours' indices
1258  unsigned int nIndex=0;
1259  // neighbours' hash
1260  IdentifierHash nHash=0;
1261 
1262  const std::vector<short int>& nextSubdetRegion= emRegion->nextSubdetRegion();
1263  int nNextSubdetReg = nextSubdetRegion.size();
1264  if(nNextSubdetReg > 0) {
1265  for(int ireg=0; ireg<nNextSubdetReg; ireg++) {
1266  LArEM_region* nextEmRegion = m_vecOfRegions[nextSubdetRegion[ireg]];
1267  double gEtaPlus = (double)(nextEmRegion->etaGranularity());
1268  float gPhiPlus= nextEmRegion->phiGranularity();
1269  double minEtaPlus = (double)(nextEmRegion->etaMin());
1270  double maxEtaPlus = (double)(nextEmRegion->etaMax());
1271  double margin = 0.25*std::min(gEta,gEtaPlus);
1272  if((minEtaPlus < absEta+gEta-margin) && (absEta+margin < maxEtaPlus)) {
1273  // Tell clang to optimize assuming that FP exceptions can trap.
1274  // Otherwise, it can vectorize the division, which can lead to
1275  // spurious division-by-zero traps from unused vector lanes.
1277 
1278  short int nPhiPlus = nextEmRegion->phiN();
1279  unsigned int minHashPlus = nextEmRegion->hashMin();
1280  float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
1281  // phi 'coordinate' in initial region
1282  float rPhi = ((index-minHash)%nPhi)*gPhi+emRegion->phiMin();
1283  int nPhiPlusFirst = int(std::floor((rPhi -nextEmRegion->phiMin())
1284  /gPhiPlus+phiMargin));
1285  int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextEmRegion->phiMin())
1286  /gPhiPlus+phiMargin));
1287  if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
1288 
1289  double fEtaPlus = (absEta-minEtaPlus) / gEtaPlus + margin ;
1290  // eta 'coordinate' in initial region + 1
1291  double fEtaMaxPlus = (absEta+gEta-minEtaPlus) / gEtaPlus + margin ;
1292  int nEtaPlus = int(fEtaPlus) ;
1293  int nEtaMaxPlus = int(fEtaMaxPlus) ;
1294  if (nEtaMaxPlus == nEtaPlus) nEtaMaxPlus++;
1295 
1296  for(int i=nEtaPlus; i<nEtaMaxPlus; i++) {
1297  for(int j=nPhiPlusFirst; j<nPhiPlusNext; j++) {
1298  nIndex = minHashPlus + i * nPhiPlus + j;
1299  if( (nIndex >= nextEmRegion->hashMin()) && (nIndex < nextEmRegion->hashMax()) ) {
1300  nHash = nIndex;
1301  neighbList[neighbourIndex] = nHash;
1302  neighbourIndex++;
1303  result = 0;
1304  }
1305  }
1306  }
1307  } // end eta condition
1308  } // end loop on regions
1309  }
1310  return result;
1311 }
1312 
1313 
1315 {
1316  MsgStream log(m_msgSvc, "LArEM_Base_ID" );
1317  if(m_msgSvc) {
1318  log << MSG::DEBUG << "init_neighbors" << endmsg;
1319  }
1320  else {
1321  std::cout << " LArEM_Base_ID::init_neighbors " << std::endl;
1322  }
1323 
1324  const std::vector<const IdDictRegion*>& vecOfDictRegions = dictRegions();
1325 
1326  //
1327  // ..... loop on regions -> store vector of LArEM_region*
1328  //
1329  m_vecOfRegions.resize(region_hash_max());
1330  short int reg=0;
1331  std::vector<Identifier>::const_iterator debut=reg_begin() ;
1332  std::vector<Identifier>::const_iterator fin =reg_end() ;
1333  for (; debut != fin; ++debut) {
1334  const Identifier& regId = (*debut);
1335 
1336  bool phiWrapAround = (dictionaryVersion() == "fullAtlas" );
1337  bool isBarrelMiddle = false;
1338 
1339  //
1340  // ..... translate regId to chanId and get hash
1341  //
1342 
1343  Identifier id ;
1344  unsigned int index0 = NOT_VALID_HASH;
1345  int etaMin = eta_min(regId);
1346  int phiMin = phi_min(regId);
1347  if(etaMin >= 0 && phiMin >= 0) {
1348  try{
1349  id = channel_id (regId, eta_min(regId), phi_min(regId) );
1350  }
1351  catch(LArID_Exception & except){
1352  if(m_msgSvc) {
1353  log << MSG::ERROR << " LArId exception "
1354  << (std::string)except
1355  << endmsg;
1356  }
1357  else {
1358  std::cout
1359  << " LArId exception "
1360  << (std::string)except
1361  << std::endl;
1362  }
1363  }
1364  IdentifierHash hashId = channel_hash (id) ;
1365  index0=hashId;
1366  }
1367  else {
1368  if(m_msgSvc) {
1369  log << MSG::WARNING << " could not find non negative etaMin and phiMin for region "
1370  << show_to_string(regId)
1371  << endmsg;
1372  }
1373  else {
1374  std::cout << "WARNING !! could not find non negative etaMin and phiMin for region "
1375  << show_to_string(regId)
1376  << std::endl;
1377  }
1378  index0 = 0;
1379  }
1380 
1381  short int deltaEta = eta_max(regId) - eta_min(regId) + 1 ;
1382  short int nPhi = phi_max(regId) - phi_min(regId) + 1 ;
1383  // starting eta
1384  float eta0 = this->eta0(reg);
1385  // eta granularity
1386  float deta = etaGranularity(reg);
1387  // starting phi
1388  float phi0 = this->phi0(reg);
1389  // phi granularity
1390  float dphi = phiGranularity(reg);
1391 
1392  // full range of regions
1393  unsigned int ireg0=0;
1394  unsigned int ireg1=region_hash_max();
1395  // if 2 symetric sides, in which side is the current reg.
1396  if(twoSymSides()) {
1397  if(reg < (short int)region_hash_max()/2) {
1398  ireg0=0;
1399  ireg1=region_hash_max()/2;
1400  } else {
1401  ireg0=region_hash_max()/2;
1402  ireg1=region_hash_max();
1403  }
1404  }
1405 
1406  //
1407  // .... compute prev/next regions in eta
1408  //
1409  short int regForPrevEta=NOT_VALID_REGION;
1410  IdDictRegion* prevEtaDicReg = vecOfDictRegions[reg]->m_prev_abs_eta;
1411  short int regForNextEta=NOT_VALID_REGION;
1412  IdDictRegion* nextEtaDicReg = vecOfDictRegions[reg]->m_next_abs_eta;
1413  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1414  if(vecOfDictRegions[ireg] == prevEtaDicReg) regForPrevEta = ireg;
1415  if(vecOfDictRegions[ireg] == nextEtaDicReg) regForNextEta = ireg;
1416  }
1417  // .... special case of barrel middle
1418  if(twoSymSides()) {
1419  if(eta0 < 0.1 ) {
1420  isBarrelMiddle = true;
1421  if(barrel_ec(regId) < 0) {
1422  regForPrevEta = reg+6;
1423  } else {
1424  regForPrevEta = reg-6;
1425  }
1426  }
1427  }
1428 
1429  //
1430  // .... compute prev/next regions in sampling
1431  //
1432  std::vector<short int> regForPrevSamp;
1433  std::vector<IdDictRegion*> prevSampDicReg = vecOfDictRegions[reg]->m_prev_samp;
1434  for(unsigned int isam=0;isam<prevSampDicReg.size();isam++){
1435  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1436  if(vecOfDictRegions[ireg] == prevSampDicReg[isam]) regForPrevSamp.push_back(ireg);
1437  }
1438  }
1439 
1440  std::vector<short int> regForNextSamp;
1441  std::vector<IdDictRegion*> nextSampDicReg = vecOfDictRegions[reg]->m_next_samp;
1442  for(unsigned int isam=0;isam<nextSampDicReg.size();isam++){
1443  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1444  if(vecOfDictRegions[ireg] == nextSampDicReg[isam]) regForNextSamp.push_back(ireg);
1445  }
1446  }
1447 
1448  //
1449  // .... compute prev/next regions in subdet
1450  //
1451  std::vector<short int> regForPrevSubdet;
1452  std::vector<IdDictRegion*> prevSubdetDicReg = vecOfDictRegions[reg]->m_prev_subdet;
1453  for(unsigned int isubdet=0;isubdet<prevSubdetDicReg.size();isubdet++){
1454  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1455  if(vecOfDictRegions[ireg] == prevSubdetDicReg[isubdet]) regForPrevSubdet.push_back(ireg);
1456  }
1457  }
1458 
1459  std::vector<short int> regForNextSubdet;
1460  std::vector<IdDictRegion*> nextSubdetDicReg = vecOfDictRegions[reg]->m_next_subdet;
1461  for(unsigned int isubdet=0;isubdet<nextSubdetDicReg.size();isubdet++){
1462  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1463  if(vecOfDictRegions[ireg] == nextSubdetDicReg[isubdet]) regForNextSubdet.push_back(ireg);
1464  }
1465  }
1466 
1467  //
1468  // ....now ready to build region object
1469  //
1470 
1471  LArEM_region * emRegion = new LArEM_region(index0,deltaEta,nPhi,eta0,deta,phi0,dphi,phiWrapAround,isBarrelMiddle,
1472  regForPrevEta,regForNextEta,
1473  regForPrevSamp,regForNextSamp,
1474  regForPrevSubdet,regForNextSubdet);
1475  // save in a vector for further use in get_neighbours method
1476  // optimized nov 2005
1477  // m_vecOfRegions.push_back(emRegion);
1478  m_vecOfRegions[reg]=emRegion;
1479  reg++;
1480  } // end of loop on regions
1481 
1482  //
1483  // ..... loop on channels
1484  //
1485  // optimized nov 2005
1486  m_cells.reserve(64);
1487  unsigned int i=0;
1488  reg=0;
1489  Identifier lastRegId;
1490  for (Identifier chanId : em_range()) {
1491  const Identifier& regId = region_id(chanId);
1492  if(regId != lastRegId) {
1493  m_cells.push_back(i);
1494  reg++;
1495  }
1496  ++i;
1497 
1498  if(m_do_checks) {
1499  // for cross check only
1500  IdentifierHash hashReg = region_hash (regId) ;
1501  if ((short int)hashReg != reg) {
1502  if(m_msgSvc) {
1503  log << MSG::ERROR << " init_neighbors: problem reg, hashReg = " << reg << " " << hashReg
1504  << endmsg;
1505  }
1506  else {
1507  std::cout << " init_neighbors: problem reg, hashReg = " << reg << " " << hashReg
1508  << std::endl;
1509  }
1510  }
1511  }
1512 
1513  lastRegId=regId;
1514  }
1515 
1516  return (0);
1517 }
1518 
1519 
1520 
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
AtlasDetectorID::lar_em_field_value
int lar_em_field_value() const
Definition: AtlasDetectorID.h:644
LArNeighbours::neighbourOption
neighbourOption
Definition: LArNeighbours.h:12
LArEM_Base_ID.h
Factor out code common between LArEM_ID and LArEM_SuperCell_ID.
CXXUTILS_TRAPPING_FP
#define CXXUTILS_TRAPPING_FP
Definition: trapping_fp.h:24
LArEM_Base_ID::phi
int phi(const Identifier id) const
return phi according to :
LArEM_region::prevSubdetRegion
const std::vector< short int > & prevSubdetRegion() const
region number of the prev region in subdet
Definition: LArEM_region.h:102
IdDictDictionary::build_multirange
MultiRange build_multirange() const
Get MultiRange for full dictionary.
Definition: IdDictMgr.cxx:1048
LArNeighbours::upAndDown
@ upAndDown
Definition: LArNeighbours.h:21
LArEM_Base_ID::m_eta_impl
IdDictFieldImplementation m_eta_impl
Definition: LArEM_Base_ID.h:423
LArEM_Base_ID::phi_max
int phi_max(const Identifier regId) const
max value of phi index (-999 == failure)
Definition: LArEM_Base_ID.cxx:125
LArEM_Base_ID::reg_end
id_iterator reg_end(void) const
end iterator over set of Region Identifiers
LArEM_Base_ID::m_ETA_INDEX
size_type m_ETA_INDEX
Definition: LArEM_Base_ID.h:414
get_generator_info.result
result
Definition: get_generator_info.py:21
IdDictGroup
Definition: IdDictDefs.h:355
LArEM_region::isEtaMin
bool isEtaMin(unsigned int index) const
is the considered cell in the first eta bin of the region ?
Definition: LArEM_region.h:76
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
LArEM_Base_ID::phi_min_init
int phi_min_init(const Identifier regId) const
Definition: LArEM_Base_ID.cxx:99
LArEM_region::phiMin
float phiMin() const
starting phi
Definition: LArEM_region.h:58
LArEM_region::nextSubdetRegion
const std::vector< short int > & nextSubdetRegion() const
region number of the next region in subdet
Definition: LArEM_region.h:105
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
IdDictFieldImplementation::show_to_string
std::string show_to_string(void) const
Definition: IdDictFieldImplementation.cxx:57
CaloIDHelper::channel_hash_max
size_type channel_hash_max() const
One more than the largest channel (cell) hash code.
LArEM_Base_ID::m_slar_impl
IdDictFieldImplementation m_slar_impl
Definition: LArEM_Base_ID.h:426
LArEM_Base_ID::HashCalc::m_nphi
size_type m_nphi
Definition: LArEM_Base_ID.h:446
LArNeighbours::corners2D
@ corners2D
Definition: LArNeighbours.h:17
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
index
Definition: index.py:1
CaloIDHelper::fill_vec_of_dict_regions
int fill_vec_of_dict_regions(const std::string &group_name="")
Initialize the list of detector regions.
Definition: CaloIDHelper.cxx:259
LArEM_region::isPhiMin
bool isPhiMin(unsigned int index) const
is the considered cell in the first phi bin of the region ?
Definition: LArEM_region.h:86
LArEM_Base_ID::region_id
Identifier region_id(const ExpandedIdentifier &exp_id) const
Build a cell identifier from an expanded identifier.
LArEM_Base_ID::init_neighbors
int init_neighbors(void)
Definition: LArEM_Base_ID.cxx:1314
CaloIDHelper::region_context
IdContext region_context() const
Return the context for regions.
LArNeighbours::nextSubDet
@ nextSubDet
Definition: LArNeighbours.h:23
ExpandedIdentifier::add
void add(element_type value)
LArEM_Base_ID::m_vecOfRegions
std::vector< LArEM_region * > m_vecOfRegions
Definition: LArEM_Base_ID.h:452
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:108
LArEM_Base_ID::region
int region(const Identifier id) const
return region according to :
IdContext::end_index
size_type end_index(void) const
Definition: IdContext.h:106
LArEM_Base_ID::sampling
int sampling(const Identifier id) const
return sampling according to :
LArEM_Base_ID::get_nextInSubdet
int get_nextInSubdet(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, const double &gEta, const float &gPhi, const double &absEta, int &neighbourIndex, IdentifierHash *neighbList) const
Definition: LArEM_Base_ID.cxx:1251
AtlasDetectorID::m_msgSvc
IMessageSvc * m_msgSvc
pointer to the message service
Definition: AtlasDetectorID.h:368
AtlasDetectorID::m_do_checks
bool m_do_checks
Flag for subclasses to know whether or not to perform checks.
Definition: AtlasDetectorID.h:362
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
LArEM_region::etaMax
float etaMax() const
end eta
Definition: LArEM_region.h:55
AtlasDetectorID::lar_field_value
int lar_field_value() const
Definition: AtlasDetectorID.h:614
LArEM_Base_ID::~LArEM_Base_ID
~LArEM_Base_ID(void)
Definition: LArEM_Base_ID.cxx:39
LArEM_Base_ID::init_hashes
int init_hashes(void)
Definition: LArEM_Base_ID.cxx:432
IdDictFieldImplementation::unpack
int unpack(Identifier id) const
Identifier manipulation methods.
Definition: IdDictFieldImplementation.h:148
python.DomainsRegistry.reg
reg
globals -----------------------------------------------------------------—
Definition: DomainsRegistry.py:343
LArNeighbours::prevInPhi
@ prevInPhi
Definition: LArNeighbours.h:12
LArEM_Base_ID::channel_id
Identifier channel_id(const ExpandedIdentifier &exp_id) const
Build a cell identifier from an expanded identifier.
LArEM_Base_ID::m_em_impl
IdDictFieldImplementation m_em_impl
Definition: LArEM_Base_ID.h:419
LArEM_Base_ID::get_expanded_id
virtual int get_expanded_id(const Identifier &id, ExpandedIdentifier &exp_id, const IdContext *context) const
create expanded Identifier from Identifier (return == 0 for OK)
Definition: LArEM_Base_ID.cxx:205
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:662
TrigVSI::AlgConsts::nPhi
constexpr int nPhi
Default bin number of phi for vertex map.
Definition: Trigger/TrigTools/TrigVrtSecInclusive/TrigVrtSecInclusive/Constants.h:27
IdDictDictionary::find_field
IdDictField * find_field(const std::string &name) const
Definition: IdDictMgr.cxx:309
IdDictRegion
Definition: IdDictDefs.h:448
CaloIDHelper::regions
const HashGroup & regions() const
Return the HashGroup for regions.
AtlasDetectorID::dictionaryVersion
virtual std::string dictionaryVersion(void) const override
Definition: AtlasDetectorID.cxx:347
LArEM_Base_ID::eta
int eta(const Identifier id) const
return eta according to :
LArEM_Base_ID::get_nextInSamp
int get_nextInSamp(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, const double &gEta, const float &gPhi, const double &absEta, int &neighbourIndex, IdentifierHash *neighbList) const
Definition: LArEM_Base_ID.cxx:1120
AtlasDetectorID::m_do_neighbours
bool m_do_neighbours
Flag for subclasses to know whether or not to perform neighbour initialization.
Definition: AtlasDetectorID.h:365
LArEM_Base_ID::initLevelsFromDict
int initLevelsFromDict(const std::string &group_name)
Definition: LArEM_Base_ID.cxx:226
LArEM_Base_ID::get_prevInSamp
int get_prevInSamp(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, const double &gEta, const float &gPhi, const double &absEta, int &neighbourIndex, IdentifierHash *neighbList) const
Definition: LArEM_Base_ID.cxx:1052
LArEM_Base_ID::m_sampling_impl
IdDictFieldImplementation m_sampling_impl
Definition: LArEM_Base_ID.h:421
IdDictDefs.h
LArEM_Base_ID::m_full_em_range
MultiRange m_full_em_range
Definition: LArEM_Base_ID.h:406
LArEM_Base_ID::m_phi_impl
IdDictFieldImplementation m_phi_impl
Definition: LArEM_Base_ID.h:424
LArNeighbours::nextInSamp
@ nextInSamp
Definition: LArNeighbours.h:20
LArEM_region
This class provides an interface to deal with regions in the neighbours finding
Definition: LArEM_region.h:20
LArEM_Base_ID::eta_max
int eta_max(const Identifier regId) const
max value of eta index (-999 == failure)
Definition: LArEM_Base_ID.cxx:78
LArNeighbours::nextInPhi
@ nextInPhi
Definition: LArNeighbours.h:13
IdDictMgr
Definition: IdDictDefs.h:32
LArEM_Base_ID::m_region_impl
IdDictFieldImplementation m_region_impl
Definition: LArEM_Base_ID.h:422
LArEM_Base_ID::channel_hash
IdentifierHash channel_hash(Identifier channelId) const
create hash id from channel id
IdDictDictionary::find_group
IdDictGroup * find_group(const std::string &group_name) const
Definition: IdDictMgr.cxx:383
StrFormat.h
Provide helper functions to create formatted strings.
IdDictMgr::find_dictionary
IdDictDictionary * find_dictionary(const std::string &name) const
Access dictionary by name.
Definition: IdDictMgr.cxx:161
CaloIDHelper::region_hash_max
size_type region_hash_max() const
One more than the largest region hash code.
LArEM_Base_ID::HashCalc
small class holding the starting hash value, the min eta and the number of phi bins of each region
Definition: LArEM_Base_ID.h:436
Range::field::has_minimum
bool has_minimum() const
Definition: DetectorDescription/Identifier/src/Range.cxx:390
Trk::index1
@ index1
Definition: BoundarySurfaceFace.h:48
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:53
LArEM_region::phiGranularity
float phiGranularity() const
phi granularity
Definition: LArEM_region.h:43
CaloIDHelper::etaGranularity
float etaGranularity(const IdentifierHash regHash) const
Return the eta granularity of a region, or NOT_VALID.
Definition: CaloIDHelper.cxx:185
lumiFormat.i
int i
Definition: lumiFormat.py:92
LArEM_Base_ID::phi_min
int phi_min(const Identifier regId) const
min value of phi index (-999 == failure)
IdDictFieldImplementation::set_bits
void set_bits(size_type bits, size_type bits_offset)
Definition: IdDictFieldImplementation.h:279
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
CaloIDHelper::dict
const IdDictDictionary * dict() const
Return the dictionary for this subdetector.
CaloIDHelper
Base class to factor out code common among Calo ID helpers.
Definition: CaloIDHelper.h:36
LArEM_Base_ID::m_bec_reg_impl
IdDictFieldImplementation m_bec_reg_impl
Definition: LArEM_Base_ID.h:450
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
LArEM_Base_ID::m_full_region_range
MultiRange m_full_region_range
Definition: LArEM_Base_ID.h:405
LArEM_region::isEtaMax
bool isEtaMax(unsigned int index) const
is the considered cell in the last eta bin of the region ?
Definition: LArEM_region.h:81
LArEM_Base_ID::m_SAMPLING_INDEX
size_type m_SAMPLING_INDEX
Definition: LArEM_Base_ID.h:412
LArEM_Base_ID::twoSymSides
bool twoSymSides() const
True if the + and - sides of the calorimeter are identical (true layout).
IdDictFieldImplementation::bits_offset
size_type bits_offset() const
Definition: IdDictFieldImplementation.h:209
IdDictDictionary::m_regions
std::vector< IdDictRegion * > m_regions
Definition: IdDictDefs.h:302
LArEM_region::etaMin
float etaMin() const
starting eta
Definition: LArEM_region.h:52
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
mc.group_name
group_name
Definition: mc.PhPy8EG_A14NNPDF23_NNLOPS_example.py:33
LArEM_Base_ID::m_lar_impl
IdDictFieldImplementation m_lar_impl
Definition: LArEM_Base_ID.h:418
NOT_VALID_REGION
@ NOT_VALID_REGION
Definition: LArEM_region.h:11
LArNeighbours::prevSubDet
@ prevSubDet
Definition: LArNeighbours.h:22
LArEM_region::hashMax
unsigned int hashMax() const
hash Id of the last cell of the region +1
Definition: LArEM_region.h:67
LArEM_Base_ID::m_slar
unsigned m_slar
Definition: LArEM_Base_ID.h:401
LArEM_region::phiN
short int phiN() const
number of phi bins
Definition: LArEM_region.h:37
LArEM_Base_ID::m_bec_impl
IdDictFieldImplementation m_bec_impl
Definition: LArEM_Base_ID.h:420
LArEM_region.h
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
LArEM_region::prevSamplingRegion
const std::vector< short int > & prevSamplingRegion() const
region number of the prev region in sampling
Definition: LArEM_region.h:96
LArNeighbours::prevInSamp
@ prevInSamp
Definition: LArNeighbours.h:19
AtlasDetectorID::m_quiet
bool m_quiet
If true, suppress DEBUG/INFO messages.
Definition: AtlasDetectorID.h:371
LArEM_Base_ID::get_prevInPhi
static int get_prevInPhi(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList)
Definition: LArEM_Base_ID.cxx:902
Range::field::get_minimum
element_type get_minimum() const
Definition: DetectorDescription/Identifier/Identifier/Range.h:524
Trk::index0
@ index0
Definition: BoundarySurfaceFace.h:47
LArEM_Base_ID::eta_min
int eta_min(const Identifier regId) const
min value of eta index (-999 == failure)
Definition: LArEM_Base_ID.cxx:52
LArEM_Base_ID::get_nextInPhi
static int get_nextInPhi(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList)
Definition: LArEM_Base_ID.cxx:917
CaloIDHelper::initialize_base_from_dictionary
int initialize_base_from_dictionary(const IdDictMgr &dict_mgr, const std::string &dict_name)
Do basic initialization of the helper.
Definition: CaloIDHelper.cxx:232
min
#define min(a, b)
Definition: cfImp.cxx:40
Range::field::has_maximum
bool has_maximum() const
Definition: DetectorDescription/Identifier/src/Range.cxx:398
LArEM_Base_ID::region_id_checks
void region_id_checks(int barrel_ec, int sampling, int region) const
Definition: LArEM_Base_ID.cxx:146
trapping_fp.h
Tell the compiler to optimize assuming that FP may trap.
IdDictDictionary::get_label_value
int get_label_value(const std::string &field, const std::string &label, int &value) const
Definition: IdDictMgr.cxx:338
LArEM_Base_ID::m_EM_INDEX
size_type m_EM_INDEX
Definition: LArEM_Base_ID.h:410
Trk::index2
@ index2
Definition: BoundarySurfaceFace.h:49
CxxUtils::strformat
std::string strformat(const char *fmt,...)
return a std::string according to a format fmt and varargs
Definition: StrFormat.cxx:49
CaloIDHelper::eta0
float eta0(const IdentifierHash regHash) const
Return the minimum eta of region, or NOT_VALID.
Definition: CaloIDHelper.cxx:207
LArEM_Base_ID::m_cells
std::vector< unsigned > m_cells
Definition: LArEM_Base_ID.h:453
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:191
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
LArEM_Base_ID::get_neighbours
int get_neighbours(const IdentifierHash id, const LArNeighbours::neighbourOption &option, std::vector< IdentifierHash > &neighbourList) const
access to hashes for neighbours return == 0 for neighbours found option = prevInPhi,...
Definition: LArEM_Base_ID.cxx:696
LArEM_Base_ID::barrel_ec
int barrel_ec(const Identifier id) const
return barrel_ec according to :
AtlasDetectorID::setDictVersion
virtual void setDictVersion(const IdDictMgr &dict_mgr, const std::string &name) override
Definition: AtlasDetectorID.cxx:759
Range
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
Definition: DetectorDescription/Identifier/Identifier/Range.h:27
LArEM_Base_ID::get_prevInEta
int get_prevInEta(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const float &gPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList, unsigned int &nBiggerCell) const
Definition: LArEM_Base_ID.cxx:932
LArEM_Base_ID::m_SLAR_INDEX
size_type m_SLAR_INDEX
Definition: LArEM_Base_ID.h:416
LArEM_region::isFirstBarrelRegion
bool isFirstBarrelRegion() const
true if region close to barrel middle
Definition: LArEM_region.h:49
python.PyKernel.init
def init(v_theApp, v_rootStream=None)
Definition: PyKernel.py:45
LArEM_region::nextEtaRegion
short int nextEtaRegion() const
region number of the next region in eta
Definition: LArEM_region.h:73
LArEM_Base_ID::m_PHI_INDEX
size_type m_PHI_INDEX
Definition: LArEM_Base_ID.h:415
IdDictDictionary
Definition: IdDictDefs.h:97
Range::field::get_maximum
element_type get_maximum() const
Definition: DetectorDescription/Identifier/Identifier/Range.h:531
LArEM_Base_ID::HashCalc::m_phimin
size_type m_phimin
Definition: LArEM_Base_ID.h:445
CaloIDHelper::channels
const HashGroup & channels() const
Return the HashGroup for channels (cells).
MultiRange::match
int match(const ExpandedIdentifier &id) const
Match an identifier.
Definition: DetectorDescription/Identifier/src/Range.cxx:2463
AtlasDetectorID::reinitialize
bool reinitialize(const IdDictMgr &dict_mgr)
Test whether an idhelper should be reinitialized based on the change of tags.
Definition: AtlasDetectorID.cxx:284
LArEM_region::etaGranularity
float etaGranularity() const
eta granularity
Definition: LArEM_region.h:40
LArCellBinning.etaMin
etaMin
Definition: LArCellBinning.py:84
LArEM_Base_ID::m_BEC_INDEX
size_type m_BEC_INDEX
Definition: LArEM_Base_ID.h:411
CaloLCW_tf.group
group
Definition: CaloLCW_tf.py:28
IdDictDictionary::m_name
std::string m_name
Definition: IdDictDefs.h:283
CaloIDHelper::phi0
float phi0(const IdentifierHash regHash) const
Return the minimum phi of region, or NOT_VALID.
Definition: CaloIDHelper.cxx:218
LArEM_Base_ID::m_two_sym_sides
bool m_two_sym_sides
Definition: LArEM_Base_ID.h:403
AtlasDetectorID::show_to_string
std::string show_to_string(Identifier id, const IdContext *context=0, char sep='.') const
or provide the printout in string form
Definition: AtlasDetectorID.cxx:574
CaloIDHelper::dictRegions
const std::vector< const IdDictRegion * > & dictRegions() const
Return the vector of IdDictRegion, accessed via region hash.
LArEM_Base_ID::HashCalc::m_etamin
size_type m_etamin
Definition: LArEM_Base_ID.h:444
LArNeighbours::nextInEta
@ nextInEta
Definition: LArNeighbours.h:15
MultiRange::size
size_type size() const
Definition: DetectorDescription/Identifier/src/Range.cxx:2488
DeMoScan.first
bool first
Definition: DeMoScan.py:534
DEBUG
#define DEBUG
Definition: page_access.h:11
LArEM_Base_ID::get_prevInSubdet
int get_prevInSubdet(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, const double &gEta, const float &gPhi, const double &absEta, int &neighbourIndex, IdentifierHash *neighbList) const
Definition: LArEM_Base_ID.cxx:1183
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
TauGNNUtils::Variables::absEta
bool absEta(const xAOD::TauJet &tau, double &out)
Definition: TauGNNUtils.cxx:232
ExpandedIdentifier::clear
void clear()
LArEM_Base_ID::m_em_region_index
size_type m_em_region_index
Definition: LArEM_Base_ID.h:408
compute_lumi.fin
fin
Definition: compute_lumi.py:19
LArEM_Base_ID::get_nextInEta
int get_nextInEta(const LArEM_region *emRegion, const unsigned int &index, const short int &nPhi, const float &gPhi, const unsigned int &maxHash, int &neighbourIndex, IdentifierHash *neighbList, unsigned int &nBiggerCell) const
Definition: LArEM_Base_ID.cxx:999
LArEM_Base_ID::initialize_base_from_dictionary
int initialize_base_from_dictionary(const IdDictMgr &dict_mgr, const std::string &group_name)
initialization from the identifier dictionary
Definition: LArEM_Base_ID.cxx:448
LArNeighbours::prevInEta
@ prevInEta
Definition: LArNeighbours.h:14
LArEM_region::prevEtaRegion
short int prevEtaRegion() const
region number of the previous region in eta
Definition: LArEM_region.h:70
calibdata.copy
bool copy
Definition: calibdata.py:27
CaloIDHelper::phiGranularity
float phiGranularity(const IdentifierHash regHash) const
Return the phi granularity of a region, or NOT_VALID.
Definition: CaloIDHelper.cxx:196
Range::field
This is the individual specification for the range of one ExpandedIdentifier field.
Definition: DetectorDescription/Identifier/Identifier/Range.h:37
IdDictField
Definition: IdDictDefs.h:318
LArEM_Base_ID::channel_id_checks
void channel_id_checks(int barrel_ec, int sampling, int region, int eta, int phi) const
Definition: LArEM_Base_ID.cxx:162
IdentifierHash
Definition: IdentifierHash.h:38
LArEM_Base_ID::em_range
id_range em_range() const
Range over full set of EM Identifiers.
LArEM_Base_ID::reg_begin
id_iterator reg_begin(void) const
begin iterator over set of Region Identifiers
TrigVSI::AlgConsts::nEta
constexpr int nEta
Default bin number of eta for vertex map.
Definition: Trigger/TrigTools/TrigVrtSecInclusive/TrigVrtSecInclusive/Constants.h:26
LArEM_Base_ID::m_vecOfPhiMin
std::vector< int > m_vecOfPhiMin
Definition: LArEM_Base_ID.h:428
LArEM_region::isPhiMax
bool isPhiMax(unsigned int index) const
is the considered cell in the last phi bin of the region ?
Definition: LArEM_region.h:91
LArCellBinning.etamin
etamin
Definition: LArCellBinning.py:137
IdContext
class IdContext
Definition: IdContext.h:34
LArEM_Base_ID::NOT_VALID_HASH
@ NOT_VALID_HASH
Definition: LArEM_Base_ID.h:350
CaloIDHelper::region_hash
IdentifierHash region_hash(Identifier regionId) const
Convert a connected region Identifier to a hash code.
LArEM_Base_ID::m_LAR_INDEX
size_type m_LAR_INDEX
Definition: LArEM_Base_ID.h:409
LArEM_region::nextSamplingRegion
const std::vector< short int > & nextSamplingRegion() const
region number of the next region in sampling
Definition: LArEM_region.h:99
AtlasDetectorID::lar_em_exp
ExpandedIdentifier lar_em_exp(void) const
LAr.
Definition: AtlasDetectorID.h:562
LArID_Exception
Exception class for LAr Identifiers.
Definition: LArID_Exception.h:20
LArEM_region::hashMin
unsigned int hashMin() const
hash Id of the first cell of the region
Definition: LArEM_region.h:64
LArEM_Base_ID::channel_hash_binary_search
IdentifierHash channel_hash_binary_search(Identifier channelId) const
create hash id from channel id – method NOT optimised, please use channel_hash() above
LArNeighbours::all2D
@ all2D
Definition: LArNeighbours.h:18
LArEM_Base_ID::m_REGION_INDEX
size_type m_REGION_INDEX
Definition: LArEM_Base_ID.h:413
LArEM_Base_ID::is_supercell
bool is_supercell(const Identifier id) const
Test if the identifier represents a supercell.
Definition: LArEM_Base_ID.cxx:46
LArEM_Base_ID::HashCalc::m_hash
IdentifierHash m_hash
Definition: LArEM_Base_ID.h:443
IdDictFieldImplementation::size_type
Identifier::size_type size_type
Definition: IdDictFieldImplementation.h:62
LArEM_Base_ID::LArEM_Base_ID
LArEM_Base_ID(const std::string &name, bool supercell)
Constructor.
Definition: LArEM_Base_ID.cxx:22
CaloIDHelper::HashGroup::hash_max
size_type hash_max() const
Return one more than the largest hash code.
LArEM_Base_ID::m_hash_calcs
std::vector< HashCalc > m_hash_calcs
Definition: LArEM_Base_ID.h:448
IdDictFieldImplementation::bits
size_type bits() const
Definition: IdDictFieldImplementation.h:203