ATLAS Offline Software
Loading...
Searching...
No Matches
LArOnlineID.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include "IdDict/IdDictMgr.h"
13#include <cmath>
14#include <set>
15#include <string>
16
17/* See comments in Base class */
18
20 LArOnlineID_Base("LArOnlineID", "LArOnline", false)
21{
22}
23
24
26
27/* =================================================================== */
29/* =================================================================== */
30{
31 ATH_MSG_INFO("initialize_from_dictionary");
32
33 // Check whether this helper should be reinitialized
34 if (!reinitialize(dict_mgr)) {
35 ATH_MSG_DEBUG("Request to reinitialize not satisfied - tags have not changed");
36 return (0);
37 } else {
38 ATH_MSG_DEBUG("(Re)initialize");
39 }
40
41 // init base object
42 if(AtlasDetectorID::initialize_from_dictionary(dict_mgr)) return (1);
43 m_dict = dict_mgr.find_dictionary ("LArCalorimeter");
44 if(!m_dict) {
45 ATH_MSG_ERROR("initialize_from_dictionary - cannot access LArCalorimeter dictionary");
46 return 1;
47 }
48
49 // Register version of the dictionary used
50 if (register_dict_tag(dict_mgr, "LArCalorimeter")) return(1);
51
52 // initialize dictionary version
53 AtlasDetectorID::setDictVersion(dict_mgr, "LArCalorimeter");
54
55 /* Initialize the field indices */
56// if(initLevelsFromDict()) return (1);
58
59
60 /* Find value for the field LAr Calorimeter */
61 const IdDictDictionary* atlasDict = dict_mgr.find_dictionary ("ATLAS");
62 int larField = -1;
63 if (atlasDict->get_label_value("subdet", "LArCalorimeter", larField)) {
64 ATH_MSG_ERROR("Could not get value for label 'LArCalorimeter' of field 'subdet' in dictionary "
65 << atlasDict->name());
66 return (1);
67 }
68
69 /* Find value for the field LArOnline */
70 int larOnlineField = -4;
71 if (m_dict->get_label_value("part", "LArOnline", larOnlineField)) {
72 ATH_MSG_ERROR("Could not get value for label 'LArOnline' of field 'part' in dictionary "
73 << m_dict->name());
74 return (1);
75 }
76
77 /* Find value for the field calibLArOnline */
78 int larOnlineCalibField = -5;
79 if (m_dict->get_label_value("part", "LArOnlineCalib", larOnlineCalibField)) {
80 ATH_MSG_ERROR("Could not get value for label 'LArOnlineCalib' of field 'part' in dictionary "
81 << m_dict->name());
82 return (1);
83 }
84
85 /* Set up id for Region and range prefix */
86 ExpandedIdentifier region_id;
87 region_id.add(larField);
88 region_id.add(larOnlineField);
89 Range prefix;
90
91 /*Full range for all channels*/
92 m_full_laronline_range = m_dict->build_multirange( region_id , group(), prefix);
93 m_full_feb_range = m_dict->build_multirange( region_id , group(), prefix, "slot");
94 m_full_feedthrough_range = m_dict->build_multirange( region_id , group(), prefix, "feedthrough");
95
96 ATH_MSG_DEBUG("initialize_from_dictionary :");
97 ATH_MSG_DEBUG("feedthrough range -> " + (std::string)m_full_feedthrough_range);
98 ATH_MSG_DEBUG("feedthrough slot range -> " + (std::string)m_full_feb_range);
99 ATH_MSG_DEBUG("channel range -> " + (std::string)m_full_laronline_range);
100
101 /* Setup the hash tables */
102 ATH_MSG_DEBUG("[initialize_from_dictionary] version= " << dictionaryVersion());
103
104 if( dictionaryVersion() == "fullAtlas" ) {
105 if(LArOnlineID_Base::init_hashes()) return (1);
106 if(init_calib_hashes()) return (1);
107 }
108 if( dictionaryVersion() == "H8TestBeam" ) {
109 if(init_H8Hashes()) return (1);
110 if(init_calib_hashes()) return (1);
111 }
112 if( dictionaryVersion() == "H6TestBeam" ) {
113 ATH_MSG_DEBUG("[initialze_from_dictionary] ...call init_H6hashes..");
114 if(init_H6Hashes()) return (1);
115 if(init_calib_hashes()) return (1);
116 }
117 ATH_MSG_DEBUG("initialize_from_dictionary -> calibModuleHash= " << m_calibModuleHashMax);
118 ATH_MSG_DEBUG("initialize_from_dictionary -> calibChannelHash= " << m_calibChannelHashMax);
119
120
121 // Setup for hash calculation for channels (febs is further below)
122
123 // Febs have a uniform number of channels
124 // The lookup table only needs to contain the
125 // hash offset for each feb
126
127 // The implementation requires:
128
129 // 1) a lookup table for each feb containing hash offset
130 // 2) a decoder to access the "index" corresponding to the
131 // bec/side/ft/slot fields. These fields use x bits, so the
132 // vector has a length of 2**x.
133
134 /* Create decoder for fields bec to slot */
136 m_bec_impl.bits() +
137 m_side_impl.bits() +
138 m_feedthrough_impl.bits() +
139 m_slot_impl.bits();
140 IdDictFieldImplementation::size_type bits_offset = m_bec_impl.bits_offset();
141 m_bec_slot_impl.set_bits(bits, bits_offset);
142 int size = (1 << bits);
143
144 // Set up vector as lookup table for hash calculation.
145 m_chan_hash_calcs.resize(size);
146
147 for (unsigned int i = 0; i < m_febHashMax; ++i) {
148
149 HWIdentifier febId = feb_Id(i) ;
150
151 HashCalc hc;
152
153 HWIdentifier min = channel_Id ( febId, 0);
154
156 hc.m_hash = min_hash;
158
159 if (m_bec_slot_impl.unpack(min) >= size) {
160 ATH_MSG_DEBUG("Min > " << size);
162 ATH_MSG_DEBUG(" " << m_bec_slot_impl.unpack(min));
163 }
164 }
165
166 // Check channel hash calculation
167 for (unsigned int i = 0; i < m_channelHashMax; ++i) {
168 HWIdentifier id = channel_Id(i);
169 if (channel_Hash(id) != i) {
170 ATH_MSG_ERROR(" ***** Error channel ranges, id, hash, i = " << show_to_string(id));
171 ATH_MSG_ERROR(" , " << channel_Hash(id));
172 ATH_MSG_ERROR(" , " << i);
173 }
174 }
175
176
177
178 // Setup for hash calculation for febs
179
180 // We calculate the feb hash by saving the hash of each
181 // feedthrough in a HashCalc object and then adding on the slot
182 // number for a particular feb
183
184 // The implementation requires:
185
186 // 1) a lookup table for each ft containing hash offset
187 // 2) a decoder to access the "index" corresponding to the
188 // bec/side/ft fields. These fields use x bits, so the
189 // vector has a length of 2**x.
190
191 /* Create decoder for fields bec to ft */
192 bits = m_bec_impl.bits() +
193 m_side_impl.bits() +
194 m_feedthrough_impl.bits();
195 bits_offset = m_bec_impl.bits_offset();
196 m_bec_ft_impl.set_bits(bits, bits_offset);
197 size = (1 << bits);
198
199 // Set up vector as lookup table for hash calculation.
200 m_feb_hash_calcs.resize(size);
201
202 // Get context for conversion to expanded ids
203 IdContext ftContext = feedthroughContext();
204 ExpandedIdentifier ftExpId;
205
206 for (unsigned int i = 0; i < m_feedthroughHashMax; ++i) {
207
209
210 HashCalcFeb hc;
211
212 // Set the hash id for each feedthrough, and then check if one
213 // needs to also save the slot values
215 hc.m_hash = min_hash;
216
217 // For each feedthrough we must check to see if the slot
218 // values are enumerated or not. If they are enumerate we must
219 // save the values in order to calculate the fed hash
220 if (get_expanded_id(min, ftExpId, &ftContext)) {
221 ATH_MSG_WARNING(" ***** Warning cannot get ft expanded id for " << show_to_string(min));
222 }
223 unsigned int nrangesFound = 0;
224 for (unsigned int i = 0; i < m_full_feb_range.size(); ++i) {
225 if (m_full_feb_range[i].match(ftExpId)) {
226 nrangesFound += 1;
227 const Range::field& slotField = m_full_feb_range[i][m_slot_index];
228 if (slotField.isEnumerated()) {
229 // save values
230 hc.m_slot_values = slotField.get_values();
231 }
232 }
233 }
234
235 // Similarly, if there is more than one range per feedthrough,
236 // this means that slot values are not a continuous range. In
237 // this case, as well, we save all possible slot values
238 if (nrangesFound > 1) {
239 for (unsigned int i = 0; i < m_full_feb_range.size(); ++i) {
240 if (m_full_feb_range[i].match(ftExpId)) {
241 const Range::field& slotField = m_full_feb_range[i][m_slot_index];
242 if (slotField.isBounded()) {
243 // save values
244 unsigned int nvalues = slotField.get_maximum() - slotField.get_minimum() + 1;
245 hc.m_slot_values.reserve(std::max(hc.m_slot_values.size()*3/2, hc.m_slot_values.size() + nvalues));
246 for (unsigned int j = 0; j < nvalues; ++j) {
247 hc.m_slot_values.push_back(j + slotField.get_minimum());
248 }
249 }
250 else {
251 ATH_MSG_WARNING(" ***** Warning feb range slot field is NOT both_bounded - id, slot mode: "
252 << show_to_string(min) << " enumerated");
253 }
254 }
255 }
256 }
257
258
259 // Set hash calculator
260 m_feb_hash_calcs[m_bec_ft_impl.unpack(min)] = std::move(hc);
261
262
263 if (m_bec_ft_impl.unpack(min) >= size) {
264 ATH_MSG_DEBUG("Min > " << size << " " <<
265 show_to_string(min) << " " <<
266 std::to_string(m_bec_ft_impl.unpack(min)) << " " <<
267 std::to_string(min_hash));
268 }
269 }
270
271 // Check feb hash calculation
272 for (unsigned int i = 0; i < m_febHashMax; ++i) {
273 HWIdentifier id = feb_Id(i);
274 if (feb_Hash(id) != i) {
275 ATH_MSG_WARNING(" ***** Warning feb ranges, id, hash, i = " <<
276 show_to_string(id) << " , " << std::to_string(feb_Hash(id)) << " , " << i);
277 }
278 }
279
280 return 0;
281}
282
283
284/*========================================*/
286/*========================================*/
287{
288 /* Channel hash */
289 unsigned int nids=0;
290 std::set<HWIdentifier> ids;
291 ATH_MSG_DEBUG("[init_H8hashes] > ChannelId : m_full_laronline_range.size() = " << m_full_laronline_range.size());
292 for (unsigned int i = 0; i < m_full_laronline_range.size(); ++i)
293 {
294 const Range& range = m_full_laronline_range[i];
295 ConstRangeIterator rit(range);
296 for (const auto & exp_id : rit)
297 {
298 HWIdentifier id = this->channel_Id (exp_id[m_bec_index],
299 exp_id[m_side_index],
300 exp_id[m_feedthrough_index],
301 exp_id[m_slot_index],
303 if(!(ids.insert(id)).second)
304 {
305 ATH_MSG_ERROR("init_hashes : duplicated id for channel nb = "+std::to_string(nids));
306 ATH_MSG_ERROR("expanded Id= "+show_to_string(id));
307 }
308 nids++;
309 }
310 }
311 unsigned int nidtb=0;
312 std::set<HWIdentifier>::const_iterator first = ids.begin();
313 std::set<HWIdentifier>::const_iterator last = ids.end();
314 for (;first != last && nidtb < nids; ++first)
315 {
316 if( is_H8(*first) )
317 {
318 m_channel_vec.push_back(*first);
319 nidtb++;
320 }
321 }
323
324
325 /* FEB hash */
326 /*==========*/
327 nids = 0;
328 ids.clear();
329 ATH_MSG_DEBUG("[init_H8hashes] > FebId : m_full_feb_range.size() = " << m_full_feb_range.size());
330 for (unsigned int i = 0; i < m_full_feb_range.size(); ++i)
331 {
332 const Range& range = m_full_feb_range[i];
333 ConstRangeIterator rit(range);
334 for (const auto & exp_id : rit)
335 {
336 HWIdentifier febId = feb_Id( exp_id[m_bec_index],
337 exp_id[m_side_index],
338 exp_id[m_feedthrough_index],
339 exp_id[m_slot_index] );
340 if(!(ids.insert(febId)).second)
341 {
342 ATH_MSG_ERROR("init_hashes: duplicated id for FEB nb = "+std::to_string(nids));
343 ATH_MSG_ERROR("expanded Id= "+show_to_string(febId));
344 }
345 nids++;
346 }
347 }
348 nidtb=0;
349 first = ids.begin();
350 last = ids.end();
351 for (;first != last && nidtb < nids; ++first)
352 {
353 if( is_H8(*first) )
354 {
355 m_feb_vec.push_back(*first);
356 nidtb++;
357 }
358 }
359 m_febHashMax = m_feb_vec.size();
360
361 /* Feedthrough hash */
362 /*=================*/
363 nids = 0;
364 ids.clear();
365 ATH_MSG_DEBUG("[init_H8hashes] FeedthroughId: m_feedthrough_range.size() = " << m_full_feedthrough_range.size());
366 for (unsigned int i = 0; i < m_full_feedthrough_range.size(); ++i)
367 {
368 const Range& range = m_full_feedthrough_range[i];
369 ConstRangeIterator rit(range);
370 for (const auto & exp_id:rit)
371 {
372 HWIdentifier feedthroughId = feedthrough_Id( exp_id[m_bec_index],
373 exp_id[m_side_index],
374 exp_id[m_feedthrough_index] );
375 int test_bec = barrel_ec( feedthroughId);
376 int test_pn = pos_neg( feedthroughId);
377 int test_ft = feedthrough( feedthroughId);
378 ATH_MSG_VERBOSE("[init_H8hashes] in loop : [bec,pn,ft]= [" << test_bec
379 << "," << test_pn << "," << test_ft << "]");
380 if(!(ids.insert(feedthroughId)).second)
381 {
382 ATH_MSG_ERROR("init_hashes : duplicated id for feedthrough nb = "+std::to_string(nids));
383 ATH_MSG_ERROR("expanded Id= "+show_to_string(feedthroughId));
384 }
385 nids++;
386 }
387 }
388 nidtb=0;
389 first = ids.begin();
390 last = ids.end();
391 for (;first != last && nidtb < nids; ++first)
392 {
393 if( is_H8(*first) )
394 {
395 m_feedthrough_vec.push_back(*first);
396 nidtb++;
397 }
398 }
400 ATH_MSG_DEBUG("[init_H8hashes] final m_feedthroughHashMax = " << m_feedthroughHashMax);
401
402 return (0);
403}
404
405
406/*========================================*/
408/*========================================*/
409{
410 unsigned int nids=0;
411 std::set<HWIdentifier> ids;
412 ATH_MSG_DEBUG("[init_H6hashes] : ChannelId : m_full_laronline_range.size() = "
413 << m_full_laronline_range.size());
414 for (unsigned int i = 0; i < m_full_laronline_range.size(); ++i)
415 {
416 const Range& range = m_full_laronline_range[i];
417 ConstRangeIterator rit(range);
418 for (const auto & exp_id:rit)
419 {
420 HWIdentifier id = this->channel_Id (exp_id[m_bec_index],
421 exp_id[m_side_index],
422 exp_id[m_feedthrough_index],
423 exp_id[m_slot_index],
425 if(!(ids.insert(id)).second)
426 {
427 ATH_MSG_ERROR("init_hashes: duplicated id for channel nb = "+std::to_string(nids));
428 ATH_MSG_ERROR("expanded Id= "+show_to_string(id));
429 }
430 nids++;
431 }
432 }
433 unsigned int nidtb=0;
434 std::set<HWIdentifier>::const_iterator first = ids.begin();
435 std::set<HWIdentifier>::const_iterator last = ids.end();
436 for (;first != last && nidtb < nids; ++first)
437 {
438 if( is_H6(*first) )
439 {
440 m_channel_vec.push_back(*first);
441 nidtb++;
442 }
443 }
445
446 /* FEB hash */
447 /*==========*/
448 nids = 0;
449 ids.clear();
450 ATH_MSG_DEBUG("[init_H6hashes] > FebId : m_full_feb_range.size() = " << m_full_feb_range.size());
451 for (unsigned int i = 0; i < m_full_feb_range.size(); ++i)
452 {
453 const Range& range = m_full_feb_range[i];
454 ConstRangeIterator rit(range);
455 for (const auto & exp_id : rit)
456 {
457 HWIdentifier febId = feb_Id( exp_id[m_bec_index],
458 exp_id[m_side_index],
459 exp_id[m_feedthrough_index],
460 exp_id[m_slot_index] );
461 if(!(ids.insert(febId)).second)
462 {
463 ATH_MSG_ERROR("init_hashes : duplicated id for FEB nb = "+std::to_string(nids));
464 ATH_MSG_ERROR("expanded Id= "+show_to_string(febId));
465 }
466 nids++;
467 }
468 }
469 nidtb=0;
470 first = ids.begin();
471 last = ids.end();
472 for (;first != last && nidtb < nids; ++first)
473 {
474 if( is_H6(*first) )
475 {
476 m_feb_vec.push_back(*first);
477 nidtb++;
478 }
479 }
480 m_febHashMax = m_feb_vec.size();
481
482
483 /* Feedthrough hash */
484 /*=================*/
485 nids = 0;
486 ids.clear();
487 // AL-->
488 ATH_MSG_DEBUG("[init_H6hashes] FeedthroughId: m_feedthrough_range.size() = " << m_full_feedthrough_range.size());
489 for (unsigned int i = 0; i < m_full_feedthrough_range.size(); ++i)
490 {
491 const Range& range = m_full_feedthrough_range[i];
492 ConstRangeIterator rit(range);
493 for (const auto & exp_id:rit)
494 {
495 HWIdentifier feedthroughId = feedthrough_Id( exp_id[m_bec_index],
496 exp_id[m_side_index],
497 exp_id[m_feedthrough_index] );
498 ATH_MSG_DEBUG("[init_H6hashes] m_bec_index= " << m_bec_index
499 << "m_side_index= " << m_bec_index
500 << "m_feedthrough_index= " << m_bec_index
501 << "m_slot_index= " << m_bec_index);
502 int test_bec = barrel_ec( feedthroughId);
503 int test_pn = pos_neg( feedthroughId);
504 int test_ft = feedthrough( feedthroughId);
505 ATH_MSG_DEBUG("[init_H6hashes] in loop : [bec,pn,ft]= [" << test_bec
506 << "," << test_pn << "," << test_ft << "]");
507 if(!(ids.insert(feedthroughId)).second)
508 {
509 ATH_MSG_ERROR("init_hashes : duplicated id for feedthrough nb = "+std::to_string(nids));
510 ATH_MSG_ERROR("expanded Id= "+show_to_string(feedthroughId));
511 }
512 nids++;
513 }
514 }
515 nidtb=0;
516 first = ids.begin();
517 last = ids.end();
518 for (;first != last && nidtb < nids; ++first)
519 {
520 if( is_H6FT( *first ))
521 {
522 ATH_MSG_DEBUG("[init_H6hashes] filling m_feedthrough_vec IS-H6 !!");
523 m_feedthrough_vec.push_back(*first);
524 nidtb++;
525 }
526 }
528 ATH_MSG_DEBUG("[init_H6hashes] final m_feedthroughHashMax = " << m_feedthroughHashMax);
529
530 return (0);
531}
532
534/*========================================================*/
535{
536 int ft = feedthrough(id);
537 return ( barrel_ec(id)==1
538 &&
539 ( ft==3 || ft==10 || ft==16 || ft==22 )
540 &&
541 slot(id) > 2 );
542}
543
545 /*======================================================*/
546 //
547 int bec= barrel_ec(id);
548 int ft = feedthrough(id);
549 int sl = slot(id);
550 return (bec==1 && sl<3 && (ft==3 || ft==10 ||
551 ft==16 || ft==22));
552}
553
555 /*======================================================*/
556 //
557 int bec= barrel_ec(id);
558 int ft = feedthrough(id);
559 return (bec==1 &&
560 (ft==0 || ft==1 ||
561 ft==2 || ft==4 ||
562 ft==5 || ft==7 ||
563 ft==8 || ft==9 ||
564 ft==11|| ft==12||
565 ft==13|| ft==14||
566 ft==15|| ft==17||
567 ft==18|| ft==19||
568 ft==20|| ft==21||
569 ft==23|| ft==24 )
570 );
571}
572
574/*========================================================*/
575{/* redefinition with isEMECIW and isEMECOW */
577}
#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)
#define min(a, b)
Definition cfImp.cxx:40
virtual std::string dictionaryVersion(void) const override
virtual int initialize_from_dictionary(const IdDictMgr &dict_mgr) override
Initialization from the identifier dictionary.
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
int register_dict_tag(const IdDictMgr &dict_mgr, const std::string &dict_name)
Register the file and tag names for a particular IdDict dictionary.
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.
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
int get_label_value(const std::string &field, const std::string &label, int &value) const
const std::string & name() const
Dictionary name.
const IdDictDictionary * find_dictionary(const std::string &name) const
Access dictionary by name.
element_type get_minimum() const
Query the values.
bool isEnumerated() const
const element_vector & get_values() const
bool isBounded() const
element_type get_maximum() const
This is a "hash" representation of an Identifier.
Define the Hash identifier for channels and febs.
int feedthrough(const HWIdentifier id) const
Return the feedthrough of a hardware cell identifier : feedthrough = [0,31] Barrel - A/C side or H/...
MultiRange m_full_laronline_range
HWIdentifier feedthrough_Id(int barrel_ec, int pos_neg, int feedthrough) const
Create a feedthrough identifier from fields.
std::vector< HWIdentifier > m_channel_vec
size_type m_calibModuleHashMax
int slot(const HWIdentifier id) const
Return the slot number of a hardware cell identifier: slot = [1,15] Slot-ID in top part of the crat...
const IdDictDictionary * m_dict
size_type m_channel_in_slot_index
size_type m_feedthrough_index
int barrel_ec(const HWIdentifier id) const
Return the position barrel or endcap of a hardware cell identifier: barrel_ec = [0,...
IdentifierHash channel_Hash(HWIdentifier channelId) const
Create channel_hash from channel_Id.
HWIdentifier channel_Id(int barrel_ec, int pos_neg, int feedthrough, int slot, int channel) const
create channel identifier from fields
int get_expanded_id(const HWIdentifier &id, ExpandedIdentifier &exp_id, const IdContext *context) const
create expanded HWIdentifier from HWIdentifier (return == 0 for OK)
IdentifierHash channel_Hash_binary_search(HWIdentifier channelId) const
IdentifierHash feb_Hash_binary_search(HWIdentifier channelId) const
MultiRange m_full_feb_range
IdDictFieldImplementation m_bec_ft_impl
LArOnlineID_Base(const std::string &name, const std::string &group, bool is_slar)
Default constructor.
int pos_neg(const HWIdentifier id) const
Return the side of a hardware cell identifier pos_neg = [0,1] positive-side or negative-side Barrel...
IdDictFieldImplementation m_feedthrough_impl
IdentifierHash feb_Hash(HWIdentifier febId) const
Create feb hash identifiers from feb identifiers.
IdContext feedthroughContext() const
Define context for feedthroughs.
IdDictFieldImplementation m_slot_impl
size_type m_feedthroughHashMax
IdDictFieldImplementation m_side_impl
std::vector< HWIdentifier > m_feb_vec
std::vector< HashCalcFeb > m_feb_hash_calcs
int initLevelsFromDict(const std::string &group_name)
IdDictFieldImplementation m_bec_impl
std::vector< HWIdentifier > m_feedthrough_vec
IdDictFieldImplementation m_bec_slot_impl
HWIdentifier feb_Id(int barrel_ec, int pos_neg, int feedthrough, int slot) const
Create feb_Id from fields.
size_type m_calibChannelHashMax
MultiRange m_full_feedthrough_range
std::vector< HashCalc > m_chan_hash_calcs
bool is_H6FT(const HWIdentifier feedthroughId) const
~LArOnlineID()
Default destructor.
bool isEMECOW(const HWIdentifier id) const override final
LArOnlineID()
Default constructor.
bool isEMECIW(const HWIdentifier id) const override final
int init_H6Hashes()
int init_H8Hashes()
bool is_H8(const HWIdentifier channelId) const
Definition LArOnlineID.h:75
bool isHECchannel(const HWIdentifier id) const override final
int initialize_from_dictionary(const IdDictMgr &) override final
initialization from the identifier dictionary
bool is_H6(const HWIdentifier channelId) const
bool isEMECchannel(const HWIdentifier id) const override final
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition hcg.cxx:357