ATLAS Offline Software
Loading...
Searching...
No Matches
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*/
10
11
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"
23
24#include <cmath>
25#include <set>
26#include <string>
27
29
30
32 const std::string& group,
33 bool supercell) :
35 , m_slar (supercell ? 1 : 0)
37 , m_LAR_INDEX(999)
38 , m_HEC_INDEX(999)
39 , m_POSNEG_INDEX(999)
40 , m_SAMPLING_INDEX(999)
41 , m_REGION_INDEX(999)
42 , m_ETA_INDEX(999)
43 , m_PHI_INDEX(999)
44 , m_SLAR_INDEX(999)
46{
47}
48
50{
51 std::vector<LArHEC_region*>::iterator first = m_vecOfRegions.begin();
52 std::vector<LArHEC_region*>::iterator last = m_vecOfRegions.end();
53 for (; first != last; ++first) delete (*first);
54}
55
57 int eta, int phi ) const
58{
59 // must calculate region number and shift eta
60 int region=999;
61 if ( 0 <= eta && eta < 10 ) { region = 0;}
62 else if ( 10 <= eta && eta < 14 ) { region = 1; eta -= 10;}
63
64 return (channel_id (pos_neg, sampling, region, eta, phi));
65}
66
67
69 int eta, int phi_sector ) const
70{
71 int phi = ( region == 0 ? sector*2 + phi_sector : sector );
72 return (channel_id (pos_neg, sampling, region, eta, phi ));
73}
74
75int LArHEC_Base_ID::eta_min(const Identifier regId) const
76{
78 IdContext region_cntxt = region_context();
79 if(!get_expanded_id(regId, expId, &region_cntxt)) {
80 int result = -999;
81 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
82 const Range& range = m_full_channel_range[i];
83 if (range.match(expId)) {
84 const Range::field& eta_field = range[m_ETA_INDEX];
85 if (not eta_field.empty()) {
86 int etamin = eta_field.get_minimum();
87 if (-999 == result) {
88 result = etamin;
89 }
90 else {
91 if (etamin < result) result = etamin;
92 }
93 }
94 }
95 }
96 return (result);
97 }
98 return (-999);
99}
100
102{
103 ExpandedIdentifier expId;
104 IdContext region_cntxt = region_context();
105 if(!get_expanded_id(regId, expId, &region_cntxt)) {
106 int result = -999;
107 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
108 const Range& range = m_full_channel_range[i];
109 if (range.match(expId)) {
110 const Range::field& eta_field = range[m_ETA_INDEX];
111 if (not eta_field.empty()) {
112 int etamax = eta_field.get_maximum();
113 if (result < etamax) result = etamax;
114 }
115 }
116 }
117 return (result);
118 }
119 return (-999); // default
120}
121
123{
124 ExpandedIdentifier expId;
125 IdContext region_cntxt = region_context();
126 if(!get_expanded_id(regId, expId, &region_cntxt)) {
127 int result = -999;
128 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
129 const Range& range = m_full_channel_range[i];
130 if (range.match(expId)) {
131 const Range::field& phi_field = range[m_PHI_INDEX];
132 if (not phi_field.empty()) {
133 int phimin = phi_field.get_minimum();
134 if (-999 == result) {
135 result = phimin;
136 }
137 else {
138 if (phimin < result) result = phimin;
139 }
140 }
141 }
142 }
143 return (result);
144 }
145 return (-999); // default
146}
147
149{
150 ExpandedIdentifier expId;
151 IdContext region_cntxt = region_context();
152 if(!get_expanded_id(regId, expId, &region_cntxt)) {
153 int result = -999;
154 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
155 const Range& range = m_full_channel_range[i];
156 if (range.match(expId)) {
157 const Range::field& phi_field = range[m_PHI_INDEX];
158 if (not phi_field.empty()) {
159 int phimax = phi_field.get_maximum();
160 if (result < phimax) result = phimax;
161 }
162 }
163 }
164 return (result);
165 }
166 return (-999); // default
167}
168
170 const std::string& group_name)
171/*===================================================================*/
172{
173 ATH_MSG_DEBUG("initialize_base_from_dictionary");
174
175 // Check whether this helper should be reinitialized
176 if (!reinitialize(dict_mgr)) {
177 ATH_MSG_DEBUG("Request to reinitialize not satisfied - tags have not changed");
178 return (0);
179 }
180 else {
181 ATH_MSG_DEBUG("(Re)initialize");
182 }
183
184 // init base object
186 "LArCalorimeter"))
187 return (1);
188
189 // initialize dictionary version
190 AtlasDetectorID::setDictVersion(dict_mgr, "LArCalorimeter");
191
192 // Initialize the field indices
193 if(initLevelsFromDict(group_name)) {
194 ATH_MSG_WARNING(" initialize_base_from_dict - cannot initialize HEC part of LArCalorimeter dictionary ");
195 // return (1); // to allow TB dictionary (no HEC in H8)
196 }
197 else {
198 // Find value for the field LAr Calorimeter
199 const IdDictDictionary* atlasDict = dict_mgr.find_dictionary ("ATLAS");
200 int larField = -1;
201 if (atlasDict->get_label_value("subdet", "LArCalorimeter", larField)) {
202 ATH_MSG_ERROR("Could not get value for label 'LArCalorimeter' of field 'subdet' in dictionary " << atlasDict->name());
203 return (1);
204 }
205
206 // Find value for the field LArHEC
207 int larHecField = -1;
208 if (dict()->get_label_value("part", "LArHEC", larHecField)) {
209 ATH_MSG_ERROR("Could not get value for label 'LArHEC' of field 'part' in dictionary " << atlasDict->name());
210 return (1);
211 }
212
213 // Set up id for region and range prefix
214 ExpandedIdentifier exp_region_id;
215 exp_region_id.add(larField);
216 exp_region_id.add(larHecField);
217 Range prefix;
218 m_full_channel_range = dict()->build_multirange(exp_region_id, group_name, prefix);
219 m_full_region_range = dict()->build_multirange(exp_region_id, group_name, prefix, "region");
220
221 ATH_MSG_DEBUG("initialize_from_dict : ");
222 ATH_MSG_DEBUG(" channel range -> " << (std::string)m_full_channel_range);
223 ATH_MSG_DEBUG(" region range -> " << (std::string)m_full_region_range);
224
225 // initilize m_two_sym_sides
226 m_two_sym_sides = ( dictionaryVersion() == "fullAtlas" );
227
228 // Setup the hash tables
229 if(init_hashes()) return (1);
230
231 // initialize dictionary regions
232 if (fill_vec_of_dict_regions (group_name)) return 1;
233
235 for (unsigned int i = 0; i < region_hash_max(); ++i) {
236 Identifier regId = region_id(i);
237 m_vecOfPhiMin[i] = phi_min_init(regId);
238 }
239
240 // Setup for hash calculation
241 // The regions have uniform eta/phi granularity.
242 // The lookup table only needs to contain the
243 // hash offset for each region, the first eta index
244 // and the number of phi cells.
245
246 // The implementation requires:
247
248 // 1) a lookup table for each region containing hash offset,
249 // etamin and nphi
250 // 2) a decoder to access the "index" corresponding to the
251 // pn/samp/reg fields. These fields use 4 bits, so the
252 // vector has a length of 16 for 16 regions.
253
254 // Create decoder for fields pn to region
256 m_pn_impl.bits() +
257 m_sampling_impl.bits() +
258 m_region_impl.bits();
259 IdDictFieldImplementation::size_type bits_offset = m_pn_impl.bits_offset();
260 m_pn_reg_impl.set_bits(bits, bits_offset);
261
262 // std::cout << "pn_reg " << m_pn_reg_impl.decode_index() << " "
263 // << (std::string)m_pn_reg_impl.ored_field() << " "
264 // << std::hex << m_pn_reg_impl.mask() << " "
265 // << m_pn_reg_impl.zeroing_mask() << " "
266 // << std::dec << m_pn_reg_impl.shift()
267 // << " " << m_pn_reg_impl.bits() << " " <<m_pn_reg_impl.bits_offset()
268 // << std::endl;
269
270
271 // Set up vector as lookup table for hash calculation.
272 m_hash_calcs.resize(16);
273
274 for (unsigned int i = 0; i < region_hash_max(); ++i) {
275
276 Identifier regId = region_id(i) ;
277 HashCalc hc;
278
279 int etamin = eta_min(regId);
280 if(etamin < 0) {
281 etamin = 0;
282 ATH_MSG_WARNING("setting etamin to 0 because actual value not found for regId " << show_to_string(regId));
283 }
284 int phimin = phi_min(regId);
285 int phimax = phi_max(regId);
286 if(phimin < 0 || phimax < 0) {
287 phimin = phimax = 0;
288 ATH_MSG_WARNING("setting phimin/phimax to 0 because actual value not found for regId " << show_to_string(regId));
289 }
290 Identifier min = channel_id ( regId, etamin, phimin);
292 hc.m_hash = min_hash;
293 hc.m_etamin = etamin;
294 hc.m_phimin = phimin;
295 hc.m_nphi = phimax-phimin+1 ;
296 m_hash_calcs[m_pn_reg_impl.unpack(min)] = hc;
297
298 if (m_pn_reg_impl.unpack(min) > 15) {
299 ATH_MSG_ERROR("min > 15 " << i << m_pn_reg_impl.unpack(min) << show_to_string(min));
300 }
301 }
302
303 // Check hash calculation
304 for (unsigned int i = 0; i < channel_hash_max(); ++i) {
305 Identifier id = channel_id(i);
306 if (channel_hash(id) != i) {
307 ATH_MSG_ERROR("channel ranges, id, hash, i = " << show_to_string(id) << channel_hash(id) << i);
308 }
309 }
310 }
311
312 // Setup hash tables for finding neighbors
313 if(m_do_neighbours) {
314 if(init_neighbors()) return (1);
315 }
316
317 return 0;
318}
319
320
321
323{
324
325 // Check that id is within allowed range
326 // Fill expanded id (initially with 4/2/0/0/0/0/0)
328 expId << pos_neg << sampling << region ;
329
330 if (!m_full_region_range.match(expId)) {
331 std::string errorMessage = "LArHEC_Base_ID::region_id() result is not OK: ID, range = "
332 + std::string(expId) + " , " + (std::string)m_full_region_range;
333 throw LArID_Exception(errorMessage , 7);
334 }
335
336}
337
339 int eta, int phi ) const
340{
341
342 // Check that id is within allowed range
343 // Fill expanded id
345 expId << pos_neg << sampling << region << eta << phi << m_slar ;
346
347 if (!m_full_channel_range.match(expId)) {
348 std::string errorMessage = "LArHEC_Base_ID::channel_id() result is not OK: ID, range = "
349 + std::string(expId) + " , " + (std::string)m_full_channel_range;
350 throw LArID_Exception(errorMessage , 8);
351 }
352}
353
355 int eta, int phi ) const
356{
357
358 // Check that id is within allowed range
359 // Fill expanded id
360 ExpandedIdentifier expId;
361
362 IdContext context = region_context();
363 if (get_expanded_id(regionId, expId, &context)) {
364 std::string errorMessage = "LArHEC_Base_ID::channel_id(regId) result is not OK: ID = "
365 + show_to_string(regionId) ;
366 throw LArID_Exception(errorMessage , 8);
367 }
368
369 expId << eta << phi << m_slar;
370
371 if (!m_full_channel_range.match(expId)) {
372 std::string errorMessage = "LArHEC_Base_ID::channel_id(regId) result is not OK: ID, range = "
373 + std::string(expId) + " , " + (std::string)m_full_channel_range;
374 throw LArID_Exception(errorMessage , 8);
375 }
376}
377
378int LArHEC_Base_ID::get_expanded_id (const Identifier& id, ExpandedIdentifier& exp_id, const IdContext* context) const
379{
380 // We assume that the context is >= region
381 exp_id.clear();
382 exp_id << lar_field_value()
384 << pos_neg(id)
385 << sampling(id)
386 << region(id);
387 if(context && context->end_index() >= m_ETA_INDEX) {
388 exp_id << eta(id);
389 if(context->end_index() >= m_PHI_INDEX) {
390 exp_id << phi(id);
391 if ( context->end_index() >= m_SLAR_INDEX) {
392 exp_id << (unsigned)is_supercell(id);
393 }
394 }
395 }
396 return (0);
397}
398
399int LArHEC_Base_ID::initLevelsFromDict (const std::string& /*group_name*/)
400{
401 if(!dict()) {
402 ATH_MSG_ERROR("initLevelsFromDict - dictionary NOT initialized");
403 return (1);
404 }
405
406 // Find out which identifier field corresponds to each level.
407
408 m_LAR_INDEX = 999 ;
409 m_HEC_INDEX = 999 ;
410 m_POSNEG_INDEX = 999 ;
411 m_SAMPLING_INDEX = 999 ;
412 m_REGION_INDEX = 999 ;
413 m_ETA_INDEX = 999 ;
414 m_PHI_INDEX = 999 ;
415 m_SLAR_INDEX = 999 ;
416
417 // Save index to a HEC region for unpacking
419 if (dict()->find_region(expId,m_hec_region_index)){
420 ATH_MSG_ERROR("initLevelsFromDict - unable to find hec region index: id, reg " << expId << m_hec_region_index);
421 return (1);
422 }
423
424 const IdDictField* field = dict()->find_field("subdet") ;
425 if (field) {
426 m_LAR_INDEX = field->index();
427 }
428 else {
429 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'subdet' field");
430 return (1);
431 }
432
433 field = dict()->find_field("part") ;
434 if (field) {
435 m_HEC_INDEX = field->index();
436 }
437 else {
438 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'part' field");
439 return (1);
440 }
441
442 field = dict()->find_field("barrel-endcap") ;
443 if (field) {
444 m_POSNEG_INDEX = field->index();
445 }
446 else {
447 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'barrel-endcap' field");
448 return (1);
449 }
450
451 field = dict()->find_field("sampling") ;
452 if (field) {
453 m_SAMPLING_INDEX = field->index();
454 }
455 else {
456 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'sampling' field");
457 return (1);
458 }
459
460 field = dict()->find_field("region") ;
461 if (field) {
462 m_REGION_INDEX = field->index();
463 }
464 else {
465 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'region' field");
466 return (1);
467 }
468
469 field = dict()->find_field("eta") ;
470 if (field) {
471 m_ETA_INDEX = field->index();
472 }
473 else {
474 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'eta' field");
475 return (1);
476 }
477
478 field = dict()->find_field("phi") ;
479 if (field) {
480 m_PHI_INDEX = field->index();
481 }
482 else {
483 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'phi' field");
484 return (1);
485 }
486
487 field = dict()->find_field("is-slar-hec") ;
488 if (field) {
489 m_SLAR_INDEX = field->index();
490 }
491 else {
492 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'is-slar-hec' field");
493 return (1);
494 }
495
496
497 // Set the field implementations
498
500
501 m_lar_impl = region.implementation(m_LAR_INDEX);
502 m_hec_impl = region.implementation(m_HEC_INDEX);
503 m_pn_impl = region.implementation(m_POSNEG_INDEX);
504 m_sampling_impl = region.implementation(m_SAMPLING_INDEX);
505 m_region_impl = region.implementation(m_REGION_INDEX);
506 m_eta_impl = region.implementation(m_ETA_INDEX);
507 m_phi_impl = region.implementation(m_PHI_INDEX);
508 m_slar_impl = region.implementation(m_SLAR_INDEX);
509
510 ATH_MSG_DEBUG("decode index and bit fields for each level: ");
511 ATH_MSG_DEBUG("lar " << m_lar_impl.show_to_string());
512 ATH_MSG_DEBUG("hec " << m_hec_impl.show_to_string());
513 ATH_MSG_DEBUG("pn " << m_pn_impl.show_to_string());
514 ATH_MSG_DEBUG("samp " << m_sampling_impl.show_to_string());
515 ATH_MSG_DEBUG("reg " << m_region_impl.show_to_string());
516 ATH_MSG_DEBUG("eta " << m_eta_impl.show_to_string());
517 ATH_MSG_DEBUG("phi " << m_phi_impl.show_to_string());
518 ATH_MSG_DEBUG("is-slar " << m_slar_impl.show_to_string());
519
520 return(0) ;
521}
522
524{
525 if (channels().init (*this, "channels",
528 return 1;
529 if (regions().init (*this, "regions",
532 return 1;
533
534 return (0);
535}
536
537int LArHEC_Base_ID::get_neighbours(const IdentifierHash id, const LArNeighbours::neighbourOption& option, std::vector<IdentifierHash>& neighbourList) const
538{
539 int result = 1;
540
541 neighbourList.clear();
542
543 if(!m_do_neighbours) {
544 ATH_MSG_WARNING("neighbours not initialized !!! returning empty list");
545 return result;
546 }
547
548 if(id>=channel_hash_max()) {
549 ATH_MSG_WARNING("neighbours requested for non-existing channel -- id/max " << id << "/" << channel_hash_max());
550 return result;
551 }
552
553 const short int maxNeighb=20;
554 IdentifierHash neighbList[maxNeighb];
555 int neighbourIndex = 0;
556
557 // cell index
558 unsigned int index=id;
559
560 //
561 // .... find in which region is the cell
562 //
563 short int regionN=m_vecOfCellInfo[index];
564 // get pointer to this region
565 LArHEC_region* hecRegion = m_vecOfRegions[regionN];
566 // retrieve characteristic numbers for this region
567 short int nPhi = hecRegion->phiN();
568 float gPhi = hecRegion->phiGranularity();
569 unsigned int minHash = hecRegion->hashMin();
570 unsigned int maxHash = hecRegion->hashMax();
571
572 bool corners2DOnly = ( (option & LArNeighbours::all2D)
574 //
575 // .... previous neighbour in phi
576 //
577 IdentifierHash prevNeighbInPhi=NOT_VALID_HASH;
578 if( (option & LArNeighbours::prevInPhi)
579 || corners2DOnly ){
580 if(!get_prevInPhi(hecRegion, index, nPhi, minHash, neighbourIndex, neighbList)){
581 prevNeighbInPhi=neighbList[neighbourIndex-1];
582 if( corners2DOnly ){
583 neighbourIndex--;
584 }
585 }
586 }
587
588 //
589 // ....next neighbour in phi
590 //
591 IdentifierHash nextNeighbInPhi=NOT_VALID_HASH;
592 if( (option & LArNeighbours::nextInPhi)
593 || corners2DOnly ){
594 if(!get_nextInPhi(hecRegion, index, nPhi, minHash, neighbourIndex, neighbList)){
595 nextNeighbInPhi=neighbList[neighbourIndex-1];
596 if( corners2DOnly ){
597 neighbourIndex--;
598 }
599 }
600 }
601
602 //
603 // ....previous neighbours in eta
604 //
605 unsigned int nPrevBiggerCell=NOT_VALID_HASH;
606 if( (option & LArNeighbours::prevInEta) ){
607 get_prevInEta(hecRegion, index, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
608 }
609
610 //
611 // ....next neighbours in eta
612 //
613 unsigned int nNextBiggerCell=NOT_VALID_HASH;
614 if( (option & LArNeighbours::nextInEta) ){
615 get_nextInEta(hecRegion, index, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
616 }
617
618 //
619 // ....corners in the same sampling
620 //
621 if( (option & LArNeighbours::corners2D) ){
622 if(prevNeighbInPhi != NOT_VALID_HASH){
623 unsigned int index1=prevNeighbInPhi;
624 int oldNeighbourIndex = neighbourIndex;
625 // allow only 1 corner cell in order to avoid the problem of
626 // non-mutual neighbourness
627 // since the cells come ordered in phi it should be the last cell for
628 // prevNeighbInPhi as starting points
629 get_prevInEta(hecRegion, index1, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
630 if ( neighbourIndex > oldNeighbourIndex+1 ) {
631 neighbList[oldNeighbourIndex] = neighbList[neighbourIndex-1];
632 neighbourIndex = oldNeighbourIndex+1;
633 }
634 oldNeighbourIndex = neighbourIndex;
635 get_nextInEta(hecRegion, index1, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
636 if ( neighbourIndex > oldNeighbourIndex+1 ) {
637 neighbList[oldNeighbourIndex] = neighbList[neighbourIndex-1];
638 neighbourIndex = oldNeighbourIndex+1;
639 }
640 }
641
642 if(nextNeighbInPhi != NOT_VALID_HASH){
643 unsigned int index2=nextNeighbInPhi;
644 int oldNeighbourIndex = neighbourIndex;
645 // allow only 1 corner cell in order to avoid the problem of
646 // non-mutual neighbourness
647 // since the cells come ordered in phi it should be the 1st cell for
648 // nextNeighbInPhi
649 get_prevInEta(hecRegion, index2, nPhi, gPhi, minHash, neighbourIndex, neighbList, nPrevBiggerCell);
650 if ( neighbourIndex > oldNeighbourIndex+1 ) {
651 neighbourIndex = oldNeighbourIndex+1;
652 }
653 oldNeighbourIndex = neighbourIndex;
654 get_nextInEta(hecRegion, index2, nPhi, gPhi, maxHash, neighbourIndex, neighbList, nNextBiggerCell);
655 if ( neighbourIndex > oldNeighbourIndex+1 ) {
656 neighbourIndex = oldNeighbourIndex+1;
657 }
658 }
659 }
660
661 //
662 // .... neighbours in sampling (common code)
663 // HEC caracteristics = no granularity change, partial overlap of samplings
664 //
665 if( (option & LArNeighbours::upAndDown) ){
666 // initial eta granularity
667 float granEta = hecRegion->etaGranularity();
668 // initial eta
669 int nEta = int( (index-minHash) / nPhi);
670 double absEta = hecRegion->etaMin() + nEta*granEta;
671
672 // previous neighbours in sampling
673 if( (option & LArNeighbours::prevInSamp) ){
674 get_prevInSamp(hecRegion, index, nPhi, minHash, absEta, neighbourIndex, neighbList);
675 } // end option
676
677 // next neighbours in sampling
678 if( (option & LArNeighbours::nextInSamp) ){
679 get_nextInSamp(hecRegion, index, nPhi, minHash, absEta, neighbourIndex, neighbList);
680 }
681 }
682
683 neighbourList.resize(neighbourIndex);
684 if (neighbourIndex <= maxNeighb) {
685 std::copy (&neighbList[0], &neighbList[neighbourIndex], neighbourList.begin());
686 result = 0 ;
687 } else {
688 ATH_MSG_WARNING("more than 20 neighbours for this cell, NONE will be retained " << neighbourIndex);
689 }
690 return result;
691
692}
693
694int LArHEC_Base_ID::get_prevInPhi(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
695 int& neighbourIndex, IdentifierHash* neighbList)
696{
697 int result = 1;
698 if(!hecRegion->isPhiMin(index)) {
699 unsigned int nIndex = index-1;
700 if( ((index-minHash)%(nPhi)) == 0 ) nIndex=index+nPhi-1;
701 IdentifierHash nHash = nIndex;
702 neighbList[neighbourIndex] = nHash;
703 neighbourIndex++;
704 result = 0;
705 }
706 return result;
707}
708
709int LArHEC_Base_ID::get_nextInPhi(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
710 int& neighbourIndex, IdentifierHash* neighbList)
711{
712 int result = 1;
713 if(!hecRegion->isPhiMax(index)) {
714 unsigned int nIndex = index+1;
715 if( ((index-minHash+1)%(nPhi)) == 0 ) nIndex=index-nPhi+1;
716 IdentifierHash nHash = nIndex;
717 neighbList[neighbourIndex] = nHash;
718 neighbourIndex++;
719 result = 0;
720 }
721 return result;
722}
723
724int LArHEC_Base_ID::get_prevInEta(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const float& gPhi, const unsigned int& minHash,
725 int& neighbourIndex, IdentifierHash* neighbList, unsigned int& nBiggerCell) const
726{
727 int result = 1;
728 unsigned int nIndex = 0;
729 IdentifierHash nHash = 0;
730
731 if( hecRegion->isEtaMin(index)){
732 // eta == etaMin -> go to previous region in eta
733 short int nPrevEtaRegion = hecRegion->prevEtaRegion();
734 // no neighbour if no previous region in eta
735 if( nPrevEtaRegion != NOT_VALID_HEC_REGION ) {
736 // Tell clang to optimize assuming that FP exceptions can trap.
737 // Otherwise, it can vectorize the division, which can lead to
738 // spurious division-by-zero traps from unused vector lanes.
740 LArHEC_region* prevHecRegion = m_vecOfRegions[nPrevEtaRegion];
741 short int nPhiMinus = prevHecRegion->phiN();
742 float gPhiMinus= prevHecRegion->phiGranularity();
743 unsigned int maxHashMinus = prevHecRegion->hashMax();
744 float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
745 float rPhi = (index-minHash)*gPhi+hecRegion->phiMin();
746 int nPhiMinusFirst = int(std::floor((rPhi -prevHecRegion->phiMin())
747 /gPhiMinus+phiMargin))
748 +maxHashMinus-nPhiMinus;
749 int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevHecRegion->phiMin())
750 /gPhiMinus+phiMargin))
751 +maxHashMinus-nPhiMinus;
752 if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
753
754 for(int i=nPhiMinusFirst; i<nPhiMinusNext; i++){
755 nIndex = i ;
756 if(nIndex != nBiggerCell) {
757 nHash = nIndex;
758 neighbList[neighbourIndex] = nHash;
759 neighbourIndex++;
760 result = 0;
761 }
762 // to avoid duplicated cells in corners
763 if(gPhi < gPhiMinus && nBiggerCell == NOT_VALID_HASH) nBiggerCell=nIndex;
764 }
765 }
766 }
767 else {
768 // stay in same region (1 neighbour)
769 nIndex = index - nPhi;
770 nHash = nIndex;
771 neighbList[neighbourIndex] = nHash;
772 neighbourIndex++;
773 result = 0;
774 }
775 return result;
776}
777
778int LArHEC_Base_ID::get_nextInEta(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const float& gPhi,
779 const unsigned int& maxHash,
780 int& neighbourIndex, IdentifierHash* neighbList, unsigned int& nBiggerCell) const
781{
782 int result = 1;
783 unsigned int nIndex = 0;
784 IdentifierHash nHash = 0;
785
786 if( hecRegion->isEtaMax(index)){
787 // eta == etaMax -> go to next region in eta
788 short int nNextEtaRegion = hecRegion->nextEtaRegion();
789 // no neighbour if no next region in eta
790 if( nNextEtaRegion != NOT_VALID_HEC_REGION ) {
791 // Tell clang to optimize assuming that FP exceptions can trap.
792 // Otherwise, it can vectorize the division, which can lead to
793 // spurious division-by-zero traps from unused vector lanes.
795 LArHEC_region* nextHecRegion = m_vecOfRegions[nNextEtaRegion];
796 float gPhiPlus= nextHecRegion->phiGranularity();
797 unsigned int minHashPlus = nextHecRegion->hashMin();
798 float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
799 float rPhi = (index+nPhi-maxHash)*gPhi+hecRegion->phiMin();
800 int nPhiPlusFirst = int(std::floor((rPhi -nextHecRegion->phiMin())
801 /gPhiPlus+phiMargin))+minHashPlus;
802 int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextHecRegion->phiMin())
803 /gPhiPlus+phiMargin))+minHashPlus;
804 if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
805
806 for(int i=nPhiPlusFirst; i<nPhiPlusNext; i++){
807 nIndex = i ;
808 if(nIndex != nBiggerCell) {
809 nHash = nIndex;
810 neighbList[neighbourIndex] = nHash;
811 neighbourIndex++;
812 result = 0;
813 }
814 // to avoid duplicated cells in corners
815 if(gPhi < gPhiPlus && nBiggerCell == NOT_VALID_HASH) nBiggerCell=nIndex;
816 }
817 }
818 }
819 else {
820 // stay in same region (1 neighbour)
821 nIndex = index + nPhi;
822 nHash = nIndex;
823 neighbList[neighbourIndex] = nHash;
824 neighbourIndex++;
825 result = 0;
826 }
827 return result;
828}
829
830int LArHEC_Base_ID::get_prevInSamp(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
831 const double& absEta,
832 int& neighbourIndex, IdentifierHash* neighbList) const
833{
834 int result = 1;
835 // neighbours' indices
836 unsigned int nIndex=0;
837 // neighbours' hash
838 IdentifierHash nHash=0;
839
840 // previous region in sampling
841 const std::vector<short int>& prevSampRegion=hecRegion->prevSamplingRegion();
842 int nPrevSampReg = prevSampRegion.size();
843 if(nPrevSampReg > 0) {
844 float gEta = hecRegion->etaGranularity();
845 float gPhi = hecRegion->phiGranularity();
846 for(int ireg=0; ireg<nPrevSampReg; ireg++) {
847 LArHEC_region* prevHecRegion = m_vecOfRegions[prevSampRegion[ireg]];
848 float minEtaMinus = prevHecRegion->etaMin();
849 float maxEtaMinus = prevHecRegion->etaMax();
850 // eta granularity of previous region
851 float granEtaMinus = prevHecRegion->etaGranularity();
852 float margin = 0.25*std::min(gEta,granEtaMinus);
853 if((minEtaMinus < absEta+gEta-margin) && (absEta+margin < maxEtaMinus)) {
854 // Tell clang to optimize assuming that FP exceptions can trap.
855 // Otherwise, it can vectorize the division, which can lead to
856 // spurious division-by-zero traps from unused vector lanes.
858
859 // max phi of previous region in sampling
860 short int nPhiMinus = prevHecRegion->phiN();
861 // first hash of previous region in sampling
862 unsigned int minHashMinus = prevHecRegion->hashMin();
863 float gPhiMinus = prevHecRegion->phiGranularity();
864 float phiMargin = 0.25*std::min(gPhi,gPhiMinus);
865 // phi 'coordinate' in initial region
866 float rPhi = ((index-minHash)%nPhi)*gPhi+hecRegion->phiMin();
867 int nPhiMinusFirst = int(std::floor((rPhi -prevHecRegion->phiMin())
868 /gPhiMinus+phiMargin));
869 int nPhiMinusNext = int(std::floor((rPhi+gPhi-prevHecRegion->phiMin())
870 /gPhiMinus+phiMargin));
871 if ( nPhiMinusNext == nPhiMinusFirst ) nPhiMinusNext++;
872 // eta coordinate in initial region
873 double fEtaMinus = (absEta-minEtaMinus) / granEtaMinus + margin;
874 short int nEtaMinus = int(fEtaMinus) ;
875 for(int i=nPhiMinusFirst; i<nPhiMinusNext; i++){
876 nIndex = minHashMinus + nEtaMinus * nPhiMinus + i;
877 if( (nIndex >= prevHecRegion->hashMin()) && (nIndex < prevHecRegion->hashMax()) ) {
878 nHash = nIndex;
879 neighbList[neighbourIndex] = nHash;
880 neighbourIndex++;
881 result = 0;
882 }
883 }
884 } // end eta condition
885 } // end loop on ireg
886 } // end if(nPrevSampReg>0)
887 return result;
888}
889
890int LArHEC_Base_ID::get_nextInSamp(const LArHEC_region* hecRegion, const unsigned int& index, const short int& nPhi, const unsigned int& minHash,
891 const double& absEta,
892 int& neighbourIndex, IdentifierHash* neighbList) const
893{
894 int result = 1;
895 // neighbours' indices
896 unsigned int nIndex=0;
897 // neighbours' hash
898 IdentifierHash nHash=0;
899
900 const std::vector<short int>& nextSampRegion=hecRegion->nextSamplingRegion();
901 int nNextSampReg = nextSampRegion.size();
902 if(nNextSampReg > 0) {
903 float gEta = hecRegion->etaGranularity();
904 float gPhi = hecRegion->phiGranularity();
905 for(int ireg=0; ireg<nNextSampReg; ireg++) {
906 LArHEC_region* nextHecRegion = m_vecOfRegions[nextSampRegion[ireg]];
907 float granEtaPlus = nextHecRegion->etaGranularity();
908 float minEtaPlus = nextHecRegion->etaMin();
909 float maxEtaPlus = nextHecRegion->etaMax();
910 float margin = 0.25*std::min(gEta,granEtaPlus);
911 if((minEtaPlus < absEta+gEta-margin) && (absEta+margin < maxEtaPlus)) {
912 // Tell clang to optimize assuming that FP exceptions can trap.
913 // Otherwise, it can vectorize the division, which can lead to
914 // spurious division-by-zero traps from unused vector lanes.
916
917 short int nPhiPlus = nextHecRegion->phiN();
918 unsigned int minHashPlus = nextHecRegion->hashMin();
919 float gPhiPlus = nextHecRegion->phiGranularity();
920 float phiMargin = 0.25*std::min(gPhi,gPhiPlus);
921 // phi 'coordinate' in initial region
922 float rPhi = ((index-minHash)%nPhi)*gPhi+hecRegion->phiMin();
923 int nPhiPlusFirst = int(std::floor((rPhi -nextHecRegion->phiMin())
924 /gPhiPlus+phiMargin));
925 int nPhiPlusNext = int(std::floor((rPhi+gPhi-nextHecRegion->phiMin())
926 /gPhiPlus+phiMargin));
927 if ( nPhiPlusNext == nPhiPlusFirst ) nPhiPlusNext++;
928
929 double fEtaPlus = (absEta-minEtaPlus) / granEtaPlus + margin ;
930 int nEtaPlus = int(fEtaPlus) ;
931 for(int i=nPhiPlusFirst; i<nPhiPlusNext; i++){
932 nIndex = minHashPlus + nEtaPlus * nPhiPlus + i;
933 if( (nIndex >= nextHecRegion->hashMin()) && (nIndex < nextHecRegion->hashMax()) ) {
934 nHash = nIndex;
935 neighbList[neighbourIndex] = nHash;
936 neighbourIndex++;
937 result = 0;
938 }
939 }
940 }
941 }
942 }
943 return result;
944}
945
946
948{
949 const std::vector<const IdDictRegion*>& vecOfDictRegions = dictRegions();
950
951 ATH_MSG_DEBUG("init_neighbors");
952
953 //
954 // ..... loop on HEC regions -> store vector of LArHEC_region*
955 //
956 short int reg=0;
957 std::vector<Identifier>::const_iterator debut=reg_begin() ;
958 std::vector<Identifier>::const_iterator fin =reg_end() ;
959
960 for (; debut != fin; ++debut)
961 {
962 const Identifier& regId = (*debut);
963 bool fullSym = (dictionaryVersion() == "fullAtlas" );
964 //
965 // ..... translate regId to chanId and get hash
966 //
967 Identifier id ;
968 unsigned int index0 = NOT_VALID_HASH;
969 int etaMin = eta_min(regId);
970 int phiMin = phi_min(regId);
971 if(etaMin >= 0 && phiMin >= 0)
972 {
973 try{
974 id = channel_id (regId, etaMin, phiMin );
975 }
976 catch(LArID_Exception & except){
977 ATH_MSG_ERROR(" LArId exception " << (std::string)except);
978 }
979 IdentifierHash hashId = channel_hash(id) ;
980 index0=hashId;
981 }
982 else
983 {
984 ATH_MSG_WARNING(" could not find non negative etaMin and phiMin for region " << show_to_string(regId));
985 index0 = 0;
986 }
987
988
989 short int deltaEta = eta_max(regId) - eta_min(regId) + 1 ;
990 short int nPhi = phi_max(regId) - phi_min(regId) + 1 ;
991 // starting eta
992 float eta0 = this->eta0(reg);
993 // eta granularity
994 float deta = this->etaGranularity(reg);
995 // starting phi
996 float phi0 = this->phi0(reg);
997 // phi granularity
998 float dphi = this->phiGranularity(reg);
999
1000 // full range of regions
1001 unsigned int ireg0=0;
1002 unsigned int ireg1=region_hash_max();
1003 // if 2 symetric sides, in which side is the current reg.
1004 if(twoSymSides()) {
1005 if(reg < (short int)region_hash_max()/2) {
1006 ireg0=0;
1007 ireg1=region_hash_max()/2;
1008 } else {
1009 ireg0=region_hash_max()/2;
1010 ireg1=region_hash_max();
1011 }
1012 }
1013
1014 //
1015 // .... compute prev/next regions in eta
1016 //
1017 short int regForPrevEta=NOT_VALID_HEC_REGION;
1018 const IdDictRegion* prevEtaDicReg = vecOfDictRegions[reg]->prev_abs_eta();
1019 short int regForNextEta=NOT_VALID_HEC_REGION;
1020 const IdDictRegion* nextEtaDicReg = vecOfDictRegions[reg]->next_abs_eta();
1021 for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1022 if(vecOfDictRegions[ireg] == prevEtaDicReg) regForPrevEta = ireg;
1023 if(vecOfDictRegions[ireg] == nextEtaDicReg) regForNextEta = ireg;
1024 }
1025
1026 //
1027 // .... compute prev/next regions in sampling
1028 //
1029 //
1030 std::vector<short int> regForPrevSamp;
1031 for (const IdDictRegion* dictreg : vecOfDictRegions[reg]->prev_samp()) {
1032 for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1033 if(vecOfDictRegions[ireg] == dictreg) regForPrevSamp.push_back(ireg);
1034 }
1035 }
1036
1037 std::vector<short int> regForNextSamp;
1038 for (const IdDictRegion* dictreg : vecOfDictRegions[reg]->next_samp()) {
1039 for(unsigned int ireg=ireg0;ireg<ireg1;ireg++){
1040 if(vecOfDictRegions[ireg] == dictreg) regForNextSamp.push_back(ireg);
1041 }
1042 }
1043
1044 //
1045 // ....now ready to build region object
1046 //
1047
1048 LArHEC_region * hecRegion = new LArHEC_region(index0,deltaEta,nPhi,eta0,deta,phi0,dphi,fullSym,
1049 regForPrevEta,regForNextEta,
1050 regForPrevSamp,regForNextSamp);
1051 // save in a vector for further use in get_neighbours method
1052 m_vecOfRegions.push_back(hecRegion);
1053 reg++;
1054 } // end of loop on regions
1055
1056 //
1057 // ..... loop on channels
1058 //
1059 reg=0;
1060 debut = hec_begin();
1061 fin = hec_end();
1062 if( debut != fin ){
1063 Identifier lastRegId=region_id(*debut);
1064 for (; debut != fin; ++debut) {
1065 const Identifier& chanId = (*debut);
1066 const Identifier& regId = region_id(chanId);
1067 if(regId != lastRegId) reg++;
1068
1069 if(m_do_checks) {
1070 // for cross check only
1071 IdentifierHash hashReg = region_hash(regId);
1072 if ((short int)hashReg != reg) {
1073 ATH_MSG_ERROR(" init_neighbors: problem reg, hashReg = " << reg << " " << hashReg);
1074 }
1075 }
1076
1077 // save region of the cell in a vector for further use in get_neighbours method
1078 m_vecOfCellInfo.push_back(reg);
1079
1080 lastRegId=regId;
1081 }
1082 }
1083 return (0);
1084}
1085
1086
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
Factor out code common between LArHEC_ID and LArHEC_SuperCell_ID.
@ NOT_VALID_HEC_REGION
Provide helper functions to create formatted strings.
#define min(a, b)
Definition cfImp.cxx:40
virtual std::string dictionaryVersion(void) const override
bool m_do_checks
Flag for subclasses to know whether or not to perform checks.
bool m_do_neighbours
Flag for subclasses to know whether or not to perform neighbour initialization.
int lar_hec_field_value() const
bool reinitialize(const IdDictMgr &dict_mgr)
Test whether an idhelper should be reinitialized based on the change of tags.
virtual void setDictVersion(const IdDictMgr &dict_mgr, const std::string &name) override
ExpandedIdentifier lar_hec_exp(void) const
int lar_field_value() const
std::string show_to_string(Identifier id, const IdContext *context=0, char sep='.') const
or provide the printout in string form
const std::string & group() const
Group name for this helper.
float phi0(const IdentifierHash regHash) const
Return the minimum phi of region, or NOT_VALID.
const HashGroup & regions() const
Return the HashGroup for regions.
IdentifierHash region_hash(Identifier regionId) const
Convert a connected region Identifier to a hash code.
float eta0(const IdentifierHash regHash) const
Return the minimum eta of region, or NOT_VALID.
const std::vector< const IdDictRegion * > & dictRegions() const
Return the vector of IdDictRegion, accessed via region hash.
float etaGranularity(const IdentifierHash regHash) const
Return the eta granularity of a region, or NOT_VALID.
size_type region_hash_max() const
One more than the largest region hash code.
int initialize_base_from_dictionary(const IdDictMgr &dict_mgr, const std::string &dict_name)
Do basic initialization of the helper.
IdContext region_context() const
Return the context for regions.
size_type channel_hash_max() const
One more than the largest channel (cell) hash code.
CaloIDHelper(const std::string &name, const std::string &group)
Constructor.
int fill_vec_of_dict_regions(const std::string &group_name="")
Initialize the list of detector regions.
float phiGranularity(const IdentifierHash regHash) const
Return the phi granularity of a region, or NOT_VALID.
const IdDictDictionary * dict() const
Return the dictionary for this subdetector.
const std::string & name() const
Return the name for this helper.
const HashGroup & channels() const
Return the HashGroup for channels (cells).
void add(element_type value)
Append a value into a new field.
void clear()
Erase all fields.
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
size_type end_index() const
Definition IdContext.h:46
MultiRange build_multirange() const
Get MultiRange for full dictionary.
int get_label_value(const std::string &field, const std::string &label, int &value) const
const std::string & name() const
Dictionary name.
const IdDictField * find_field(const std::string &name) const
const IdDictRegion & region(size_t i) const
Region at index i.
const IdDictDictionary * find_dictionary(const std::string &name) const
Access dictionary by name.
element_type get_minimum() const
Query the values.
bool empty() const
If true, this field does not have any constraints, and may hold any value representable by element_ty...
element_type get_maximum() const
This is a "hash" representation of an Identifier.
small class holding the starting hash value, the min eta and the number of phi bins of each region
size_type m_REGION_INDEX
IdDictFieldImplementation m_region_impl
id_iterator hec_end() const
end iterator over full set of Hec Identifiers for channels
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,...
IdDictFieldImplementation m_phi_impl
int initLevelsFromDict(const std::string &group_name)
int region(const Identifier id) const
return region [0,1]
LArHEC_Base_ID(const std::string &name, const std::string &group, bool supercell)
Constructor.
int eta_min(const Identifier regId) const
min value of eta index (-999 == failure)
size_type m_SAMPLING_INDEX
id_iterator reg_begin() const
begin iterator over set of region Identifiers
static int get_prevInPhi(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList)
Identifier channel_id(const ExpandedIdentifier &exp_id) const
channel identifier for a channel from ExpandedIdentifier
int initialize_base_from_dictionary(const IdDictMgr &dict_mgr, const std::string &group_name)
initialization from the identifier dictionary
bool twoSymSides() const
True if the + and - sides of the calorimeter are identical (true layout).
size_type m_LAR_INDEX
int phi_min_init(const Identifier regId) const
void channel_id_checks(int pos_neg, int sampling, int region, int eta, int phi) const
static int get_nextInPhi(const LArHEC_region *hecRegion, const unsigned int &index, const short int &nPhi, const unsigned int &minHash, int &neighbourIndex, IdentifierHash *neighbList)
int phi_max(const Identifier regId) const
max value of phi index (-999 == failure)
size_type m_SLAR_INDEX
void region_id_checks(int pos_neg, int sampling, int region) const
IdDictFieldImplementation m_hec_impl
Identifier region_id(const ExpandedIdentifier &exp_id) const
region identifier for a channel from ExpandedIdentifier
IdDictFieldImplementation m_slar_impl
size_type m_ETA_INDEX
IdDictFieldImplementation m_sampling_impl
std::vector< HashCalc > m_hash_calcs
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
MultiRange m_full_channel_range
std::vector< short int > m_vecOfPhiMin
int phi(const Identifier id) const
return phi[0,63] outer part [0,31] inner part
IdDictFieldImplementation m_pn_impl
size_type m_hec_region_index
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
size_type m_POSNEG_INDEX
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
IdDictFieldImplementation m_pn_reg_impl
id_iterator hec_begin() const
begin iterator over full set of Hec Identifiers for channels
MultiRange m_full_region_range
bool is_supercell(const Identifier id) const
Test if the identifier represents a supercell.
int phi_min(const Identifier regId) const
min value of phi index (-999 == failure)
int eta(const Identifier id) const
return eta [0,9] outer part [0,3] inner part
size_type m_HEC_INDEX
int pos_neg(const Identifier id) const
return pos_neg -2 (C side) or 2 (A side)
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
virtual int get_expanded_id(const Identifier &id, ExpandedIdentifier &exp_id, const IdContext *context) const
create expanded Identifier from Identifier (return == 0 for OK)
int sampling(const Identifier id) const
return sampling [0,3] (only 0 for supercells)
std::vector< short int > m_vecOfCellInfo
IdDictFieldImplementation m_lar_impl
std::vector< LArHEC_region * > m_vecOfRegions
int eta_max(const Identifier regId) const
max value of eta index (-999 == failure)
IdDictFieldImplementation m_eta_impl
size_type m_PHI_INDEX
IdentifierHash channel_hash(Identifier channelId) const
create hash id from channel id
id_iterator reg_end() const
end iterator over set of region Identifiers
IdentifierHash channel_hash_binary_search(Identifier channelId) const
create hash id from channel id – method NOT optimised, please use channel_hash() above
This class provides an interface to deal with regions in the neighbours finding.
bool isEtaMax(const unsigned int &index) const
is the considered cell in the last eta bin of the region ?
float etaGranularity() const
eta granularity
bool isPhiMax(const unsigned int &index) const
is the considered cell in the last phi bin of the region ?
const std::vector< short int > & prevSamplingRegion() const
region number of the prev region in sampling
float etaMax() const
end eta
const std::vector< short int > & nextSamplingRegion() const
region number of the next region in sampling
short int nextEtaRegion() const
region number of the next region in eta
unsigned int hashMax() const
hash Id of the last cell of the region +1
unsigned int hashMin() const
hash Id of the first cell of the region
float phiMin() const
starting phi
short int prevEtaRegion() const
region number of the previous region in eta
float phiGranularity() const
phi granularity
short int phiN() const
number of phi bins
float etaMin() const
starting eta
bool isPhiMin(const unsigned int &index) const
is the considered cell in the first phi bin of the region ?
bool isEtaMin(const unsigned int &index) const
is the considered cell in the first eta bin of the region ?
Exception class for LAr Identifiers.
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
std::string strformat(const char *fmt,...)
return a std::string according to a format fmt and varargs
Definition StrFormat.cxx:49
Definition index.py:1
Tell the compiler to optimize assuming that FP may trap.
#define CXXUTILS_TRAPPING_FP
Definition trapping_fp.h:24