ATLAS Offline Software
Loading...
Searching...
No Matches
AtlasDetectorID.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***************************************************************************
6 Detector Description
7 -----------------------------------------
8***************************************************************************/
9
15#include "IdDict/IdDictField.h"
16#include "IdDict/IdDictLabel.h"
17#include "IdDict/IdDictMgr.h"
18#include "IdDict/IdDictRange.h"
19#include "IdDict/IdDictRegion.h"
20
21namespace{
22
23 Identifier makeId(const IdDictFieldImplementation & impl0,
24 const IdDictFieldImplementation & impl1, int det, int subdet){
25 Identifier result = impl0.new_pack(det);
26 impl1.pack(subdet, result);
27 return result;
28 }
29}
30
31AtlasDetectorID::AtlasDetectorID(const std::string &name,
32 const std::string& group)
33 : AthMessaging(name),
35{
36}
38
39const std::string& AtlasDetectorID::group() const
40{
41 return m_group;
42}
43
45 return Identifier{};
46}
48 return Identifier{};
49}
51 return Identifier{};
52}
54 return Identifier{};
55}
57 return Identifier{};
58}
60 return Identifier{};
61}
65
67 return m_det_impl.new_pack(lar_field_value());
68}
69
71 return m_det_impl.new_pack(tile_field_value());
72}
73
75 return m_det_impl.new_pack(muon_field_value());
76}
77
79 return m_det_impl.new_pack(calo_field_value());
80}
81
85
89
93
97
101
105
109
113
117
121
125
131
137
139 Identifier & /*id*/,
140 const IdContext * /*context*/) const {
141 return 0;
142}
143
145 IdentifierHash & /*hash_id*/,
146 const IdContext * /*context*/) const {
147 return 0;
148}
149
151 const std::string &dict_name) {
152 // Register version of dictionary dict_name
153
154 // Access dictionary by name
155 const IdDictDictionary *dict = dict_mgr.find_dictionary(dict_name);
156 if (!dict) {
157 ATH_MSG_ERROR(__func__<<":"<<__LINE__<<" No dictionary found");
158 return 1;
159
160 }
161 // Add in dict name, file name and version
162 m_dict_names.push_back(dict_name);
163 m_file_names.push_back(dict->file_name());
164 m_dict_tags.push_back(dict->dict_tag());
165 return 0;
166}
167
171 // If no tag has been registered, then reinitialize
172 if (m_dict_tags.empty() || m_dict_names.empty() ){
173 return true;
174 }
175
176 // Loop over dict names and check version tags
177 if (m_dict_names.size() != m_dict_tags.size()) [[unlikely]]{
178 ATH_MSG_ERROR("reinitialize: dict names and tags vectors not the same length ");
179 ATH_MSG_ERROR("names: " << m_dict_names.size() << " tags: " << m_dict_tags.size());
180 }
181 for (unsigned int i = 0; i < m_dict_names.size(); ++i) {
182 // Access dictionary by name
183 const IdDictDictionary *dict = dict_mgr.find_dictionary(m_dict_names[i]);
184 if (!dict)[[unlikely]] {
185 ATH_MSG_ERROR("reinitialize: could not find dict - " << m_dict_names[i]);
186 return false;
187 }
188 if (m_dict_tags[i] != dict->dict_tag()) {
189 // Remove all memory of versions
190 m_dict_names.clear();
191 m_dict_tags.clear();
192 m_file_names.clear();
193 return true;
194 }
195 }
196
197 // Tags match - don't reinitialize
198 return false;
199}
200
202
203 // Register version of ATLAS dictionary
204 if (register_dict_tag(dict_mgr, "ATLAS")){
205 ATH_MSG_ERROR(__func__<<":"<<__LINE__<<" - Failed to register dict tag");
206 return 1;
207 }
208 // Initialize helper, needed for init of AtlasDetectorID
209 if (!m_helper) {
210 m_helper = std::make_unique<AtlasDetectorIDHelper>();
211 }
212
213 if (m_helper->initialize_from_dictionary(dict_mgr)){
214 ATH_MSG_ERROR(__func__<<":"<<__LINE__<<" - Initialization from dictionary failed.");
215 return 1;
216 }
217 // Initialize level indices and id values from dicts
218 if (initLevelsFromDict(dict_mgr)) {
219 ATH_MSG_ERROR(__func__<<":"<<__LINE__<<" - Level initialization from dictionary failed.");
220 return 1;
221 }
223 ATH_MSG_DEBUG("initialize_from_dictionary - OK");
224 return 0;
225}
226
228 return m_dict_version;
229}
231 return id.fields() > 0 && id[0] == m_INDET_ID;
232}
234 return id.fields() > 0 && id[0] == m_LAR_ID;
235}
237 return id.fields() > 0 && id[0] == m_TILE_ID;
238}
240 return id.fields() > 0 && id[0] == m_MUON_ID;
241}
243 return id.fields() > 0 && id[0] == m_CALO_ID;
244}
246 return is_indet(id) && id.fields() > 1 && id[1] == m_PIXEL_ID;
247}
248
250 return is_indet(id) && id.fields() > 1 && id[1] == m_SCT_ID;
251}
253 return is_indet(id) && id.fields() > 1;
254}
256 return is_indet(id) && id.fields() > 1 && id[1] == m_HGTD_ID;
257}
259 return is_indet(id) && id.fields() > 1 && id[1] == m_LUMI_ID;
260}
262 return is_lumi(id) && id.fields() > 2 && id[2] == m_LUMI_PLR_ID;
263}
264
266 return is_lar(id) && id.fields() > 1 && std::abs(id[1]) == m_LAR_EM_ID;
267}
269 return is_lar(id) && id.fields() > 1 && std::abs(id[1]) == m_LAR_HEC_ID;
270}
271
273 return is_lar(id) && id.fields() > 1 && std::abs(id[1]) == m_LAR_FCAL_ID;
274}
275
277 return is_lar_fcal(id) && id.fields() > 3 &&std::abs(id[3]) == 0;
278}
279
281 return id.fields() > 4 && id[0] == m_MUON_ID && id[4] == m_MDT_ID;
282}
283
285 return id.fields() > 4 && id[0] == m_MUON_ID && id[4] == m_CSC_ID;
286}
287
289 return id.fields() > 4 && id[0] == m_MUON_ID && id[4] == m_RPC_ID;
290}
291
293 return id.fields() > 4 && id[0] == m_MUON_ID && id[4] == m_TGC_ID;
294}
295
297 return id.fields() > 4 && id[0] == m_MUON_ID && id[4] == m_STGC_ID;
298}
299
301 return id.fields() > 4 && id[0] == m_MUON_ID && id[4] == m_MM_ID;
302}
303
304// Short print out of any identifier:
305void AtlasDetectorID::show(const Identifier id, const IdContext *context, char sep) const {
306 ATH_MSG_INFO(show_to_string(id, context, sep));
307}
308
309// or provide the printout in string form
310std::string
311AtlasDetectorID::show_to_string(const Identifier id, const IdContext *context, char sep) const {
312 // Do a generic printout of identifier
313
314 std::string result("Unable to decode id");
315 unsigned int max_index = (context) ? context->end_index() : 999;
316
317 if (!id.is_valid()) {
318 return "[INVALID]";
319 }
320
322 return result;
323
324 // Find the dictionary to use:
325 const IdDictDictionary * dict = dictionary(id);
326 ExpandedIdentifier expId{};
327 ExpandedIdentifier prefix{}; // default is null prefix
328 Identifier compact = id;
329
330 if (!dict) {
331 ATH_MSG_WARNING(__func__<<" No detector type associated to id "<<id);
332 return result;
333 }
334 if (dict->unpack(m_group, compact, prefix, max_index, expId)) {
335 return result;
336 }
337
338 bool first = true;
339 result = "";
340 if ('.' == sep)
341 result = '[';
342 for (unsigned int i = 0; i < expId.fields(); ++i) {
343 if (first)
344 first = false;
345 else
346 result += sep;
347 result += std::to_string(expId[i]);
348 }
349 if ('.' == sep)
350 result += ']';
351 return result;
352}
353
354void AtlasDetectorID::print(Identifier id, const IdContext *context) const {
355 ATH_MSG_INFO(print_to_string(id, context));
356}
357
359 const IdContext *context) const {
360 // Print out for any Atlas identifier
361 std::string result;
363
364 // Do a generic printout of identifier from dictionary
365 unsigned int max_index = (context) ? context->end_index() : 999;
366
367 // Find the dictionary to use:
368 const IdDictDictionary *dict = dictionary(id);
369 ExpandedIdentifier expId;
370 ExpandedIdentifier prefix; // default is null prefix
371 Identifier compact = id;
372 if (!dict) {
373 ATH_MSG_WARNING(__func__<<":"<<__LINE__<<" No dictionary could be associated to "<<id);
374 return result;
375 }
376 if (dict->unpack(m_group, compact, prefix, max_index," ", result)) {
377 return result;
378 }
379 }
380 return result;
381}
382const std::vector<std::string> & AtlasDetectorID::dict_names() const {
383 return m_dict_names;
384}
385const std::vector<std::string>& AtlasDetectorID::file_names() const {
386 return m_file_names;
387}
388const std::vector<std::string> & AtlasDetectorID::dict_tags() const {
389 return m_dict_tags;
390}
392 return m_do_checks;
393}
397
399 return m_do_neighbours;
400}
401
405
406void AtlasDetectorID::setDictVersion(const IdDictMgr &dict_mgr, const std::string &name) {
407 const IdDictDictionary *dict = dict_mgr.find_dictionary(name);
408 m_dict_version = dict->version();
409}
410
411std::string AtlasDetectorID::to_range(const ExpandedIdentifier &id) const {
412
413 // Build a string from the contents of an identifier
414 int fields = id.fields();
415 std::string result;
416 for (int i = 0; i < fields; ++i) {
417 if (i > 0) {
418 result += '/'; // add '/' only if NOT first one
419 }
420 result += std::to_string(id[i]);
421 }
422 return result;
423}
424
426
427 // Set do_checks flag
428 if (dict_mgr.do_checks())
429 m_do_checks = true;
430 // Set do_neighbours flag
431 if (!dict_mgr.do_neighbours())
432 m_do_neighbours = false;
433
434
435 const IdDictField *field{nullptr};
436
437 // Find out from the dictionary the detector and subdetector
438 // levels and id values
465
466 // Save generic dict for top levels
467 const IdDictDictionary *top_dict {nullptr};
468
469 auto assignSystemId = [this, &field](const std::string& systemName,
470 int& idToAssign,
471 bool mandatory = true) ->bool {
472 const IdDictLabel *label = field->find_label(systemName);
473 if (label && label->valued()){
474 idToAssign = label->value();
475 ATH_MSG_VERBOSE("Assign system "<<systemName<<" to "<<idToAssign<<".");
476 return true;
477 } else if (label) {
478 ATH_MSG_ERROR("initLevelsFromDict - label "<<systemName<<" does NOT have a value ");
479 return false;
480 }
481 if (mandatory) {
482 ATH_MSG_ERROR("initLevelsFromDict - unable to find '"<<systemName<<"' label");
483 return false;
484 }
485 ATH_MSG_DEBUG("initLevelsFromDict - unable to find '"<<systemName<<"' label");
486 return true;
487 };
488 // Get det ids
489
490 // Initialize ids for InDet subdet
491 m_indet_dict = dict_mgr.find_dictionary("InnerDetector");
492 if (!m_indet_dict) {
493 ATH_MSG_WARNING("initLevelsFromDict - cannot access InnerDetector dictionary");
494 } else {
495 // Found InDet dict
496 top_dict = m_indet_dict; // save as top_dict
497 // Check if this is High Luminosity LHC layout
498 // should just use std::string::contains once that is available... (C++23)
499 std::string versionString = m_indet_dict->version();
500 m_isHighLuminosityLHC = (versionString.find("ITk") != std::string::npos || versionString.find("P2-RUN4") != std::string::npos);
501
502 // Get InDet subdets
503 field = m_indet_dict->find_field("part");
504 if (!field) {
505 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'part' field for InnerDetector dictionary");
506 return 1;
507 }
508
509 if (!assignSystemId("Pixel", m_PIXEL_ID)) {
510 return 1;
511 }
512 if (!assignSystemId("SCT", m_SCT_ID)) {
513 return 1;
514 }
515 if (!assignSystemId("TRT", m_TRT_ID, !m_isHighLuminosityLHC)) {
516 return 1;
517 }
519 if (!assignSystemId("LuminosityDetectors", m_LUMI_ID, versionString.find("PLR") != std::string::npos ||
520 versionString.find("P2-RUN4") != std::string::npos)) {
521 return 1;
522 }
523 if (!assignSystemId("HGTD", m_HGTD_ID)){
524 return 1;
525 }
526 }
527 }
528 // Initialize ids for Forward dets
529 m_fwd_dict = dict_mgr.find_dictionary("ForwardDetectors");
530 if (!m_fwd_dict) {
531 ATH_MSG_WARNING("initLevelsFromDict - cannot access ForwardDetectors dictionary");
532 } else {
533
534 // Found ForwardDetectors dict
535
536 if (!top_dict){
537 top_dict = m_fwd_dict; // save as top_dict
538 }
539 // Get Forward subdets
540
541 field = m_fwd_dict->find_field("part");
542 if (!field) {
543 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'part' field for ForwardDetectors dictionary");
544 return 1;
545 }
546 if (!assignSystemId("ALFA", m_ALFA_ID)) {
547 return 1;
548 }
549 if (!assignSystemId("BCM", m_BCM_ID)) {
550 return 1;
551 }
552 if (!assignSystemId("LUCID", m_LUCID_ID)) {
553 return 1;
554 }
555 if (!assignSystemId("ZDC", m_ZDC_ID)) {
556 return 1;
557 }
558 }
559
560 // Initialize ids for LAr detectors
561 m_lar_dict = dict_mgr.find_dictionary("LArCalorimeter");
562 if (!m_lar_dict) {
563 ATH_MSG_WARNING("initLevelsFromDict - cannot access LArCalorimeter dictionary");
564 } else {
565 // Found LAr dict
566
567 if (!top_dict) {
568 top_dict = m_lar_dict; // save as top_dict
569 }
570 field = m_lar_dict->find_field("part");
571 if (!field) {
572 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'part' field for LArCalorimeter dictionary");
573 return 1;
574 }
575 if (!assignSystemId("LArEM", m_LAR_EM_ID)) {
576 return 1;
577 }
578 if (!assignSystemId("LArHEC", m_LAR_HEC_ID)) {
579 return 1;
580 }
581 if (!assignSystemId("LArFCAL", m_LAR_FCAL_ID)) {
582 return 1;
583 }
584 field = m_lar_dict->find_field("module");
585 if (field) {
586 m_LAR_FCAL_MODULE_INDEX = field->index();
587 } else {
588 ATH_MSG_DEBUG("initLevelsFromDict - unable to find 'module' field for miniFCAL");
589 }
590 }
591
592 // Initialize ids for Tile calo
593 m_tile_dict = dict_mgr.find_dictionary("TileCalorimeter");
594 if (!m_tile_dict) {
595 ATH_MSG_WARNING("initLevelsFromDict - cannot access TileCalorimeter dictionary");
596 } else {
597 // File Tile
598 if (!top_dict)
599 top_dict = m_tile_dict; // save as top_dict
600 }
601
602 // Initialize ids for Muon detectors
603 m_muon_dict = dict_mgr.find_dictionary("MuonSpectrometer");
604 if (!m_muon_dict) {
605 ATH_MSG_WARNING("initLevelsFromDict - cannot access MuonSpectrometer dictionary");
606 } else {
607 // Found muon dict
608 if (!top_dict){
609 top_dict = m_muon_dict; // save as top_dict
610 }
611 /*
612 During initialisation from the dictionary we parse the
613 information which muon stationName belongs to which muon
614 subsystem. This information is not entirely encoded in the
615 identifiers however it is frequently tested during
616 reconstruction. In order to speed up these checks this info
617 is now stored locally into m_muon_tech_bits.
618 P.Fleischmann 04.04.2013
619 */
620 if (m_muon_tech_bits.empty()) {
621 // we only need to load this once
622 field = m_muon_dict->find_field("stationName");
623 if (!field) {
624 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'stationName' field for MuonSpectrometer dictionary");
625 return 1;
626 }
627
628 size_type nStationNames = field->get_label_number();
629 std::string stationNameString{};
630
631 // first check for the maximum value assigned to any stationName
632 int stationNameIndex{};
633 int maxStationNameIndex{-1};
634 for (size_type i = 0; i < nStationNames; ++i) {
635 // in case no individual values are given,
636 // the order inside the dictionary is used
637 const IdDictLabel& label = field->label(i);
638 stationNameIndex = label.valued() ? label.value() : i;
639
640 maxStationNameIndex = std::max(maxStationNameIndex, stationNameIndex);
641 }
642
643 // the vector may contain gaps (value=0) in case of jumps
644 // in the values
645 m_muon_tech_bits.resize(maxStationNameIndex + 1);
646
647 // loop over all stationNames and search for associations
648 // to technology
649 for (size_type i = 0; i < nStationNames; ++i) {
650 const IdDictLabel& label = field->label(i);
651 stationNameString = label.name();
652 // in case no individual values are given,
653 // the order inside the dictionary is used
654 stationNameIndex = label.valued() ? label.value() : i;
655 // next loop over all regions to look for
656 // stationName <-> technology associations
657 bool found{false}, stationNameFound{false}, technologyFound{false};
658 std::string techLabel{};
659 size_t nregions = m_muon_dict->n_regions();
660 for (size_type j = 0; j < nregions; ++j) {
661 const IdDictRegion& region = m_muon_dict->region(j);
662 // loop over all entries of a region to look for
663 // stationName and technology information
664 stationNameFound = technologyFound = false;
665 size_t nentries = region.n_entries();
666 for (size_type k = 0; k < nentries; ++k) {
667 const IdDictRange *range =
668 dynamic_cast<const IdDictRange *>(&region.entry(k));
669 if (!range) {
670 continue;
671 }
672
673 if (range->field_name() == "stationName") {
674
675 if (range->label() == stationNameString) {
676 // we found a region containing the current stationName
677 stationNameFound = true;
678 continue;
679 } else {
680 // we found a region containing a different stationName,
681 // let's skip
682 break;
683 }
684 } else if (range->field_name() == "technology") {
685 technologyFound = true;
686 techLabel = range->label();
687 }
688
689 if (!stationNameFound || !technologyFound) {
690 continue;
691 }
692
693 // we found a stationName <-> technology association
694 if (techLabel == "MDT") {
695 m_muon_tech_bits[stationNameIndex] = AtlasDetDescr::fAtlasMDT;
696 } else if (techLabel == "RPC") {
697 m_muon_tech_bits[stationNameIndex] = AtlasDetDescr::fAtlasRPC;
698 } else if (techLabel == "CSC") {
699 m_muon_tech_bits[stationNameIndex] = AtlasDetDescr::fAtlasCSC;
700 } else if (techLabel == "TGC"){
701 m_muon_tech_bits[stationNameIndex] = AtlasDetDescr::fAtlasTGC;
702 } else if (techLabel == "MM") {
703 m_muon_tech_bits[stationNameIndex] = AtlasDetDescr::fAtlasMM;
704 } else if (techLabel == "STGC") {
706 } else {
708 }
709 found = true;
710 break;
711 } // end of loop overregion entries
712
713 if (found) {
714 // no need to continue to look for this stationName,
715 // since each stationName must be uniquely associated
716 // to a technology, except for MDT/PRC
717 break;
718 }
719
720 } // end of loop over regions
721
722 } // end of loop over stationNames
723 }
724 // end of filling stationName <-> technology associations
725
726 field = m_muon_dict->find_field("technology");
727 if (field) {
728 m_MUON_SUBDET_INDEX = field->index();
729 }
730 else {
731 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'technology' field for MuonSpectrometer dictionary");
732 return 1;
733 }
734
735 if (!assignSystemId("MDT", m_MDT_ID)) {
736 return 1;
737 }
738 if (!assignSystemId("RPC", m_RPC_ID)) {
739 return 1;
740 }
741 if (!assignSystemId("TGC", m_TGC_ID)) {
742 return 1;
743 }
744 if (!assignSystemId("STGC", m_STGC_ID, false)) {
745 return 1;
746 }
747 if (!assignSystemId("MM", m_MM_ID, false)) {
748 return 1;
749 }
750 if (!assignSystemId("CSC", m_CSC_ID, false)) {
751 return 1;
752 }
753 }
754
755 // Initialize id for Calo and fields for lvl1 and dead material
756 m_calo_dict = dict_mgr.find_dictionary("Calorimeter");
757 if (!m_calo_dict) {
758 ATH_MSG_WARNING("initLevelsFromDict - Warning cannot access Calorimeter dictionary");
759 } else {
760 // Found calo dict
761 if (!top_dict) {
762 top_dict = m_calo_dict; // save as top_dict
763 }
764 // Set lvl1 field for is_lvl1_trig_towers
765 int value{0};
766 m_lvl1_field.clear();
767 // negative half
768 if (m_calo_dict->get_label_value("DetZside", "negative_lvl1_side", value)) {
769 ATH_MSG_ERROR("initLevelsFromDict - Could not get value for label 'negative_lvl1_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
770 return 1;
771 }
772 m_lvl1_field.add_value(value);
773 // positive half
774 if (m_calo_dict->get_label_value("DetZside", "positive_lvl1_side", value)) {
775 ATH_MSG_ERROR("initLevelsFromDict - Could not get value for label 'positive_lvl1_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
776 return 1;
777 }
778 m_lvl1_field.add_value(value);
779 // Set lar dead material field for is_lar_dm
780 m_lar_dm_field.clear();
781 // negative half
782 if (m_calo_dict->get_label_value("DetZside", "negative_DMLar_side", value)) {
783 ATH_MSG_ERROR("initLevelsFromDict - Could not get value for label 'negative_DMLar_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
784 return 1;
785 }
786 m_lar_dm_field.add_value(value);
787 // positive half
788 if (m_calo_dict->get_label_value("DetZside", "positive_DMLar_side", value)) {
789 ATH_MSG_ERROR("initLevelsFromDict - Could not get value for label 'positive_DMLar_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
790 return 1;
791 }
792 m_lar_dm_field.add_value(value);
793
794 // Set tile dead material field for is_tile_dm
795 m_tile_dm_field.clear();
796 // negative half
797 if (m_calo_dict->get_label_value("DetZside", "negative_DMTile_side", value)) {
798 ATH_MSG_ERROR("initLevelsFromDict - Could not get value for label 'negative_DMTile_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
799 return 1;
800 }
801 m_tile_dm_field.add_value(value);
802 // positive half
803 if (m_calo_dict->get_label_value("DetZside", "positive_DMTile_side", value)) {
804 ATH_MSG_ERROR("initLevelsFromDict - Could not get value for label 'positive_DMTile_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
805 return 1;
806 }
807 m_tile_dm_field.add_value(value);
808
809 // Set lvl1 field for is_lvl1_online
810 m_lvl1_onl_field.clear();
811 if (m_calo_dict->get_label_value("DetZside", "no_side", value)) {
812 ATH_MSG_DEBUG("initLevelsFromDict - Could not get value for label 'no_side' of field 'DetZside' in dictionary " << m_calo_dict->name());
813 } else {
814 m_lvl1_onl_field.add_value(value);
815 }
816 }
817
818 // set det/subdet indices
819 if (top_dict){
820
821 field = top_dict->find_field("subdet");
822 if (field) {
823 m_DET_INDEX = field->index();
824 } else {
825 ATH_MSG_ERROR("initLevelsFromDict - - unable to find 'subdet' field from dict "
826 << top_dict->name());
827 return 1;
828 }
829
830 if (!assignSystemId("InnerDetector", m_INDET_ID)) {
831 return 1;
832 }
833 if (!assignSystemId("ForwardDetectors", m_FWD_ID)) {
834 return 1;
835 }
836 if (!assignSystemId("LArCalorimeter", m_LAR_ID)) {
837 return 1;
838 }
839 if (!assignSystemId("TileCalorimeter", m_TILE_ID)) {
840 return 1;
841 }
842
843 if (!assignSystemId("MuonSpectrometer", m_MUON_ID)) {
844 return 1;
845 }
846 if (!assignSystemId("Calorimeter", m_CALO_ID)) {
847 return 1;
848 }
849 // Get name of next level
850 std::string name{};
851 if (top_dict->name() == "InnerDetector") {
852 name = "part";
853 } else if (top_dict->name() == "Calorimeter") {
854 name = "DetZside";
855 } else if (top_dict->name() == "LArCalorimeter") {
856 name = "part";
857 } else if (top_dict->name() == "MuonSpectrometer") {
858 name = "stationName";
859 } else if (top_dict->name() == "TileCalorimeter") {
860 name = "section";
861 } else if (top_dict->name() == "ForwardDetectors") {
862 name = "part";
863 }
864 // While we're here, save the index to the sub-detector level
865 // ("part" for InDet)
866 field = top_dict->find_field(name);
867 if (field) {
868 m_SUBDET_INDEX = field->index();
869 }
870 else {
871 ATH_MSG_ERROR("initLevelsFromDict - unable to find field " << name << " from dict "<< top_dict->name());
872 return 1;
873 }
874 } else {
875 ATH_MSG_ERROR("initLevelsFromDict - no top dictionary defined");
876 return 1;
877 }
878
879 // Set the field implementations
880
881 size_type region_index = m_helper->pixel_region_index();
882 if (m_indet_dict && AtlasDetectorIDHelper::UNDEFINED != region_index) {
883
884 const IdDictRegion& region = m_indet_dict->region(region_index);
885
886 // Detector
888
889 // Add on extra values to assure that one has a value per
890 // bit. This is needed to avoid an overflow decoding error
891 // when a pixel channel id is decoded
892 if (not m_det_impl.ored_field().isEnumerated()) {
893 ATH_MSG_ERROR("initLevelsFromDict - ERROR det implementation is not enumerated: "
894 << m_det_impl);
895 return 1;
896 }
897
898 size_type bits = m_det_impl.bits();
899 size_type nvalues = static_cast<size_type>(1) << bits;
900 Range::field det = m_det_impl.ored_field();
901 size_type max = det.get_maximum();
902 for (size_type i = det.get_values().size(); i < nvalues; ++i) {
903 ++max;
904 det.add_value(max);
905 }
906 // Replace ored field with modified one
907 m_det_impl.set_ored_field(det);
908 ATH_MSG_VERBOSE("set extra bits "<< m_det_impl);
909
910 // InDet part
912 }
913
914 // Calo side: LVL1, LAr & Tile DeadMat
915 region_index = m_helper->lvl1_region_index();
916 if (m_calo_dict && AtlasDetectorIDHelper::UNDEFINED != region_index) {
917 const IdDictRegion& region = m_calo_dict->region(region_index);
919 }
920
921 // LAr part
922 region_index = m_helper->lar_em_region_index();
923 if (m_lar_dict && AtlasDetectorIDHelper::UNDEFINED != region_index) {
924 const IdDictRegion& region = m_lar_dict->region(region_index);
926 }
927
928 // LAr part
929 region_index = m_helper->lar_fcal_region_index();
930 if (m_lar_dict && AtlasDetectorIDHelper::UNDEFINED != region_index &&
932 const IdDictRegion& region = m_lar_dict->region(region_index);
934 }
935
936 // Muon station name
937 region_index = m_helper->mdt_region_index();
938 if (m_muon_dict && AtlasDetectorIDHelper::UNDEFINED != region_index) {
939 const IdDictRegion& region = m_muon_dict->region(region_index);
941 // Muon MDT
943 // Muon RPC
944 region_index = m_helper->rpc_region_index();
945 if (AtlasDetectorIDHelper::UNDEFINED != region_index) {
946 const IdDictRegion& rpc_region = m_muon_dict->region(region_index);
948 }
949 }
950 return 0;
951}
952
953
956{
957 ExpandedIdentifier result;
958 return (result << m_INDET_ID);
959}
960
963{
964 ExpandedIdentifier result;
965 return (result << m_LAR_ID);
966}
967
970{
971 ExpandedIdentifier result;
972 return (result << m_TILE_ID);
973}
974
977{
978 ExpandedIdentifier result;
979 return (result << m_MUON_ID);
980}
981
984{
985 ExpandedIdentifier result;
986 return (result << m_CALO_ID);
987}
988
991{
992 ExpandedIdentifier result;
993 return (result << m_FWD_ID);
994}
995
998{
1000 return (result << m_PIXEL_ID);
1001}
1002
1005{
1006 ExpandedIdentifier result(indet_exp());
1007 return (result << m_SCT_ID);
1008}
1009
1012{
1013 ExpandedIdentifier result(indet_exp());
1014 return (result << m_TRT_ID);
1015}
1016
1019{
1020 ExpandedIdentifier result(indet_exp());
1021 return (result << m_HGTD_ID);
1022}
1023
1026{
1027 ExpandedIdentifier result(indet_exp());
1028 return (result << m_LUMI_ID);
1029}
1030
1033{
1034 ExpandedIdentifier result(lar_exp());
1035 return (result << m_LAR_EM_ID);
1036}
1037
1040{
1041 ExpandedIdentifier result(lar_exp());
1042 return (result << m_LAR_HEC_ID);
1043}
1044
1047{
1048 ExpandedIdentifier result(lar_exp());
1049 return (result << m_LAR_FCAL_ID);
1050}
1051
1054{
1055 ExpandedIdentifier result(fwd_exp());
1056 return (result << m_ALFA_ID);
1057}
1058
1061{
1062 ExpandedIdentifier result(fwd_exp());
1063 return (result << m_BCM_ID);
1064}
1065
1068{
1069 ExpandedIdentifier result(fwd_exp());
1070 return (result << m_LUCID_ID);
1071}
1072
1075{
1076 ExpandedIdentifier result(fwd_exp());
1077 return (result << m_ZDC_ID);
1078}
1079
1081 if (is_indet(id)) {
1082 return m_indet_dict;
1083 }
1084 if (is_lar(id)) {
1085 return m_lar_dict;
1086 }
1087 if (is_tile(id)) {
1088 return m_tile_dict;
1089 }
1090 if (is_muon(id)) {
1091 return m_muon_dict;
1092 }
1093 if (is_lvl1_trig_towers(id) || is_lvl1_online(id) || is_lar_dm(id) || is_tile_dm(id)) {
1094 return m_calo_dict;
1095 }
1096 if (is_forward(id)) {
1097 return m_fwd_dict;
1098 }
1099 return nullptr;
1100}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(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...
#define max(a, b)
Definition cfImp.cxx:41
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
Identifier lar_hec(void) const
virtual std::string dictionaryVersion(void) const override
Range::field m_lvl1_field
ExpandedIdentifier zdc_exp(void) const
bool m_do_checks
Flag for subclasses to know whether or not to perform checks.
int muon_field_value() const
Identifier hgtd(void) const
Identifier lar_dm(void) const
std::string m_dict_version
bool m_do_neighbours
Flag for subclasses to know whether or not to perform neighbour initialization.
IdDictFieldImplementation m_det_impl
const IdDictDictionary * m_calo_dict
virtual int initialize_from_dictionary(const IdDictMgr &dict_mgr) override
Initialization from the identifier dictionary.
virtual bool do_neighbours(void) const override
Neighbour initialization is performed by default One can switch or query this mode for any idHelper w...
bool is_lar_em(Identifier id) const
Identifier tile(void) const
IdContext detsystem_context(void) const
IdContext (indicates id length) for detector systems.
Range::field m_lar_dm_field
virtual int get_id(const IdentifierHash &hash_id, Identifier &id, const IdContext *context=0) const override
Create compact id from hash id (return == 0 for OK).
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
bool reinitialize(const IdDictMgr &dict_mgr)
Test whether an idhelper should be reinitialized based on the change of tags.
const IdDictDictionary * m_muon_dict
const IdDictDictionary * dictionary(const Identifier &id) const
size_type m_SUBDET_INDEX
IdDictFieldImplementation m_calo_side_impl
ExpandedIdentifier bcm_exp(void) const
ExpandedIdentifier lar_em_exp(void) const
LAr.
ExpandedIdentifier sct_exp(void) const
Identifier trt(void) const
std::vector< std::string > m_dict_names
List of dictionary names used by this helper.
ExpandedIdentifier pixel_exp(void) const
Inner Detector:
Identifier::size_type size_type
bool is_mdt(Identifier id) const
std::string m_group
Group name.
bool is_indet(Identifier id) const
ExpandedIdentifier lar_exp(void) const
virtual void setDictVersion(const IdDictMgr &dict_mgr, const std::string &name) override
Identifier stgc(void) const
ExpandedIdentifier lar_hec_exp(void) const
ExpandedIdentifier muon_exp(void) const
static constexpr int invalidId
IdDictFieldImplementation m_lar_part_impl
int register_dict_tag(const IdDictMgr &dict_mgr, const std::string &dict_name)
Register the file and tag names for a particular IdDict dictionary.
bool is_lar(Identifier id) const
Range::field m_lvl1_onl_field
virtual bool do_checks(void) const override
Checks are performed by default in debug compilation and NOT in optimized compilation.
bool is_stgc(Identifier id) const
IdDictFieldImplementation m_lar_fcal_module_impl
IdDictFieldImplementation m_muon_mdt_impl
bool is_rpc(Identifier id) const
virtual ~AtlasDetectorID()
IdDictFieldImplementation m_indet_part_impl
Identifier mdt(void) const
void show(Identifier id, const IdContext *context=0, char sep='.') const
Short print out of any identifier (optionally provide separation character - default is '.
Identifier lar_lvl1(void) const
bool is_sct(Identifier id) const
static constexpr int invalidIndex
IdDictFieldImplementation m_muon_rpc_impl
ExpandedIdentifier indet_exp(void) const
Detector systems:
ExpandedIdentifier lumi_exp(void) const
bool is_lar_dm(Identifier id) const
LAr/Tile dead material:
int calo_field_value() const
virtual void set_do_checks(bool do_checks) override
std::vector< std::string > m_dict_tags
List of dictionary versions used by this helper.
bool is_tgc(Identifier id) const
size_type m_MUON_SUBDET_INDEX
ExpandedIdentifier lar_fcal_exp(void) const
bool is_lar_fcal(Identifier id) const
bool is_pixel(Identifier id) const
std::string to_range(const ExpandedIdentifier &id) const
bool is_plr(Identifier id) const
const std::vector< std::string > & dict_names(void) const
Dictionary names.
const std::vector< std::string > & dict_tags(void) const
Version tags for subdet dictionaries.
bool is_lvl1_online(Identifier id) const
const std::vector< std::string > & file_names(void) const
File names for subdet dictionaries.
const IdDictDictionary * m_tile_dict
ExpandedIdentifier fwd_exp(void) const
const IdDictDictionary * m_fwd_dict
bool is_muon(Identifier id) const
Identifier mm(void) const
int initLevelsFromDict(const IdDictMgr &dict_mgr)
ExpandedIdentifier trt_exp(void) const
int lar_field_value() const
bool is_hgtd(Identifier id) const
bool is_calo(Identifier id) const
IdContext subdet_context(void) const
IdContext (indicates id length) for sub-detector.
Identifier calo(void) const
bool is_tile_dm(Identifier id) const
std::string show_to_string(Identifier id, const IdContext *context=0, char sep='.') const
or provide the printout in string form
Identifier csc(void) const
bool is_csc(Identifier id) const
Identifier lar(void) const
Identifier sct(void) const
Identifier pixel(void) const
bool is_tile(Identifier id) const
Identifier muon(void) const
ExpandedIdentifier tile_exp(void) const
bool is_lar_minifcal(Identifier id) const
bool is_mm(Identifier id) const
const IdDictDictionary * m_indet_dict
void print(Identifier id, const IdContext *context=0) const
Expanded print out of any identifier.
ExpandedIdentifier lucid_exp(void) const
Identifier lumi(void) const
bool is_forward(Identifier id) const
virtual void set_do_neighbours(bool do_neighbours) override
bool is_lumi(Identifier id) const
ExpandedIdentifier alfa_exp(void) const
Forward.
ExpandedIdentifier hgtd_exp(void) const
int tile_field_value() const
bool is_lar_hec(Identifier id) const
Identifier lar_em(void) const
Identifier rpc(void) const
const IdDictDictionary * m_lar_dict
const std::string & group() const
Group name for this helper.
virtual int get_hash(const Identifier &id, IdentifierHash &hash_id, const IdContext *context=0) const override
Create hash id from compact id (return == 0 for OK).
std::unique_ptr< AtlasDetectorIDHelper > m_helper
Identifier tgc(void) const
Identifier lar_fcal(void) const
bool is_trt(Identifier id) const
ExpandedIdentifier calo_exp(void) const
std::vector< unsigned int > m_muon_tech_bits
Range::field m_tile_dm_field
Identifier indet(void) const
Detector systems:
AtlasDetectorID(const std::string &name, const std::string &group)
bool is_lvl1_trig_towers(Identifier id) const
int indet_field_value() const
Provide efficient access to individual field values, for subclass idhelpers.
IdDictFieldImplementation m_muon_station_name_impl
Identifier tile_dm(void) const
std::vector< std::string > m_file_names
List of dictionary file names used by this helper.
size_type fields() const
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
const std::string & name() const
Dictionary name.
const IdDictField * find_field(const std::string &name) const
IdDictFieldImplementation is used to capture the specification of a single field of an Identifier.
Identifier new_pack(int value) const
void pack(int value, Identifier &id) const
bool do_checks() const
Check whether or not to do checks for ids.
Definition IdDictMgr.cxx:62
bool do_neighbours() const
Check whether or not to init neighbours.
Definition IdDictMgr.cxx:74
const IdDictDictionary * find_dictionary(const std::string &name) const
Access dictionary by name.
const IdDictRegionEntry & entry(size_t i) const
size_t n_entries() const
const IdDictFieldImplementation & implementation(size_t i) const
This is a "hash" representation of an Identifier.
std::string label(const std::string &format, int i)
Definition label.h:19
#define unlikely(x)