ATLAS Offline Software
Loading...
Searching...
No Matches
TGCDatabaseASDToPP.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include <fstream>
8#include <sstream>
9
10namespace MuonTGC_Cabling
11{
12
13const int TGCDatabaseASDToPP::IndexIn[NIndexIn] = {0, 1, 6};
14const int TGCDatabaseASDToPP::ReverseIndexIn[DATABASESIZE] = {0, 1, -1, -1, -1, -1, 2, -1};
15const int TGCDatabaseASDToPP::IndexOut[NIndexOut] = {3, 4, 5};
16const int TGCDatabaseASDToPP::ReverseIndexOut[DATABASESIZE] = {-1, -1, -1, 0, 1, 2, -1, -1};
17
18TGCDatabaseASDToPP::TGCDatabaseASDToPP(const std::string& filename,
19 const std::string& blockname,
20 bool v_isCommon)
21 : TGCDatabase(TGCDatabase::ASDToPP, filename, blockname),
22 m_NIndexDBIn(0), m_NIndexDBOut(0), m_isCommon(v_isCommon)
23{
24 for(int iIndexIn=0; iIndexIn<NIndexIn; iIndexIn++) {
25 m_maxIndexIn[iIndexIn] = 0;
26 m_minIndexIn[iIndexIn] = 9999;
27 }
28 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
29 m_maxIndexOut[iIndexOut] = 0;
30 m_minIndexOut[iIndexOut] = 9999;
31 }
32
33 // read out ascii file and fill database
35}
36
50
54
55bool TGCDatabaseASDToPP::update(const std::vector<int>& input)
56{
57 int ip = find(input);
58 if(ip<0) return false;
59
60 int tmpValIndexOut[NIndexOut];
61 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
62 tmpValIndexOut[iIndexOut] = input.at(IndexOut[iIndexOut]);
63 }
64
65 bool over_range = false;
66 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
67 if(m_maxIndexOut[iIndexOut]<tmpValIndexOut[iIndexOut]) {
68 m_maxIndexOut[iIndexOut] = tmpValIndexOut[iIndexOut];
69 over_range = true;
70 }
71 if(m_minIndexOut[iIndexOut]>tmpValIndexOut[iIndexOut]) {
72 m_minIndexOut[iIndexOut] = tmpValIndexOut[iIndexOut];
73 over_range = true;
74 }
75 }
76 if(over_range) {
77 m_indexDBOut.clear();
79 }
80
81 int converted = convertIndexDBOut(tmpValIndexOut);
82 if(converted<0 || converted>=m_NIndexDBOut) return false;
83
84 m_indexDBOut.at(converted) = ip;
85
86 m_database[ip].at(3) = input.at(3);
87 m_database[ip].at(4) = input.at(4);
88 m_database[ip].at(5) = input.at(5);
89
90 return true;
91}
92
93int TGCDatabaseASDToPP::find(const std::vector<int>& channel) const
94{
95 int index=-1;
96 const size_t size = m_database.size();
97 for(size_t i=0; i<size; i++){
98 if(m_database[i].at(2) == channel.at(2) &&
99 m_database[i].at(1) == channel.at(1) &&
100 m_database[i].at(0) == channel.at(0)) {
101 index = i;
102 break;
103 }
104 }
105 return index;
106}
107
108int TGCDatabaseASDToPP::getIndexDBIn(int* indexIn) const
109{
110 if(!indexIn) return -1;
111
112 int converted = convertIndexDBIn(indexIn);
113 if(converted<0 || converted>=m_NIndexDBIn) return -1;
114
115 return m_indexDBIn.at(converted);
116}
117
118void TGCDatabaseASDToPP::getindexDBVectorIn(std::vector<int>& tmpindexDBIn) const
119{
120 tmpindexDBIn = m_indexDBIn;
121}
122
123void TGCDatabaseASDToPP::getNIndexDBIn(int& tmpNIndexDBIn) const
124{
125 tmpNIndexDBIn = m_NIndexDBIn;
126}
127
128void TGCDatabaseASDToPP::getmaxIndexIn(int* tmpmaxIndexIn) const
129{
130 for(int iIndexIn=0; iIndexIn<NIndexIn; iIndexIn++) {
131 tmpmaxIndexIn[iIndexIn] = m_maxIndexIn[iIndexIn];
132 }
133}
134
135void TGCDatabaseASDToPP::getminIndexIn(int* tmpminIndexIn) const
136{
137 for(int iIndexIn=0; iIndexIn<NIndexIn; iIndexIn++) {
138 tmpminIndexIn[iIndexIn] = m_minIndexIn[iIndexIn];
139 }
140}
141
142int TGCDatabaseASDToPP::getIndexDBOut(int* indexOut) const
143{
144 if(!indexOut) return -1;
145
146 int converted = convertIndexDBOut(indexOut);
147 if(converted<0 || converted>=m_NIndexDBOut) return -1;
148
149 return m_indexDBOut.at(converted);
150}
151
152void TGCDatabaseASDToPP::getindexDBVectorOut(std::vector<int>& tmpindexDBOut) const
153{
154 tmpindexDBOut = m_indexDBOut;
155}
156
157void TGCDatabaseASDToPP::getNIndexDBOut(int& tmpNIndexDBOut) const
158{
159 tmpNIndexDBOut = m_NIndexDBOut;
160}
161
162void TGCDatabaseASDToPP::getmaxIndexOut(int* tmpmaxIndexOut) const
163{
164 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
165 tmpmaxIndexOut[iIndexOut] = m_maxIndexOut[iIndexOut];
166 }
167}
168
169void TGCDatabaseASDToPP::getminIndexOut(int* tmpminIndexOut) const
170{
171 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
172 tmpminIndexOut[iIndexOut] = m_minIndexOut[iIndexOut];
173 }
174}
175
177{
178 return m_isCommon;
179}
180
182{
183 std::ifstream file(m_filename.c_str());
184 std::string buf;
185
186 for(int iIndexIn=0; iIndexIn<NIndexIn; iIndexIn++) {
187 m_maxIndexIn[iIndexIn] = 0;
188 m_minIndexIn[iIndexIn] = 9999;
189 }
190 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
191 m_maxIndexOut[iIndexOut] = 0;
192 m_minIndexOut[iIndexOut] = 9999;
193 }
194
195 while(getline(file,buf)){
196 if(buf.substr(0,m_blockname.size())==m_blockname) break;
197 }
198
199 while(getline(file,buf)){
200 if(buf.substr(0,1)=="E"||buf.substr(0,1)=="F") break;
201 std::istringstream line(buf);
202 std::vector<int> entry;
203 for(int i=0; i<DATABASESIZE-2; i++){
204 int temp=-1;
205 line >> temp;
206 entry.push_back(temp);
207 }
208 m_database.push_back(std::move(entry));
209 }
210
211 file.close();
212
213 int nline = 0;
214 const unsigned int database_size = m_database.size();
215 for(unsigned int i=0; i<database_size; i++){
216 // line is defined in whole sector. [0..n]
217 if(i>0&&m_database[i].at(0)!=m_database[i-1].at(0)) nline=0;
218 m_database[i].push_back(nline++);
219
220 if(i==database_size-1||
221 m_database[i].at(0)!=m_database[i+1].at(0)||
222 m_database[i].at(1)!=m_database[i+1].at(1)){
223 // increase with R in chamber [0..n]
224 int totline = m_database[i].at(2)+1;
225 for(int j=0; j<totline; j++){
226 m_database[i-j].push_back(j);
227 }
228 }
229 }
230
231
232 for(unsigned int i=0; i<database_size; i++){
233 for(int j=0; j<DATABASESIZE; j++){
234 int temp = m_database[i].at(j);
235 int k = ReverseIndexOut[j];
236 if(k>=0) {
237 if(m_maxIndexOut[k]<temp) {
238 m_maxIndexOut[k] = temp;
239 }
240 if(m_minIndexOut[k]>temp) {
241 m_minIndexOut[k] = temp;
242 }
243 }
244
245 k = ReverseIndexIn[j];
246 if(k>=0) {
247 if(m_maxIndexIn[k]<temp) {
248 m_maxIndexIn[k] = temp;
249 }
250 if(m_minIndexIn[k]>temp) {
251 m_minIndexIn[k] = temp;
252 }
253 }
254 }
255 }
256
259}
260
262{
263 m_NIndexDBIn = 1;
264 for(int iIndexIn=0; iIndexIn<NIndexIn; iIndexIn++) {
265 m_NIndexDBIn *= (m_maxIndexIn[iIndexIn]-m_minIndexIn[iIndexIn]+1);
266 }
267 for(int iIndexDBIn=0; iIndexDBIn<m_NIndexDBIn; iIndexDBIn++) {
268 m_indexDBIn.push_back(-1);
269 }
270
271 const int size = m_database.size();
272 for(int i=0; i<size; i++) {
273 int tmpValIndexIn[NIndexIn];
274 for(int iIndexIn=0; iIndexIn<NIndexIn; iIndexIn++) {
275 tmpValIndexIn[iIndexIn] = m_database.at(i).at(IndexIn[iIndexIn]);
276 }
277 m_indexDBIn.at(convertIndexDBIn(tmpValIndexIn)) = i;
278 }
279}
280
282{
283 int converted = indexIn[0]-m_minIndexIn[0];
284 for(int iIndexIn=1; iIndexIn<NIndexIn; iIndexIn++) {
285 converted *= (m_maxIndexIn[iIndexIn]-m_minIndexIn[iIndexIn]+1);
286 converted += indexIn[iIndexIn]-m_minIndexIn[iIndexIn];
287 }
288 return converted;
289}
290
292{
293 m_NIndexDBOut = 1;
294 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
295 m_NIndexDBOut *= (m_maxIndexOut[iIndexOut]-m_minIndexOut[iIndexOut]+1);
296 }
297 for(int iIndexDBOut=0; iIndexDBOut<m_NIndexDBOut; iIndexDBOut++) {
298 m_indexDBOut.push_back(-1);
299 }
300
301 const int size = m_database.size();
302 for(int i=0; i<size; i++) {
303 int tmpValIndexOut[NIndexOut];
304 for(int iIndexOut=0; iIndexOut<NIndexOut; iIndexOut++) {
305 tmpValIndexOut[iIndexOut] = m_database.at(i).at(IndexOut[iIndexOut]);
306 }
307 m_indexDBOut.at(convertIndexDBOut(tmpValIndexOut)) = i;
308 }
309}
310
312{
313 int converted = indexOut[0]-m_minIndexOut[0];
314 for(int iIndexOut=1; iIndexOut<NIndexOut; iIndexOut++) {
315 converted *= (m_maxIndexOut[iIndexOut]-m_minIndexOut[iIndexOut]+1);
316 converted += indexOut[iIndexOut]-m_minIndexOut[iIndexOut];
317 }
318 return converted;
319}
320
321} // end of namespace
static const int IndexIn[NIndexIn]
virtual void makeIndexDBIn(void)
Make the IndexDBIn table.
virtual void getindexDBVectorOut(std::vector< int > &tmpindexDBOut) const
Get the IndexDBOut table.
virtual void makeIndexDBOut(void)
Make the IndexDBOut table.
virtual bool update(const std::vector< int > &) override
TGCDatabaseASDToPP(const std::string &filename, const std::string &blockname, bool v_isCommon=true)
Constructor.
bool m_isCommon
This bool variable is used to know the database is common or sector specific.
static const int ReverseIndexIn[DATABASESIZE]
virtual void getNIndexDBOut(int &tmpNIndexDBOut) const
Get the size of the IndexDBOut table.
virtual ~TGCDatabaseASDToPP(void)
Destructor.
virtual void getminIndexOut(int *tmpminIndexOut) const
Get the minimum values of indexOut with NIndexOut dimensions.
virtual int getIndexDBIn(int *indexIn) const override
Get IndexDBIn (position in the databse between 0 and database.size()-1) from indexIn which is NIndexI...
virtual void getNIndexDBIn(int &tmpNIndexDBIn) const
Get the size of the IndexDBIn table.
virtual void getindexDBVectorIn(std::vector< int > &tmpindexDBIn) const
Get the IndexDBIn table.
virtual int getIndexDBOut(int *indexOut) const override
Get IndexDBOut (position in the databse between 0 and database.size()-1) from indexOut which is NInde...
virtual int convertIndexDBIn(int *indexIn) const
Get the interal number, which is between 0 and NIndexDBIn-1.
virtual void getmaxIndexIn(int *tmpmaxIndexIn) const
Get the maximum values of indexIn with NIndexIn dimensions.
bool isCommon() const
This method is used to know the database is common or sector specific.
static const int IndexOut[NIndexOut]
virtual void getmaxIndexOut(int *tmpmaxIndexOut) const
Get the maximum values of indexOut with NIndexOut dimensions.
virtual int convertIndexDBOut(int *indexOut) const
Get the interal number, which is between 0 and NIndexDBOut-1.
static const int ReverseIndexOut[DATABASESIZE]
virtual void getminIndexIn(int *tmpminIndexIn) const
Get the minimum values of indexIn with NIndexIn dimensions.
virtual int find(const std::vector< int > &) const override
std::vector< std::vector< int > > m_database
Definition TGCDatabase.h:54
TGCDatabase(DatabaseType type=NoDatabaseType)
Definition index.py:1
TFile * file