ATLAS Offline Software
LArHEC_Base_ID.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
15 #include "IdDict/IdDictField.h"
16 #include "IdDict/IdDictMgr.h"
17 #include "IdDict/IdDictRegion.h"
20 #include "LArHEC_region.h"
21 #include "CxxUtils/StrFormat.h"
22 #include "CxxUtils/trapping_fp.h"
23 
24 #include "GaudiKernel/MsgStream.h"
25 
26 #include <cmath>
27 #include <iostream>
28 #include <set>
29 #include <string>
30 
32 
33 
35  const std::string& group,
36  bool supercell) :
38  , m_slar (supercell ? 1 : 0)
39  , m_hec_region_index(0)
40  , m_LAR_INDEX(999)
41  , m_HEC_INDEX(999)
42  , m_POSNEG_INDEX(999)
43  , m_SAMPLING_INDEX(999)
44  , m_REGION_INDEX(999)
45  , m_ETA_INDEX(999)
46  , m_PHI_INDEX(999)
47  , m_SLAR_INDEX(999)
48  , m_two_sym_sides(1)
49 {
50 }
51 
53 {
56  for (; first != last; ++first) delete (*first);
57 }
58 
59 Identifier LArHEC_Base_ID::channel_id ( int pos_neg, int sampling,
60  int eta, int phi ) const
61 {
62  // must calculate region number and shift eta
63  int region=999;
64  if ( 0 <= eta && eta < 10 ) { region = 0;}
65  else if ( 10 <= eta && eta < 14 ) { region = 1; eta -= 10;}
66 
67  return (channel_id (pos_neg, sampling, region, eta, phi));
68 }
69 
70 
71 Identifier LArHEC_Base_ID::channel_id ( int pos_neg, int sampling, int sector, int region,
72  int eta, int phi_sector ) const
73 {
74  int phi = ( region == 0 ? sector*2 + phi_sector : sector );
75  return (channel_id (pos_neg, sampling, region, eta, phi ));
76 }
77 
78 int LArHEC_Base_ID::eta_min(const Identifier regId) const
79 {
80  ExpandedIdentifier expId;
81  IdContext region_cntxt = region_context();
82  if(!get_expanded_id(regId, expId, &region_cntxt)) {
83  int result = -999;
84  for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
86  if (range.match(expId)) {
87  const Range::field& eta_field = range[m_ETA_INDEX];
88  if (not eta_field.empty()) {
89  int etamin = eta_field.get_minimum();
90  if (-999 == result) {
91  result = etamin;
92  }
93  else {
94  if (etamin < result) result = etamin;
95  }
96  }
97  }
98  }
99  return (result);
100  }
101  return (-999);
102 }
103 
104 int LArHEC_Base_ID::eta_max(const Identifier regId) const
105 {
106  ExpandedIdentifier expId;
107  IdContext region_cntxt = region_context();
108  if(!get_expanded_id(regId, expId, &region_cntxt)) {
109  int result = -999;
110  for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
111  const Range& range = m_full_channel_range[i];
112  if (range.match(expId)) {
113  const Range::field& eta_field = range[m_ETA_INDEX];
114  if (not eta_field.empty()) {
115  int etamax = eta_field.get_maximum();
116  if (result < etamax) result = etamax;
117  }
118  }
119  }
120  return (result);
121  }
122  return (-999); // default
123 }
124 
126 {
127  ExpandedIdentifier expId;
128  IdContext region_cntxt = region_context();
129  if(!get_expanded_id(regId, expId, &region_cntxt)) {
130  int result = -999;
131  for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
132  const Range& range = m_full_channel_range[i];
133  if (range.match(expId)) {
134  const Range::field& phi_field = range[m_PHI_INDEX];
135  if (not phi_field.empty()) {
136  int phimin = phi_field.get_minimum();
137  if (-999 == result) {
138  result = phimin;
139  }
140  else {
141  if (phimin < result) result = phimin;
142  }
143  }
144  }
145  }
146  return (result);
147  }
148  return (-999); // default
149 }
150 
151 int LArHEC_Base_ID::phi_max(const Identifier regId) const
152 {
153  ExpandedIdentifier expId;
154  IdContext region_cntxt = region_context();
155  if(!get_expanded_id(regId, expId, &region_cntxt)) {
156  int result = -999;
157  for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
158  const Range& range = m_full_channel_range[i];
159  if (range.match(expId)) {
160  const Range::field& phi_field = range[m_PHI_INDEX];
161  if (not phi_field.empty()) {
162  int phimax = phi_field.get_maximum();
163  if (result < phimax) result = phimax;
164  }
165  }
166  }
167  return (result);
168  }
169  return (-999); // default
170 }
171 
173  const std::string& group_name)
174 /*===================================================================*/
175 {
176  MsgStream log(m_msgSvc, "LArHEC_Base_ID" );
177 
178  std::string strg = "initialize_base_from_dictionary";
179  log << MSG::DEBUG << strg << endmsg;
180 
181  // Check whether this helper should be reinitialized
182  if (!reinitialize(dict_mgr)) {
183  log << MSG::DEBUG << "Request to reinitialize not satisfied - tags have not changed" << endmsg;
184  return (0);
185  }
186  else {
187  if(m_msgSvc)log << MSG::DEBUG << "(Re)initialize" << endmsg;
188  }
189 
190  // init base object
192  "LArCalorimeter"))
193  return (1);
194 
195  // initialize dictionary version
196  AtlasDetectorID::setDictVersion(dict_mgr, "LArCalorimeter");
197 
198  // Initialize the field indices
200  strg = " initialize_base_from_dict - cannot initialize HEC part of LArCalorimeter dictionary ";
201  if(m_msgSvc) {
202  log << MSG::WARNING << strg << endmsg;
203  }
204  else {
205  std::cout << strg << std::endl;
206  }
207  // return (1); // to allow TB dictionary (no HEC in H8)
208  }
209  else {
210  // Find value for the field LAr Calorimeter
211  const IdDictDictionary* atlasDict = dict_mgr.find_dictionary ("ATLAS");
212  int larField = -1;
213  if (atlasDict->get_label_value("subdet", "LArCalorimeter", larField)) {
214  std::stringstream strm ;
215  strm << atlasDict->name();
216  strg = "Could not get value for label 'LArCalorimeter' of field 'subdet' in dictionary "
217  + strm.str();
218  if(m_msgSvc) {
219  log << MSG::ERROR << strg << endmsg;
220  }
221  else {
222  std::cout << strg << std::endl;
223  }
224  return (1);
225  }
226 
227  // Find value for the field LArHEC
228  int larHecField = -1;
229  if (dict()->get_label_value("part", "LArHEC", larHecField)) {
230  std::stringstream strm ;
231  strm << atlasDict->name();
232  strg = "Could not get value for label 'LArHEC' of field 'part' in dictionary "
233  + strm.str();
234  if(m_msgSvc) {
235  log << MSG::ERROR << strg << endmsg;
236  }
237  else {
238  std::cout << strg << std::endl;
239  }
240  return (1);
241  }
242 
243  // Set up id for region and range prefix
244  ExpandedIdentifier exp_region_id;
245  exp_region_id.add(larField);
246  exp_region_id.add(larHecField);
247  Range prefix;
249  m_full_region_range = dict()->build_multirange(exp_region_id, group_name, prefix, "region");
250 
251  if (!m_quiet) {
252  std::string strg0 = "initialize_from_dict : " ;
253  std::string strg1 = " channel range -> " + (std::string)m_full_channel_range;
254  std::string strg2 = " region range -> " + (std::string)m_full_region_range;
255  if(m_msgSvc) {
256  log << MSG::DEBUG << strg0 << endmsg;
257  log << MSG::DEBUG << strg1 << endmsg;
258  log << MSG::DEBUG << strg2 << endmsg;
259  }
260  else {
261  std::cout << strg0 << std::endl;
262  std::cout << strg1 << std::endl;
263  std::cout << strg2 << std::endl;
264  }
265  }
266 
267 
268  // initilize m_two_sym_sides
269  m_two_sym_sides = ( dictionaryVersion() == "fullAtlas" );
270 
271  // Setup the hash tables
272  if(init_hashes()) return (1);
273 
274  // initialize dictionary regions
275  if (fill_vec_of_dict_regions (group_name)) return 1;
276 
277  m_vecOfPhiMin.resize(region_hash_max());
278  for (unsigned int i = 0; i < region_hash_max(); ++i) {
279  Identifier regId = region_id(i);
280  m_vecOfPhiMin[i] = phi_min_init(regId);
281  }
282 
283  // Setup for hash calculation
284  // The regions have uniform eta/phi granularity.
285  // The lookup table only needs to contain the
286  // hash offset for each region, the first eta index
287  // and the number of phi cells.
288 
289  // The implementation requires:
290 
291  // 1) a lookup table for each region containing hash offset,
292  // etamin and nphi
293  // 2) a decoder to access the "index" corresponding to the
294  // pn/samp/reg fields. These fields use 4 bits, so the
295  // vector has a length of 16 for 16 regions.
296 
297  // Create decoder for fields pn to region
299  m_pn_impl.bits() +
303  m_pn_reg_impl.set_bits(bits, bits_offset);
304 
305  // std::cout << "pn_reg " << m_pn_reg_impl.decode_index() << " "
306  // << (std::string)m_pn_reg_impl.ored_field() << " "
307  // << std::hex << m_pn_reg_impl.mask() << " "
308  // << m_pn_reg_impl.zeroing_mask() << " "
309  // << std::dec << m_pn_reg_impl.shift()
310  // << " " << m_pn_reg_impl.bits() << " " <<m_pn_reg_impl.bits_offset()
311  // << std::endl;
312 
313 
314  // Set up vector as lookup table for hash calculation.
315  m_hash_calcs.resize(16);
316 
317  for (unsigned int i = 0; i < region_hash_max(); ++i) {
318 
319  Identifier regId = region_id(i) ;
320  HashCalc hc;
321 
322  int etamin = eta_min(regId);
323  if(etamin < 0) {
324  etamin = 0;
325  std::string strg = "setting etamin to 0 because actual value not found for regId "
326  + show_to_string(regId);
327  if(m_msgSvc) {
328  log << MSG::WARNING << strg << endmsg;
329  }
330  else {
331  std::cout << strg << std::endl;
332  }
333  }
334  int phimin = phi_min(regId);
335  int phimax = phi_max(regId);
336  if(phimin < 0 || phimax < 0) {
337  phimin = phimax = 0;
338  std::string strg = "setting phimin/phimax to 0 because actual value not found for regId "
339  + show_to_string(regId);
340  if(m_msgSvc) {
341  log << MSG::WARNING << strg << endmsg;
342  }
343  else {
344  std::cout << strg << std::endl;
345  }
346  }
347  Identifier min = channel_id ( regId, etamin, phimin);
349  hc.m_hash = min_hash;
350  hc.m_etamin = etamin;
351  hc.m_phimin = phimin;
352  hc.m_nphi = phimax-phimin+1 ;
354 
355  if (m_pn_reg_impl.unpack(min) > 15) {
356  std::stringstream strm ;
357  strm << i;
358  strm << m_pn_reg_impl.unpack(min);
359  std::string strg = "min > 15 "
360  + strm.str() + show_to_string(min) ;
361  if(m_msgSvc) {
362  log << MSG::ERROR << strg << endmsg;
363  }
364  else {
365  std::cout << strg << std::endl;
366  }
367  }
368  }
369 
370  // Check hash calculation
371  for (unsigned int i = 0; i < channel_hash_max(); ++i) {
372  Identifier id = channel_id(i);
373  if (channel_hash(id) != i) {
374  std::stringstream strm ;
375  strm << channel_hash(id);
376  strm << i;
377  std::string strg = "channel ranges, id, hash, i = "
378  + show_to_string(id) + strm.str();
379  if(m_msgSvc) {
380  log << MSG::ERROR << strg << endmsg;
381  }
382  else {
383  std::cout << strg << std::endl;
384  }
385  }
386  }
387  }
388 
389  // Setup hash tables for finding neighbors
390  if(m_do_neighbours) {
391  if(init_neighbors()) return (1);
392  }
393 
394  return 0;
395 }
396 
397 
398 
399 void LArHEC_Base_ID::region_id_checks ( int pos_neg, int sampling, int region ) const
400 {
401 
402  // Check that id is within allowed range
403  // Fill expanded id (initially with 4/2/0/0/0/0/0)
405  expId << pos_neg << sampling << region ;
406 
407  if (!m_full_region_range.match(expId)) {
408  std::string errorMessage = "LArHEC_Base_ID::region_id() result is not OK: ID, range = "
409  + std::string(expId) + " , " + (std::string)m_full_region_range;
410  throw LArID_Exception(errorMessage , 7);
411  }
412 
413 }
414 
415 void LArHEC_Base_ID::channel_id_checks ( int pos_neg, int sampling, int region,
416  int eta, int phi ) const
417 {
418 
419  // Check that id is within allowed range
420  // Fill expanded id
422  expId << pos_neg << sampling << region << eta << phi << m_slar ;
423 
424  if (!m_full_channel_range.match(expId)) {
425  std::string errorMessage = "LArHEC_Base_ID::channel_id() result is not OK: ID, range = "
426  + std::string(expId) + " , " + (std::string)m_full_channel_range;
427  throw LArID_Exception(errorMessage , 8);
428  }
429 }
430 
432  int eta, int phi ) const
433 {
434 
435  // Check that id is within allowed range
436  // Fill expanded id
437  ExpandedIdentifier expId;
438 
439  IdContext context = region_context();
440  if (get_expanded_id(regionId, expId, &context)) {
441  std::string errorMessage = "LArHEC_Base_ID::channel_id(regId) result is not OK: ID = "
442  + show_to_string(regionId) ;
443  throw LArID_Exception(errorMessage , 8);
444  }
445 
446  expId << eta << phi << m_slar;
447 
448  if (!m_full_channel_range.match(expId)) {
449  std::string errorMessage = "LArHEC_Base_ID::channel_id(regId) result is not OK: ID, range = "
450  + std::string(expId) + " , " + (std::string)m_full_channel_range;
451  throw LArID_Exception(errorMessage , 8);
452  }
453 }
454 
455 int LArHEC_Base_ID::get_expanded_id (const Identifier& id, ExpandedIdentifier& exp_id, const IdContext* context) const
456 {
457  // We assume that the context is >= region
458  exp_id.clear();
459  exp_id << lar_field_value()
461  << pos_neg(id)
462  << sampling(id)
463  << region(id);
464  if(context && context->end_index() >= m_ETA_INDEX) {
465  exp_id << eta(id);
466  if(context->end_index() >= m_PHI_INDEX) {
467  exp_id << phi(id);
468  if ( context->end_index() >= m_SLAR_INDEX) {
469  exp_id << (unsigned)is_supercell(id);
470  }
471  }
472  }
473  return (0);
474 }
475 
476 int LArHEC_Base_ID::initLevelsFromDict (const std::string& /*group_name*/)
477 {
478  MsgStream log(m_msgSvc, "LArHEC_Base_ID" );
479 
480  if(!dict()) {
481  std::string strg = "initLevelsFromDict - dictionary NOT initialized ";
482  if(m_msgSvc) {
483  log << MSG::ERROR << strg << endmsg;
484  }
485  else {
486  std::cout << strg << std::endl;
487  }
488  return (1);
489  }
490 
491  // Find out which identifier field corresponds to each level.
492 
493  m_LAR_INDEX = 999 ;
494  m_HEC_INDEX = 999 ;
495  m_POSNEG_INDEX = 999 ;
496  m_SAMPLING_INDEX = 999 ;
497  m_REGION_INDEX = 999 ;
498  m_ETA_INDEX = 999 ;
499  m_PHI_INDEX = 999 ;
500  m_SLAR_INDEX = 999 ;
501 
502  // Save index to a HEC region for unpacking
504  if (dict()->find_region(expId,m_hec_region_index)){
505  std::stringstream strm ;
506  strm << m_hec_region_index ;
507  std::string strg = "initLevelsFromDict - unable to find hec region index: id, reg "
508  + (std::string)expId + strm.str();
509  if(m_msgSvc) {
510  log << MSG::ERROR << strg << endmsg;
511  }
512  else {
513  std::cout << strg << std::endl;
514  }
515  return (1);
516  }
517 
518  IdDictField* field = dict()->find_field("subdet") ;
519  if (field) {
520  m_LAR_INDEX = field->index();
521  }
522  else {
523  std::string strg = "initLevelsFromDict - unable to find 'subdet' field ";
524  if(m_msgSvc) {
525  log << MSG::ERROR << strg << endmsg;
526  }
527  else {
528  std::cout << strg << std::endl;
529  }
530  return (1);
531  }
532 
533  field = dict()->find_field("part") ;
534  if (field) {
535  m_HEC_INDEX = field->index();
536  }
537  else {
538  std::string strg = "initLevelsFromDict - unable to find 'part' field ";
539  if(m_msgSvc) {
540  log << MSG::ERROR << strg << endmsg;
541  }
542  else {
543  std::cout << strg << std::endl;
544  }
545  return (1);
546  }
547 
548  field = dict()->find_field("barrel-endcap") ;
549  if (field) {
550  m_POSNEG_INDEX = field->index();
551  }
552  else {
553  std::string strg = "initLevelsFromDict - unable to find 'barrel-endcap' field ";
554  if(m_msgSvc) {
555  log << MSG::ERROR << strg << endmsg;
556  }
557  else {
558  std::cout << strg << std::endl;
559  }
560  return (1);
561  }
562 
563  field = dict()->find_field("sampling") ;
564  if (field) {
565  m_SAMPLING_INDEX = field->index();
566  }
567  else {
568  std::string strg = "initLevelsFromDict - unable to find 'sampling' field ";
569  if(m_msgSvc) {
570  log << MSG::ERROR << strg << endmsg;
571  }
572  else {
573  std::cout << strg << std::endl;
574  }
575  return (1);
576  }
577 
578  field = dict()->find_field("region") ;
579  if (field) {
580  m_REGION_INDEX = field->index();
581  }
582  else {
583  std::string strg = "initLevelsFromDict - unable to find 'region' field ";
584  if(m_msgSvc) {
585  log << MSG::ERROR << strg << endmsg;
586  }
587  else {
588  std::cout << strg << std::endl;
589  }
590  return (1);
591  }
592 
593  field = dict()->find_field("eta") ;
594  if (field) {
595  m_ETA_INDEX = field->index();
596  }
597  else {
598  std::string strg = "initLevelsFromDict - unable to find 'eta' field ";
599  if(m_msgSvc) {
600  log << MSG::ERROR << strg << endmsg;
601  }
602  else {
603  std::cout << strg << std::endl;
604  }
605  return (1);
606  }
607 
608  field = dict()->find_field("phi") ;
609  if (field) {
610  m_PHI_INDEX = field->index();
611  }
612  else {
613  std::string strg = "initLevelsFromDict - unable to find 'phi' field ";
614  if(m_msgSvc) {
615  log << MSG::ERROR << strg << endmsg;
616  }
617  else {
618  std::cout << strg << std::endl;
619  }
620  return (1);
621  }
622 
623  field = dict()->find_field("is-slar-hec") ;
624  if (field) {
625  m_SLAR_INDEX = field->index();
626  }
627  else {
628  if(m_msgSvc) {
629  log << MSG::ERROR << "initLevelsFromDict - unable to find 'is-slar-hec' field "
630  << endmsg;
631  }
632  else {
633  std::cout << "LArEM_Base_ID::initLevelsFromDict - unable to find 'is-slar-hec' field "
634  << std::endl ;
635  }
636  return (1);
637  }
638 
639 
640  // Set the field implementations
641 
643 
644  /*
645  std::cout << "LArHEC_Base_ID::initLevelsFromDict - found levels " << std::endl ;
646  std::cout << "lar " << m_LAR_INDEX << std::endl ;
647  std::cout << "part " << m_HEC_INDEX << std::endl ;
648  std::cout << "pos-neg " << m_POSNEG_INDEX << std::endl ;
649  std::cout << "sampling " << m_SAMPLING_INDEX << std::endl ;
650  std::cout << "region " << m_REGION_INDEX << std::endl ;
651  std::cout << "eta " << m_ETA_INDEX << std::endl ;
652  std::cout << "phi " << m_PHI_INDEX << std::endl ;
653  std::cout << "slar " << m_SLAR_INDEX << std::endl ;
654  */
655 
656  m_lar_impl = region.implementation(m_LAR_INDEX);
657  m_hec_impl = region.implementation(m_HEC_INDEX);
658  m_pn_impl = region.implementation(m_POSNEG_INDEX);
659  m_sampling_impl = region.implementation(m_SAMPLING_INDEX);
660  m_region_impl = region.implementation(m_REGION_INDEX);
661  m_eta_impl = region.implementation(m_ETA_INDEX);
662  m_phi_impl = region.implementation(m_PHI_INDEX);
663  m_slar_impl = region.implementation(m_SLAR_INDEX);
664 
665 
666  if (!m_quiet) {
667  if(m_msgSvc) {
668  log << MSG::DEBUG << "decode index and bit fields for each level: " << endmsg;
669  log << MSG::DEBUG << "lar " << m_lar_impl.show_to_string() << endmsg;
670  log << MSG::DEBUG << "hec " << m_hec_impl.show_to_string() << endmsg;
671  log << MSG::DEBUG << "pn " << m_pn_impl.show_to_string() << endmsg;
672  log << MSG::DEBUG << "samp " << m_sampling_impl.show_to_string() << endmsg;
673  log << MSG::DEBUG << "reg " << m_region_impl.show_to_string() << endmsg;
674  log << MSG::DEBUG << "eta " << m_eta_impl.show_to_string() << endmsg;
675  log << MSG::DEBUG << "phi " << m_phi_impl.show_to_string() << endmsg;
676  log << MSG::DEBUG << "is-slar " << m_slar_impl.show_to_string() << endmsg;
677  }
678  else {
679  std::cout << "decode index and bit fields for each level: " << std::endl;
680  std::cout << "lar " << m_lar_impl.show_to_string() << std::endl;
681  std::cout << "hec " << m_hec_impl.show_to_string() << std::endl;
682  std::cout << "pn " << m_pn_impl.show_to_string() << std::endl;
683  std::cout << "samp " << m_sampling_impl.show_to_string() << std::endl;
684  std::cout << "reg " << m_region_impl.show_to_string() << std::endl;
685  std::cout << "eta " << m_eta_impl.show_to_string() << std::endl;
686  std::cout << "phi " << m_phi_impl.show_to_string() << std::endl;
687  std::cout << "is-slar " << m_slar_impl.show_to_string() << std::endl;
688  }
689  }
690 
691  return(0) ;
692 }
693 
695 {
696  if (channels().init (*this, "channels",
698  m_SLAR_INDEX))
699  return 1;
700  if (regions().init (*this, "regions",
703  return 1;
704 
705  return (0);
706 }
707 
708 int LArHEC_Base_ID::get_neighbours(const IdentifierHash id, const LArNeighbours::neighbourOption& option, std::vector<IdentifierHash>& neighbourList) const
709 {
710  int result = 1;
711 
712  neighbourList.clear();
713 
714  if(!m_do_neighbours) {
715  if(m_msgSvc) {
716  MsgStream log(m_msgSvc, "LArHEC_Base_ID" );
717  log << MSG::WARNING << "neighbours not initialized !!! returning empty list" << endmsg;
718  }
719  else {
720  std::cout << " LArHEC_Base_ID: neighbours not initialized !!! returning empty list " << std::endl;
721  }
722  return result;
723  }
724 
725  if(id>=channel_hash_max()) {
726  if(m_msgSvc) {
727  MsgStream log(m_msgSvc, "LArHEC_Base_ID" );
728  log << MSG::WARNING << "neighbours requested for non-existing channel -- id/max " << id << "/"
729  << channel_hash_max() << endmsg;
730  }
731  else {
732  std::cout << " neighbours requested for non-existing channel -- id/max " << id << "/"
733  << channel_hash_max() << std::endl;
734  }
735  return result;
736  }
737 
738  const short int maxNeighb=20;
739  IdentifierHash neighbList[maxNeighb];
740  int neighbourIndex = 0;
741 
742  // cell index
743  unsigned int index=id;
744 
745  //
746  // .... find in which region is the cell
747  //
748  short int regionN=m_vecOfCellInfo[index];
749  // get pointer to this region
750  LArHEC_region* hecRegion = m_vecOfRegions[regionN];
751  // retrieve characteristic numbers for this region
752  short int nPhi = hecRegion->phiN();
753  float gPhi = hecRegion->phiGranularity();
754  unsigned int minHash = hecRegion->hashMin();
755  unsigned int maxHash = hecRegion->hashMax();
756 
757  bool corners2DOnly = ( (option & LArNeighbours::all2D)
759  //
760  // .... previous neighbour in phi
761  //
762  IdentifierHash prevNeighbInPhi=NOT_VALID_HASH;
763  if( (option & LArNeighbours::prevInPhi)
764  || corners2DOnly ){
765  if(!get_prevInPhi(hecRegion, index, nPhi, minHash, neighbourIndex, neighbList)){
766  prevNeighbInPhi=neighbList[neighbourIndex-1];
767  if( corners2DOnly ){
768  neighbourIndex--;
769  }
770  }
771  }
772 
773  //
774  // ....next neighbour in phi
775  //
776  IdentifierHash nextNeighbInPhi=NOT_VALID_HASH;
777  if( (option & LArNeighbours::nextInPhi)
778  || corners2DOnly ){
779  if(!get_nextInPhi(hecRegion, index, nPhi, minHash, neighbourIndex, neighbList)){
780  nextNeighbInPhi=neighbList[neighbourIndex-1];
781  if( corners2DOnly ){
782  neighbourIndex--;
783  }
784  }
785  }
786 
787  //
788  // ....previous neighbours in eta
789  //
790  unsigned int nPrevBiggerCell=NOT_VALID_HASH;
791  if( (option & LArNeighbours::prevInEta) ){
792  get_prevInEta(hecRegion, index, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
793  }
794 
795  //
796  // ....next neighbours in eta
797  //
798  unsigned int nNextBiggerCell=NOT_VALID_HASH;
799  if( (option & LArNeighbours::nextInEta) ){
800  get_nextInEta(hecRegion, index, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
801  }
802 
803  //
804  // ....corners in the same sampling
805  //
806  if( (option & LArNeighbours::corners2D) ){
807  if(prevNeighbInPhi != NOT_VALID_HASH){
808  unsigned int index1=prevNeighbInPhi;
809  int oldNeighbourIndex = neighbourIndex;
810  // allow only 1 corner cell in order to avoid the problem of
811  // non-mutual neighbourness
812  // since the cells come ordered in phi it should be the last cell for
813  // prevNeighbInPhi as starting points
814  get_prevInEta(hecRegion, index1, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
815  if ( neighbourIndex > oldNeighbourIndex+1 ) {
816  neighbList[oldNeighbourIndex] = neighbList[neighbourIndex-1];
817  neighbourIndex = oldNeighbourIndex+1;
818  }
819  oldNeighbourIndex = neighbourIndex;
820  get_nextInEta(hecRegion, index1, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
821  if ( neighbourIndex > oldNeighbourIndex+1 ) {
822  neighbList[oldNeighbourIndex] = neighbList[neighbourIndex-1];
823  neighbourIndex = oldNeighbourIndex+1;
824  }
825  }
826 
827  if(nextNeighbInPhi != NOT_VALID_HASH){
828  unsigned int index2=nextNeighbInPhi;
829  int oldNeighbourIndex = neighbourIndex;
830  // allow only 1 corner cell in order to avoid the problem of
831  // non-mutual neighbourness
832  // since the cells come ordered in phi it should be the 1st cell for
833  // nextNeighbInPhi
834  get_prevInEta(hecRegion, index2, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
835  if ( neighbourIndex > oldNeighbourIndex+1 ) {
836  neighbourIndex = oldNeighbourIndex+1;
837  }
838  oldNeighbourIndex = neighbourIndex;
839  get_nextInEta(hecRegion, index2, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
840  if ( neighbourIndex > oldNeighbourIndex+1 ) {
841  neighbourIndex = oldNeighbourIndex+1;
842  }
843  }
844  }
845 
846  //
847  // .... neighbours in sampling (common code)
848  // HEC caracteristics = no granularity change, partial overlap of samplings
849  //
850  if( (option & LArNeighbours::upAndDown) ){
851  // initial eta granularity
852  float granEta = hecRegion->etaGranularity();
853  // initial eta
854  int nEta = int( (index-minHash) / nPhi);
855  double absEta = hecRegion->etaMin() + nEta*granEta;
856 
857  // previous neighbours in sampling
858  if( (option & LArNeighbours::prevInSamp) ){
859  get_prevInSamp(hecRegion, index, nPhi, minHash, absEta, neighbourIndex, neighbList);
860  } // end option
861 
862  // next neighbours in sampling
863  if( (option & LArNeighbours::nextInSamp) ){
864  get_nextInSamp(hecRegion, index, nPhi, minHash, absEta, neighbourIndex, neighbList);
865  }
866  }
867 
868  neighbourList.resize(neighbourIndex);
869  if (neighbourIndex <= maxNeighb) {
870  std::copy (&neighbList[0], &neighbList[neighbourIndex], neighbourList.begin());
871  result = 0 ;
872  } else {
873  std::stringstream strm ;
874  strm << neighbourIndex ;
875  std::string strg = "more than 20 neighbours for this cell, NONE will be retained "
876  + strm.str();
877  if(m_msgSvc) {
878  MsgStream log(m_msgSvc, "LArHEC_Base_ID" );
879  log << MSG::WARNING << strg << endmsg;
880  }
881  else {
882  std::cout << "WARNING: " << strg << std::endl;
883  }
884  }
885  return result;
886 
887 }
888 
889 int LArHEC_Base_ID::get_prevInPhi(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
890  int& neighbourIndex, IdentifierHash* neighbList)
891 {
892  int result = 1;
893  if(!hecRegion->isPhiMin(index)) {
894  unsigned int nIndex = index-1;
895  if( ((index-minHash)%(nPhi)) == 0 ) nIndex=index+nPhi-1;
896  IdentifierHash nHash = nIndex;
897  neighbList[neighbourIndex] = nHash;
898  neighbourIndex++;
899  result = 0;
900  }
901  return result;
902 }
903 
904 int LArHEC_Base_ID::get_nextInPhi(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
905  int& neighbourIndex, IdentifierHash* neighbList)
906 {
907  int result = 1;
908  if(!hecRegion->isPhiMax(index)) {
909  unsigned int nIndex = index+1;
910  if( ((index-minHash+1)%(nPhi)) == 0 ) nIndex=index-nPhi+1;
911  IdentifierHash nHash = nIndex;
912  neighbList[neighbourIndex] = nHash;
913  neighbourIndex++;
914  result = 0;
915  }
916  return result;
917 }
918 
919 int LArHEC_Base_ID::get_prevInEta(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const float& gPhi, const unsigned int& minHash,
920  int& neighbourIndex, IdentifierHash* neighbList, unsigned int& nBiggerCell) const
921 {
922  int result = 1;
923  unsigned int nIndex = 0;
924  IdentifierHash nHash = 0;
925 
926  if( hecRegion->isEtaMin(index)){
927  // eta == etaMin -> go to previous region in eta
928  short int nPrevEtaRegion = hecRegion->prevEtaRegion();
929  // no neighbour if no previous region in eta
930  if( nPrevEtaRegion != NOT_VALID_HEC_REGION ) {
931  // Tell clang to optimize assuming that FP exceptions can trap.
932  // Otherwise, it can vectorize the division, which can lead to
933  // spurious division-by-zero traps from unused vector lanes.
935  LArHEC_region* prevHecRegion = m_vecOfRegions[nPrevEtaRegion];
936  short int nPhiMinus = prevHecRegion->phiN();
937  float gPhiMinus= prevHecRegion->phiGranularity();
938  unsigned int maxHashMinus = prevHecRegion->hashMax();
939  float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
940  float rPhi = (index-minHash)*gPhi+hecRegion->phiMin();
941  int nPhiMinusFirst = int(std::floor((rPhi -prevHecRegion->phiMin())
942  /gPhiMinus+phiMargin))
943  +maxHashMinus-nPhiMinus;
944  int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevHecRegion->phiMin())
945  /gPhiMinus+phiMargin))
946  +maxHashMinus-nPhiMinus;
947  if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
948 
949  for(int i=nPhiMinusFirst; i<nPhiMinusNext; i++){
950  nIndex = i ;
951  if(nIndex != nBiggerCell) {
952  nHash = nIndex;
953  neighbList[neighbourIndex] = nHash;
954  neighbourIndex++;
955  result = 0;
956  }
957  // to avoid duplicated cells in corners
958  if(gPhi < gPhiMinus && nBiggerCell == NOT_VALID_HASH) nBiggerCell=nIndex;
959  }
960  }
961  }
962  else {
963  // stay in same region (1 neighbour)
964  nIndex = index - nPhi;
965  nHash = nIndex;
966  neighbList[neighbourIndex] = nHash;
967  neighbourIndex++;
968  result = 0;
969  }
970  return result;
971 }
972 
973 int LArHEC_Base_ID::get_nextInEta(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const float& gPhi,
974  const unsigned int& maxHash,
975  int& neighbourIndex, IdentifierHash* neighbList, unsigned int& nBiggerCell) const
976 {
977  int result = 1;
978  unsigned int nIndex = 0;
979  IdentifierHash nHash = 0;
980 
981  if( hecRegion->isEtaMax(index)){
982  // eta == etaMax -> go to next region in eta
983  short int nNextEtaRegion = hecRegion->nextEtaRegion();
984  // no neighbour if no next region in eta
985  if( nNextEtaRegion != NOT_VALID_HEC_REGION ) {
986  // Tell clang to optimize assuming that FP exceptions can trap.
987  // Otherwise, it can vectorize the division, which can lead to
988  // spurious division-by-zero traps from unused vector lanes.
990  LArHEC_region* nextHecRegion = m_vecOfRegions[nNextEtaRegion];
991  float gPhiPlus= nextHecRegion->phiGranularity();
992  unsigned int minHashPlus = nextHecRegion->hashMin();
993  float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
994  float rPhi = (index+nPhi-maxHash)*gPhi+hecRegion->phiMin();
995  int nPhiPlusFirst = int(std::floor((rPhi -nextHecRegion->phiMin())
996  /gPhiPlus+phiMargin))+minHashPlus;
997  int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextHecRegion->phiMin())
998  /gPhiPlus+phiMargin))+minHashPlus;
999  if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
1000 
1001  for(int i=nPhiPlusFirst; i<nPhiPlusNext; i++){
1002  nIndex = i ;
1003  if(nIndex != nBiggerCell) {
1004  nHash = nIndex;
1005  neighbList[neighbourIndex] = nHash;
1006  neighbourIndex++;
1007  result = 0;
1008  }
1009  // to avoid duplicated cells in corners
1010  if(gPhi < gPhiPlus && nBiggerCell == NOT_VALID_HASH) nBiggerCell=nIndex;
1011  }
1012  }
1013  }
1014  else {
1015  // stay in same region (1 neighbour)
1016  nIndex = index + nPhi;
1017  nHash = nIndex;
1018  neighbList[neighbourIndex] = nHash;
1019  neighbourIndex++;
1020  result = 0;
1021  }
1022  return result;
1023 }
1024 
1025 int LArHEC_Base_ID::get_prevInSamp(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
1026  const double& absEta,
1027  int& neighbourIndex, IdentifierHash* neighbList) const
1028 {
1029  int result = 1;
1030  // neighbours' indices
1031  unsigned int nIndex=0;
1032  // neighbours' hash
1033  IdentifierHash nHash=0;
1034 
1035  // previous region in sampling
1036  const std::vector<short int>& prevSampRegion=hecRegion->prevSamplingRegion();
1037  int nPrevSampReg = prevSampRegion.size();
1038  if(nPrevSampReg > 0) {
1039  float gEta = hecRegion->etaGranularity();
1040  float gPhi = hecRegion->phiGranularity();
1041  for(int ireg=0; ireg<nPrevSampReg; ireg++) {
1042  LArHEC_region* prevHecRegion = m_vecOfRegions[prevSampRegion[ireg]];
1043  float minEtaMinus = prevHecRegion->etaMin();
1044  float maxEtaMinus = prevHecRegion->etaMax();
1045  // eta granularity of previous region
1046  float granEtaMinus = prevHecRegion->etaGranularity();
1047  float margin = 0.25*std::min(gEta,granEtaMinus);
1048  if((minEtaMinus < absEta+gEta-margin) && (absEta+margin < maxEtaMinus)) {
1049  // Tell clang to optimize assuming that FP exceptions can trap.
1050  // Otherwise, it can vectorize the division, which can lead to
1051  // spurious division-by-zero traps from unused vector lanes.
1053 
1054  // max phi of previous region in sampling
1055  short int nPhiMinus = prevHecRegion->phiN();
1056  // first hash of previous region in sampling
1057  unsigned int minHashMinus = prevHecRegion->hashMin();
1058  float gPhiMinus = prevHecRegion->phiGranularity();
1059  float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
1060  // phi 'coordinate' in initial region
1061  float rPhi = ((index-minHash)%nPhi)*gPhi+hecRegion->phiMin();
1062  int nPhiMinusFirst = int(std::floor((rPhi -prevHecRegion->phiMin())
1063  /gPhiMinus+phiMargin));
1064  int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevHecRegion->phiMin())
1065  /gPhiMinus+phiMargin));
1066  if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
1067  // eta coordinate in initial region
1068  double fEtaMinus = (absEta-minEtaMinus) / granEtaMinus + margin;
1069  short int nEtaMinus = int(fEtaMinus) ;
1070  for(int i=nPhiMinusFirst; i<nPhiMinusNext; i++){
1071  nIndex = minHashMinus + nEtaMinus * nPhiMinus + i;
1072  if( (nIndex >= prevHecRegion->hashMin()) && (nIndex < prevHecRegion->hashMax()) ) {
1073  nHash = nIndex;
1074  neighbList[neighbourIndex] = nHash;
1075  neighbourIndex++;
1076  result = 0;
1077  }
1078  }
1079  } // end eta condition
1080  } // end loop on ireg
1081  } // end if(nPrevSampReg>0)
1082  return result;
1083 }
1084 
1085 int LArHEC_Base_ID::get_nextInSamp(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
1086  const double& absEta,
1087  int& neighbourIndex, IdentifierHash* neighbList) const
1088 {
1089  int result = 1;
1090  // neighbours' indices
1091  unsigned int nIndex=0;
1092  // neighbours' hash
1093  IdentifierHash nHash=0;
1094 
1095  const std::vector<short int>& nextSampRegion=hecRegion->nextSamplingRegion();
1096  int nNextSampReg = nextSampRegion.size();
1097  if(nNextSampReg > 0) {
1098  float gEta = hecRegion->etaGranularity();
1099  float gPhi = hecRegion->phiGranularity();
1100  for(int ireg=0; ireg<nNextSampReg; ireg++) {
1101  LArHEC_region* nextHecRegion = m_vecOfRegions[nextSampRegion[ireg]];
1102  float granEtaPlus = nextHecRegion->etaGranularity();
1103  float minEtaPlus = nextHecRegion->etaMin();
1104  float maxEtaPlus = nextHecRegion->etaMax();
1105  float margin = 0.25*std::min(gEta,granEtaPlus);
1106  if((minEtaPlus < absEta+gEta-margin) && (absEta+margin < maxEtaPlus)) {
1107  // Tell clang to optimize assuming that FP exceptions can trap.
1108  // Otherwise, it can vectorize the division, which can lead to
1109  // spurious division-by-zero traps from unused vector lanes.
1111 
1112  short int nPhiPlus = nextHecRegion->phiN();
1113  unsigned int minHashPlus = nextHecRegion->hashMin();
1114  float gPhiPlus = nextHecRegion->phiGranularity();
1115  float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
1116  // phi 'coordinate' in initial region
1117  float rPhi = ((index-minHash)%nPhi)*gPhi+hecRegion->phiMin();
1118  int nPhiPlusFirst = int(std::floor((rPhi -nextHecRegion->phiMin())
1119  /gPhiPlus+phiMargin));
1120  int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextHecRegion->phiMin())
1121  /gPhiPlus+phiMargin));
1122  if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
1123 
1124  double fEtaPlus = (absEta-minEtaPlus) / granEtaPlus + margin ;
1125  int nEtaPlus = int(fEtaPlus) ;
1126  for(int i=nPhiPlusFirst; i<nPhiPlusNext; i++){
1127  nIndex = minHashPlus + nEtaPlus * nPhiPlus + i;
1128  if( (nIndex >= nextHecRegion->hashMin()) && (nIndex < nextHecRegion->hashMax()) ) {
1129  nHash = nIndex;
1130  neighbList[neighbourIndex] = nHash;
1131  neighbourIndex++;
1132  result = 0;
1133  }
1134  }
1135  }
1136  }
1137  }
1138  return result;
1139 }
1140 
1141 
1143 {
1144  MsgStream log(m_msgSvc, "LArHEC_Base_ID" );
1145 
1146  const std::vector<const IdDictRegion*>& vecOfDictRegions = dictRegions();
1147 
1148  if (!m_quiet) {
1149  if(m_msgSvc) {
1150  log << MSG::DEBUG << "init_neighbors" << endmsg;
1151  }
1152  else {
1153  std::cout << " LArHEC_Base_ID::init_neighbors " << std::endl;
1154  }
1155  }
1156 
1157  //
1158  // ..... loop on HEC regions -> store vector of LArHEC_region*
1159  //
1160  short int reg=0;
1161  std::vector<Identifier>::const_iterator debut=reg_begin() ;
1162  std::vector<Identifier>::const_iterator fin =reg_end() ;
1163 
1164  for (; debut != fin; ++debut)
1165  {
1166  const Identifier& regId = (*debut);
1167  bool fullSym = (dictionaryVersion() == "fullAtlas" );
1168  //
1169  // ..... translate regId to chanId and get hash
1170  //
1171  Identifier id ;
1172  unsigned int index0 = NOT_VALID_HASH;
1173  int etaMin = eta_min(regId);
1174  int phiMin = phi_min(regId);
1175  if(etaMin >= 0 && phiMin >= 0)
1176  {
1177  try{
1178  id = channel_id (regId, etaMin, phiMin );
1179  }
1180  catch(LArID_Exception & except){
1181  if(m_msgSvc) {
1182  log << MSG::ERROR << " LArId exception "
1183  << (std::string)except
1184  << endmsg;
1185  }
1186  else {
1187  std::cout
1188  << " LArId exception "
1189  << (std::string)except
1190  << std::endl;
1191  }
1192  }
1193  IdentifierHash hashId = channel_hash(id) ;
1194  index0=hashId;
1195  }
1196  else
1197  {
1198  if(m_msgSvc) {
1199  log << MSG::WARNING << " could not find non negative etaMin and phiMin for region "
1200  << show_to_string(regId)
1201  << endmsg;
1202  }
1203  else {
1204  std::cout << "WARNING !! could not find non negative etaMin and phiMin for region "
1205  << show_to_string(regId)
1206  << std::endl;
1207  }
1208  index0 = 0;
1209  }
1210 
1211 
1212  short int deltaEta = eta_max(regId) - eta_min(regId) + 1 ;
1213  short int nPhi = phi_max(regId) - phi_min(regId) + 1 ;
1214  // starting eta
1215  float eta0 = this->eta0(reg);
1216  // eta granularity
1217  float deta = this->etaGranularity(reg);
1218  // starting phi
1219  float phi0 = this->phi0(reg);
1220  // phi granularity
1221  float dphi = this->phiGranularity(reg);
1222 
1223  // full range of regions
1224  unsigned int ireg0=0;
1225  unsigned int ireg1=region_hash_max();
1226  // if 2 symetric sides, in which side is the current reg.
1227  if(twoSymSides()) {
1228  if(reg < (short int)region_hash_max()/2) {
1229  ireg0=0;
1230  ireg1=region_hash_max()/2;
1231  } else {
1232  ireg0=region_hash_max()/2;
1233  ireg1=region_hash_max();
1234  }
1235  }
1236 
1237  //
1238  // .... compute prev/next regions in eta
1239  //
1240  short int regForPrevEta=NOT_VALID_HEC_REGION;
1241  const IdDictRegion* prevEtaDicReg = vecOfDictRegions[reg]->prev_abs_eta();
1242  short int regForNextEta=NOT_VALID_HEC_REGION;
1243  const IdDictRegion* nextEtaDicReg = vecOfDictRegions[reg]->next_abs_eta();
1244  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1245  if(vecOfDictRegions[ireg] == prevEtaDicReg) regForPrevEta = ireg;
1246  if(vecOfDictRegions[ireg] == nextEtaDicReg) regForNextEta = ireg;
1247  }
1248 
1249  //
1250  // .... compute prev/next regions in sampling
1251  //
1252  //
1253  std::vector<short int> regForPrevSamp;
1254  for (const IdDictRegion* dictreg : vecOfDictRegions[reg]->prev_samp()) {
1255  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1256  if(vecOfDictRegions[ireg] == dictreg) regForPrevSamp.push_back(ireg);
1257  }
1258  }
1259 
1260  std::vector<short int> regForNextSamp;
1261  for (const IdDictRegion* dictreg : vecOfDictRegions[reg]->next_samp()) {
1262  for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1263  if(vecOfDictRegions[ireg] == dictreg) regForNextSamp.push_back(ireg);
1264  }
1265  }
1266 
1267  //
1268  // ....now ready to build region object
1269  //
1270 
1271  LArHEC_region * hecRegion = new LArHEC_region(index0,deltaEta,nPhi,eta0,deta,phi0,dphi,fullSym,
1272  regForPrevEta,regForNextEta,
1273  regForPrevSamp,regForNextSamp);
1274  // save in a vector for further use in get_neighbours method
1275  m_vecOfRegions.push_back(hecRegion);
1276  reg++;
1277  } // end of loop on regions
1278 
1279  //
1280  // ..... loop on channels
1281  //
1282  reg=0;
1283  debut = hec_begin();
1284  fin = hec_end();
1285  if( debut != fin ){
1286  Identifier lastRegId=region_id(*debut);
1287  for (; debut != fin; ++debut) {
1288  const Identifier& chanId = (*debut);
1289  const Identifier& regId = region_id(chanId);
1290  if(regId != lastRegId) reg++;
1291 
1292  if(m_do_checks) {
1293  // for cross check only
1294  IdentifierHash hashReg = region_hash(regId);
1295  if ((short int)hashReg != reg) {
1296  if(m_msgSvc) {
1297  log << MSG::ERROR << " init_neighbors: problem reg, hashReg = " << reg << " " << hashReg
1298  << endmsg;
1299  }
1300  else {
1301  std::cout << " init_neighbors: problem reg, hashReg = " << reg << " " << hashReg
1302  << std::endl;
1303  }
1304  }
1305  }
1306 
1307  // save region of the cell in a vector for further use in get_neighbours method
1308  m_vecOfCellInfo.push_back(reg);
1309 
1310  lastRegId=regId;
1311  }
1312  }
1313  return (0);
1314 }
1315 
1316 
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
IdDictMgr.h
LArHEC_Base_ID::m_sampling_impl
IdDictFieldImplementation m_sampling_impl
Definition: LArHEC_Base_ID.h:285
LArHEC_region::isPhiMax
bool isPhiMax(const unsigned int &index) const
is the considered cell in the last phi bin of the region ?
Definition: LArHEC_region.cxx:135
LArNeighbours::neighbourOption
neighbourOption
Definition: LArNeighbours.h:12
LArHEC_region::hashMin
unsigned int hashMin() const
hash Id of the first cell of the region
Definition: LArHEC_region.cxx:94
IdDictDictionary::build_multirange
MultiRange build_multirange() const
Get MultiRange for full dictionary.
Definition: IdDictDictionary.cxx:290
LArHEC_Base_ID::m_pn_reg_impl
IdDictFieldImplementation m_pn_reg_impl
Definition: LArHEC_Base_ID.h:291
LArNeighbours::upAndDown
@ upAndDown
Definition: LArNeighbours.h:21
LArHEC_Base_ID::m_hec_impl
IdDictFieldImplementation m_hec_impl
Definition: LArHEC_Base_ID.h:283
LArHEC_Base_ID::hec_begin
id_iterator hec_begin() const
begin iterator over full set of Hec Identifiers for channels
get_generator_info.result
result
Definition: get_generator_info.py:21
LArHEC_Base_ID::eta
int eta(const Identifier id) const
return eta [0,9] outer part [0,3] inner part
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
LArHEC_Base_ID::m_vecOfCellInfo
std::vector< short int > m_vecOfCellInfo
Definition: LArHEC_Base_ID.h:294
LArHEC_Base_ID::region_id_checks
void region_id_checks(int pos_neg, int sampling, int region) const
Definition: LArHEC_Base_ID.cxx:399
LArHEC_Base_ID.h
Factor out code common between LArHEC_ID and LArHEC_SuperCell_ID.
IdDictFieldImplementation::show_to_string
std::string show_to_string(void) const
Definition: IdDictFieldImplementation.cxx:32
CaloIDHelper::channel_hash_max
size_type channel_hash_max() const
One more than the largest channel (cell) hash code.
LArHEC_Base_ID::m_slar
unsigned m_slar
Definition: LArHEC_Base_ID.h:242
LArNeighbours::corners2D
@ corners2D
Definition: LArNeighbours.h:17
LArHEC_region::etaMax
float etaMax() const
end eta
Definition: LArHEC_region.cxx:79
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
LArHEC_Base_ID::get_nextInEta
int get_nextInEta(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const float &gPhi, const unsigned int &maxHash, int &neighbourIndex, IdentifierHash *neighbList, unsigned int &nBiggerCell) const
Definition: LArHEC_Base_ID.cxx:973
index
Definition: index.py:1
IdDictDictionary::region
const IdDictRegion & region(size_t i) const
Region at index i.
Definition: IdDictDictionary.h:350
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:261
LArHEC_Base_ID::m_POSNEG_INDEX
size_type m_POSNEG_INDEX
Definition: LArHEC_Base_ID.h:247
LArHEC_region::nextSamplingRegion
const std::vector< short int > & nextSamplingRegion() const
region number of the next region in sampling
Definition: LArHEC_region.cxx:142
IdentifierField::get_minimum
element_type get_minimum() const
Query the values.
Definition: IdentifierField.h:121
LArHEC_Base_ID::m_ETA_INDEX
size_type m_ETA_INDEX
Definition: LArHEC_Base_ID.h:250
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
IdDictDictionary.h
LArHEC_Base_ID::m_phi_impl
IdDictFieldImplementation m_phi_impl
Definition: LArHEC_Base_ID.h:288
LArHEC_Base_ID::initLevelsFromDict
int initLevelsFromDict(const std::string &group_name)
Definition: LArHEC_Base_ID.cxx:476
LArHEC_Base_ID::m_HEC_INDEX
size_type m_HEC_INDEX
Definition: LArHEC_Base_ID.h:246
IdContext::end_index
size_type end_index() const
Definition: IdContext.h:46
LArID_Exception.h
CaloIDHelper::region_context
IdContext region_context() const
Return the context for regions.
ExpandedIdentifier::add
void add(element_type value)
Append a value into a new field.
ExpandedIdentifier
Definition: DetectorDescription/Identifier/Identifier/ExpandedIdentifier.h:102
LArHEC_Base_ID::m_REGION_INDEX
size_type m_REGION_INDEX
Definition: LArHEC_Base_ID.h:249
AtlasDetectorID::m_msgSvc
IMessageSvc * m_msgSvc
pointer to the message service
Definition: AtlasDetectorID.h:369
LArHEC_Base_ID::HashCalc::m_nphi
size_type m_nphi
Definition: LArHEC_Base_ID.h:277
LArHEC_region::isPhiMin
bool isPhiMin(const unsigned int &index) const
is the considered cell in the first phi bin of the region ?
Definition: LArHEC_region.cxx:128
IdentifierField::get_maximum
element_type get_maximum() const
Definition: IdentifierField.h:130
LArHEC_Base_ID::m_SLAR_INDEX
size_type m_SLAR_INDEX
Definition: LArHEC_Base_ID.h:252
AtlasDetectorID::m_do_checks
bool m_do_checks
Flag for subclasses to know whether or not to perform checks.
Definition: AtlasDetectorID.h:363
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
LArHEC_Base_ID::eta_max
int eta_max(const Identifier regId) const
max value of eta index (-999 == failure)
Definition: LArHEC_Base_ID.cxx:104
IdDictDictionary::name
const std::string & name() const
Dictionary name.
Definition: IdDictDictionary.h:332
AtlasDetectorID::lar_field_value
int lar_field_value() const
Definition: AtlasDetectorID.h:609
LArHEC_Base_ID::HashCalc
small class holding the starting hash value, the min eta and the number of phi bins of each region
Definition: LArHEC_Base_ID.h:267
IdDictFieldImplementation::unpack
int unpack(Identifier id) const
Identifier manipulation methods.
Definition: IdDictFieldImplementation.h:147
LArHEC_region::isEtaMax
bool isEtaMax(const unsigned int &index) const
is the considered cell in the last eta bin of the region ?
Definition: LArHEC_region.cxx:121
LArHEC_Base_ID::region_id
Identifier region_id(const ExpandedIdentifier &exp_id) const
region identifier for a channel from ExpandedIdentifier
LArNeighbours::prevInPhi
@ prevInPhi
Definition: LArNeighbours.h:12
AtlasDetectorID::lar_hec_field_value
int lar_hec_field_value() const
Definition: AtlasDetectorID.h:642
LArHEC_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: LArHEC_Base_ID.cxx:455
xAOD::unsigned
unsigned
Definition: RingSetConf_v1.cxx:656
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: IdDictDictionary.cxx:47
IdDictRegion
Definition: IdDictRegion.h:20
LArHEC_region::etaMin
float etaMin() const
starting eta
Definition: LArHEC_region.cxx:74
CaloIDHelper::regions
const HashGroup & regions() const
Return the HashGroup for regions.
AtlasDetectorID::dictionaryVersion
virtual std::string dictionaryVersion(void) const override
Definition: AtlasDetectorID.cxx:281
LArHEC_region::phiGranularity
float phiGranularity() const
phi granularity
Definition: LArHEC_region.cxx:64
AtlasDetectorID::m_do_neighbours
bool m_do_neighbours
Flag for subclasses to know whether or not to perform neighbour initialization.
Definition: AtlasDetectorID.h:366
LArHEC_Base_ID::m_vecOfPhiMin
std::vector< short int > m_vecOfPhiMin
Definition: LArHEC_Base_ID.h:259
LArHEC_Base_ID::get_prevInPhi
static int get_prevInPhi(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList)
Definition: LArHEC_Base_ID.cxx:889
LArNeighbours::nextInSamp
@ nextInSamp
Definition: LArNeighbours.h:20
LArNeighbours::nextInPhi
@ nextInPhi
Definition: LArNeighbours.h:13
AtlasDetectorID.h
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
IdDictMgr
Definition: IdDictMgr.h:14
LArHEC_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
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:114
CaloIDHelper::region_hash_max
size_type region_hash_max() const
One more than the largest region hash code.
LArHEC_Base_ID::m_hec_region_index
size_type m_hec_region_index
Definition: LArHEC_Base_ID.h:244
Trk::index1
@ index1
Definition: BoundarySurfaceFace.h:48
LArHEC_Base_ID::~LArHEC_Base_ID
~LArHEC_Base_ID()
Definition: LArHEC_Base_ID.cxx:52
LArHEC_region
This class provides an interface to deal with regions in the neighbours finding
Definition: LArHEC_region.h:21
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:66
IdentifierField::empty
bool empty() const
If true, this field does not have any constraints, and may hold any value representable by element_ty...
Definition: IdentifierField.h:182
CaloIDHelper::etaGranularity
float etaGranularity(const IdentifierHash regHash) const
Return the eta granularity of a region, or NOT_VALID.
Definition: CaloIDHelper.cxx:187
lumiFormat.i
int i
Definition: lumiFormat.py:85
LArHEC_region::isEtaMin
bool isEtaMin(const unsigned int &index) const
is the considered cell in the first eta bin of the region ?
Definition: LArHEC_region.cxx:114
IdDictFieldImplementation::set_bits
void set_bits(size_type bits, size_type bits_offset)
Definition: IdDictFieldImplementation.h:278
CaloIDHelper::dict
const IdDictDictionary * dict() const
Return the dictionary for this subdetector.
LArHEC_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: LArHEC_Base_ID.cxx:708
CaloIDHelper
Base class to factor out code common among Calo ID helpers.
Definition: CaloIDHelper.h:34
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
LArHEC_Base_ID::hec_end
id_iterator hec_end() const
end iterator over full set of Hec Identifiers for channels
LArHEC_region::prevSamplingRegion
const std::vector< short int > & prevSamplingRegion() const
region number of the prev region in sampling
Definition: LArHEC_region.cxx:147
LArHEC_Base_ID::reg_end
id_iterator reg_end() const
end iterator over set of region Identifiers
LArHEC_Base_ID::m_pn_impl
IdDictFieldImplementation m_pn_impl
Definition: LArHEC_Base_ID.h:284
LArHEC_Base_ID::m_region_impl
IdDictFieldImplementation m_region_impl
Definition: LArHEC_Base_ID.h:286
LArHEC_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: LArHEC_Base_ID.cxx:172
IdDictFieldImplementation::bits_offset
size_type bits_offset() const
Definition: IdDictFieldImplementation.h:208
LArHEC_Base_ID::phi_min
int phi_min(const Identifier regId) const
min value of phi index (-999 == failure)
LArHEC_region::phiMin
float phiMin() const
starting phi
Definition: LArHEC_region.cxx:84
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
LArHEC_Base_ID::twoSymSides
bool twoSymSides() const
True if the + and - sides of the calorimeter are identical (true layout).
LArHEC_region::etaGranularity
float etaGranularity() const
eta granularity
Definition: LArHEC_region.cxx:59
mc.group_name
group_name
Definition: mc.PhPy8EG_A14NNPDF23_NNLOPS_example.py:33
LArHEC_Base_ID::get_nextInSamp
int get_nextInSamp(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, const double &absEta, int &neighbourIndex, IdentifierHash *neighbList) const
Definition: LArHEC_Base_ID.cxx:1085
LArHEC_region.h
LArHEC_Base_ID::phi_min_init
int phi_min_init(const Identifier regId) const
Definition: LArHEC_Base_ID.cxx:125
LArHEC_Base_ID::init_neighbors
int init_neighbors()
Definition: LArHEC_Base_ID.cxx:1142
AtlasDetectorID::lar_hec_exp
ExpandedIdentifier lar_hec_exp(void) const
Definition: AtlasDetectorID.h:564
LArHEC_Base_ID::eta_min
int eta_min(const Identifier regId) const
min value of eta index (-999 == failure)
Definition: LArHEC_Base_ID.cxx:78
LArHEC_Base_ID::channel_hash
IdentifierHash channel_hash(Identifier channelId) const
create hash id from channel id
LArHEC_Base_ID::channel_id_checks
void channel_id_checks(int pos_neg, int sampling, int region, int eta, int phi) const
Definition: LArHEC_Base_ID.cxx:415
LArHEC_region::phiN
short int phiN() const
number of phi bins
Definition: LArHEC_region.cxx:54
LArHEC_Base_ID::m_slar_impl
IdDictFieldImplementation m_slar_impl
Definition: LArHEC_Base_ID.h:289
LArNeighbours::prevInSamp
@ prevInSamp
Definition: LArNeighbours.h:19
AtlasDetectorID::m_quiet
bool m_quiet
If true, suppress DEBUG/INFO messages.
Definition: AtlasDetectorID.h:372
LArHEC_Base_ID::m_lar_impl
IdDictFieldImplementation m_lar_impl
Definition: LArHEC_Base_ID.h:282
Trk::index0
@ index0
Definition: BoundarySurfaceFace.h:47
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:234
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: IdDictDictionary.cxx:75
LArHEC_Base_ID::m_two_sym_sides
bool m_two_sym_sides
Definition: LArHEC_Base_ID.h:257
LArHEC_Base_ID::get_prevInEta
int get_prevInEta(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const float &gPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList, unsigned int &nBiggerCell) const
Definition: LArHEC_Base_ID.cxx:919
NOT_VALID_HEC_REGION
@ NOT_VALID_HEC_REGION
Definition: LArHEC_region.h:11
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:209
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
LArHEC_Base_ID::m_hash_calcs
std::vector< HashCalc > m_hash_calcs
Definition: LArHEC_Base_ID.h:279
LArHEC_Base_ID::m_full_region_range
MultiRange m_full_region_range
Definition: LArHEC_Base_ID.h:255
IdentifierHash.h
LArHEC_Base_ID::m_LAR_INDEX
size_type m_LAR_INDEX
Definition: LArHEC_Base_ID.h:245
LArHEC_Base_ID::channel_id
Identifier channel_id(const ExpandedIdentifier &exp_id) const
channel identifier for a channel from ExpandedIdentifier
AtlasDetectorID::setDictVersion
virtual void setDictVersion(const IdDictMgr &dict_mgr, const std::string &name) override
Definition: AtlasDetectorID.cxx:499
LArHEC_Base_ID::m_SAMPLING_INDEX
size_type m_SAMPLING_INDEX
Definition: LArHEC_Base_ID.h:248
Range
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
Definition: DetectorDescription/Identifier/Identifier/Range.h:29
LArHEC_region::nextEtaRegion
short int nextEtaRegion() const
region number of the next region in eta
Definition: LArHEC_region.cxx:109
python.PyKernel.init
def init(v_theApp, v_rootStream=None)
Definition: PyKernel.py:45
LArHEC_Base_ID::get_nextInPhi
static int get_nextInPhi(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList)
Definition: LArHEC_Base_ID.cxx:904
IdDictDictionary
Definition: IdDictDictionary.h:30
CaloIDHelper::channels
const HashGroup & channels() const
Return the HashGroup for channels (cells).
LArHEC_Base_ID::LArHEC_Base_ID
LArHEC_Base_ID(const std::string &name, const std::string &group, bool supercell)
Constructor.
Definition: LArHEC_Base_ID.cxx:34
MultiRange::match
int match(const ExpandedIdentifier &id) const
Match an identifier.
Definition: MultiRange.cxx:57
DeMoScan.index
string index
Definition: DeMoScan.py:362
AtlasDetectorID::reinitialize
bool reinitialize(const IdDictMgr &dict_mgr)
Test whether an idhelper should be reinitialized based on the change of tags.
Definition: AtlasDetectorID.cxx:221
LArHEC_Base_ID::is_supercell
bool is_supercell(const Identifier id) const
Test if the identifier represents a supercell.
IdDictField.h
LArCellBinning.etaMin
etaMin
Definition: LArCellBinning.py:84
CaloLCW_tf.group
group
Definition: CaloLCW_tf.py:28
CXXUTILS_TRAPPING_FP
CXXUTILS_TRAPPING_FP
Definition: SegmentLineFitter.cxx:8
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
CaloIDHelper::phi0
float phi0(const IdentifierHash regHash) const
Return the minimum phi of region, or NOT_VALID.
Definition: CaloIDHelper.cxx:220
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:365
CaloIDHelper::dictRegions
const std::vector< const IdDictRegion * > & dictRegions() const
Return the vector of IdDictRegion, accessed via region hash.
LArHEC_Base_ID::HashCalc::m_hash
IdentifierHash m_hash
Definition: LArHEC_Base_ID.h:274
LArNeighbours::nextInEta
@ nextInEta
Definition: LArNeighbours.h:15
MultiRange::size
size_type size() const
Definition: MultiRange.cxx:70
DeMoScan.first
bool first
Definition: DeMoScan.py:534
LArHEC_Base_ID::HashCalc::m_phimin
size_type m_phimin
Definition: LArHEC_Base_ID.h:276
DEBUG
#define DEBUG
Definition: page_access.h:11
LArHEC_region::hashMax
unsigned int hashMax() const
hash Id of the last cell of the region +1
Definition: LArHEC_region.cxx:99
LArHEC_Base_ID::sampling
int sampling(const Identifier id) const
return sampling [0,3] (only 0 for supercells)
LArHEC_Base_ID::m_PHI_INDEX
size_type m_PHI_INDEX
Definition: LArHEC_Base_ID.h:251
TauScalarVars::absEta
bool absEta(const xAOD::TauJet &tau, float &out)
Definition: TauGNNDataLoader.cxx:118
LArHEC_Base_ID::HashCalc::m_etamin
size_type m_etamin
Definition: LArHEC_Base_ID.h:275
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
IdentifierField
This is the individual specification for the range of one ExpandedIdentifier IdentifierField.
Definition: IdentifierField.h:83
LArHEC_Base_ID::pos_neg
int pos_neg(const Identifier id) const
return pos_neg -2 (C side) or 2 (A side)
ExpandedIdentifier::clear
void clear()
Erase all fields.
LArHEC_Base_ID::init_hashes
int init_hashes()
Definition: LArHEC_Base_ID.cxx:694
LArHEC_Base_ID::m_full_channel_range
MultiRange m_full_channel_range
Definition: LArHEC_Base_ID.h:254
compute_lumi.fin
fin
Definition: compute_lumi.py:19
LArNeighbours::prevInEta
@ prevInEta
Definition: LArNeighbours.h:14
LArHEC_Base_ID::m_vecOfRegions
std::vector< LArHEC_region * > m_vecOfRegions
Definition: LArHEC_Base_ID.h:293
IdDictRegion.h
LArHEC_Base_ID::NOT_VALID_HASH
@ NOT_VALID_HASH
Definition: LArHEC_Base_ID.h:199
calibdata.copy
bool copy
Definition: calibdata.py:26
CaloIDHelper::phiGranularity
float phiGranularity(const IdentifierHash regHash) const
Return the phi granularity of a region, or NOT_VALID.
Definition: CaloIDHelper.cxx:198
IdDictField
Definition: IdDictField.h:15
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
TrigVSI::AlgConsts::nEta
constexpr int nEta
Default bin number of eta for vertex map.
Definition: Trigger/TrigTools/TrigVrtSecInclusive/TrigVrtSecInclusive/Constants.h:26
LArHEC_Base_ID::reg_begin
id_iterator reg_begin() const
begin iterator over set of region Identifiers
LArCellBinning.etamin
etamin
Definition: LArCellBinning.py:137
LArHEC_Base_ID::get_prevInSamp
int get_prevInSamp(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, const double &absEta, int &neighbourIndex, IdentifierHash *neighbList) const
Definition: LArHEC_Base_ID.cxx:1025
LArHEC_Base_ID::phi_max
int phi_max(const Identifier regId) const
max value of phi index (-999 == failure)
Definition: LArHEC_Base_ID.cxx:151
LArHEC_Base_ID::region
int region(const Identifier id) const
return region [0,1]
IdContext
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition: IdContext.h:26
LArHEC_Base_ID::m_eta_impl
IdDictFieldImplementation m_eta_impl
Definition: LArHEC_Base_ID.h:287
CaloIDHelper::region_hash
IdentifierHash region_hash(Identifier regionId) const
Convert a connected region Identifier to a hash code.
LArID_Exception
Exception class for LAr Identifiers.
Definition: LArID_Exception.h:20
LArNeighbours::all2D
@ all2D
Definition: LArNeighbours.h:18
LArHEC_region::prevEtaRegion
short int prevEtaRegion() const
region number of the previous region in eta
Definition: LArHEC_region.cxx:104
IdDictFieldImplementation::size_type
Identifier::size_type size_type
Definition: IdDictFieldImplementation.h:62
LArHEC_Base_ID::phi
int phi(const Identifier id) const
return phi[0,63] outer part [0,31] inner part
IdDictFieldImplementation::bits
size_type bits() const
Definition: IdDictFieldImplementation.h:202
Identifier
Definition: IdentifierFieldParser.cxx:14