ATLAS Offline Software
Loading...
Searching...
No Matches
RegionSelectionSvc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// MuonGeoModel
8
9// MuonCalibTools
11
12// MuonCalibIdentifier
14
15// MuonCalibStandAloneBase
20
21// root
22#include "TDirectory.h"
23#include "TFile.h"
24#include "TKey.h"
25#include "TTree.h"
26
27using namespace MuonCalib;
29RegionSelectionSvc ::RegionSelectionSvc(const std::string &name, ISvcLocator *svc_locator) : AthService(name, svc_locator) {}
30
31StatusCode RegionSelectionSvc ::initialize() {
32 ATH_MSG_INFO("initialize RegionSelectionSvc");
33
34 if (!ProcessString(m_region_string)) return StatusCode::FAILURE;
35
36 // detector stre - id to fixed id ...
37 SmartIF<StoreGateSvc> detStore{service("DetectorStore")};
38 ATH_CHECK(detStore.isValid());
39 ATH_MSG_DEBUG("Retrieved DetectorStore");
40 ATH_CHECK(m_idHelperSvc.retrieve());
41 ATH_CHECK(detStore->retrieve(m_detMgr));
42 ATH_CHECK(m_idToFixedIdTool.retrieve());
43 ATH_MSG_INFO("Retrieved " << m_idToFixedIdTool);
44
47
48 return StatusCode::SUCCESS;
49}
50
51bool RegionSelectionSvc ::isInRegion(const MuonCalib::MuonFixedId &id) const { return m_master_region->Result(id); }
52
53const std::string& RegionSelectionSvc ::GetRegionSelection() const { return m_region_string; }
54const std::vector<MuonCalib ::NtupleStationId> &RegionSelectionSvc ::GetStationsInRegions() const { return m_stations_in_region; }
55int RegionSelectionSvc ::AddRegionNtuples(const std::string &infile, TChain *chain) {
56 std::list<std::string> dirnames;
57 return AddRegionNtuples(infile, chain, dirnames);
58}
59int RegionSelectionSvc ::AddRegionNtuples(const std::string &infile, TChain *chain, std::list<std::string> &dirnames) {
60 int n_trees(0);
61 if (dirnames.empty()) {
62 // open file
63 std::unique_ptr<TFile> inf{TFile::Open(infile.c_str(), "READ")};
64 TIter nextkey(inf->GetListOfKeys());
65 TKey *key;
66 // take a list here because erase does not invalidate iterators
67 while ((key = (TKey *)nextkey())) { dirnames.push_back(key->GetName()); }
68 }
69 // loop over found ntuples and selected region
70 for (std::set<MuonCalib::NtupleStationId>::const_iterator it = m_unique_chambers.begin(); it != m_unique_chambers.end(); ++it)
71 for (std::list<std::string>::iterator nt_it = dirnames.begin(); nt_it != dirnames.end(); ++nt_it) {
72 // truncate region name
73 std::string regname(it->regionId(), 0, nt_it->size());
74 if (regname == (*nt_it)) {
75 chain->AddFile(infile.c_str(), TChain::kBigNumber, ((*nt_it) + "/" + "Segments").c_str());
76 std::list<std::string>::iterator new_it = nt_it;
77 --new_it;
78 dirnames.erase(nt_it);
79 nt_it = new_it;
80 ++n_trees;
81 }
82 }
83 return n_trees;
84}
85
86void RegionSelectionSvc ::Print(std::ostream &os) const {
87 if (!m_master_region) {
88 os << "ERROR";
89 return;
90 }
91 m_master_region->Print(os);
92}
93
94void RegionSelectionSvc ::search_chambers_in_region() {
95 MdtIdHelper::const_id_iterator it = m_idHelperSvc->mdtIdHelper().module_begin();
96 MdtIdHelper::const_id_iterator it_end = m_idHelperSvc->mdtIdHelper().module_end();
97 for (; it != it_end; ++it) {
98 const MuonGM::MdtReadoutElement *detEl = m_detMgr->getMdtReadoutElement(m_idHelperSvc->mdtIdHelper().channelID(*it, 1, 1, 1));
99 if (!detEl) continue;
100 // get number of mls;
101 int n_mls = m_idHelperSvc->mdtIdHelper().numberOfMultilayers(*it);
102 // fixed id
103 MuonCalib::MuonFixedId fixed_id(m_idToFixedIdTool->idToFixedId(*it));
104 std::vector<MuonCalib::NtupleStationId> the_ids;
105 for (int i = 1; i <= n_mls; i++) {
106 fixed_id.setMdtMultilayer(i);
107 if (isInRegion(fixed_id)) {
108 NtupleStationId the_id(fixed_id);
109 the_ids.push_back(the_id);
110 }
111 }
112 // all multilayers are in the region - inser the whole station
113 if (static_cast<int>(the_ids.size()) == n_mls) {
114 NtupleStationId full_station(fixed_id);
115 full_station.SetMultilayer(0);
116 m_stations_in_region.push_back(full_station);
117 } else {
118 for (std::vector<MuonCalib::NtupleStationId>::iterator it2 = the_ids.begin(); it2 != the_ids.end(); ++it2) {
119 m_stations_in_region.push_back(*it2);
120 }
121 }
122 }
123 // create a set of chambers (not multilayers)
124 std::vector<int> tower(3);
125 for (std::vector<MuonCalib::NtupleStationId>::iterator it2 = m_stations_in_region.begin(); it2 != m_stations_in_region.end(); ++it2) {
126 MuonCalib::NtupleStationId station(*it2);
127 station.SetMultilayer(0);
128 m_unique_chambers.insert(station);
129 }
130}
131
132bool RegionSelectionSvc ::ProcessString(const std::string &input) {
134 return (m_master_region != nullptr);
135}
136
137void RegionSelectionSvc ::print_list_of_selected_chambers() const {
138 ATH_MSG_INFO("Selected regions: " << m_stations_in_region.size());
139 msg(MSG::INFO) << "Selected regions: ";
140 for (std::vector<MuonCalib::NtupleStationId>::const_iterator it = m_stations_in_region.begin(); it != m_stations_in_region.end();
141 ++it) {
142 msg(MSG::INFO) << " " << it->regionId();
143 }
144 msg(MSG::INFO) << endmsg;
145}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Implements fixed identifiers not dependent upon Athena Identifier for internal use in the calibration...
Definition MuonFixedId.h:50
bool setMdtMultilayer(int num)
Mdt specific: set multilayer to num.
Station Identifier for sorting calibration data.
void SetMultilayer(const int &ml)
static std::unique_ptr< RegionSelectorBase > GetRegion(const std::string &input)
create a region from a string
std::vector< Identifier >::const_iterator const_id_iterator
Gaudi::Property< std::string > m_region_string
region string - job option
void print_list_of_selected_chambers() const
print a list of selected chambers - debug function
bool isInRegion(const MuonCalib::MuonFixedId &id) const
return true if id is in selected region
ToolHandle< MuonCalib::IIdToFixedIdTool > m_idToFixedIdTool
Gaudi::Property< bool > m_print_list_of_selected_chambers
print list of selected chambers if set to true - job option
int AddRegionNtuples(const std::string &infile, TChain *chain)
add region ntuples which are relevant for this region to TChain
const MuonGM::MuonDetectorManager * m_detMgr
std::set< MuonCalib::NtupleStationId > m_unique_chambers
bool ProcessString(const std::string &input)
process string
std::vector< MuonCalib::NtupleStationId > m_stations_in_region
chambers/mutlilayers in calibraition region
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
search for chambers and multilayers in selected region towers in selected region
virtual ~RegionSelectionSvc()
destructor
std::unique_ptr< MuonCalib ::RegionSelectorBase > m_master_region
master region
TStreamerInfo * inf
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
MsgStream & msg
Definition testRead.cxx:32