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