ATLAS Offline Software
Loading...
Searching...
No Matches
CSC_RDOAnalysis.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6#include "CSC_RDOAnalysis.h"
8
9#include "TTree.h"
10#include "TString.h"
11
12#include <algorithm>
13#include <math.h>
14#include <functional>
15#include <iostream>
16
17CSC_RDOAnalysis::CSC_RDOAnalysis(const std::string& name, ISvcLocator *pSvcLocator)
18 : AthAlgorithm(name, pSvcLocator)
19 , m_inputKey("CSCRDO")
20 , m_inputTruthKey("CSC_SDO")
21 , m_collID(0)
22 , m_rodID(0)
23 , m_subID(0)
24 , m_collRpuID(0)
25 , m_dataType(0)
26 , m_smplPhase(0)
27 , m_trigType(0)
28 , m_firstBitSum(0)
29 , m_eventType(0)
30 , m_calAmp(0)
31 , m_calLayer(0)
32 , m_scaAdd(0)
33 , m_numSmpl(0)
34 , m_latency(0)
35 , m_rate(0)
36 , m_sparse(0)
37 , m_neutron(0)
38 , m_calEn(0)
39 , m_spuCt(0)
40 , m_cscRpuID(0)
41 , m_cscID(0)
42 , m_cscTime(0)
43 , m_cscWidth(0)
44 , m_cscTimeComp(0)
45 , m_cscSmpl(0)
46 , m_cscAdd(0)
47 , m_cscHashID(0)
48 , m_sdoID(0)
49 , m_sdoWord(0)
50 , m_barcode(0)
51 , m_eventIndex(0)
52 , m_energy(0)
53 , m_ypos(0)
54 , m_zpos(0)
55 , m_charge(0)
56 , m_barcode_vec(0)
58 , m_energy_vec(0)
59 , m_ypos_vec(0)
60 , m_zpos_vec(0)
61 , m_charge_vec(0)
62
63 , m_h_collID(0)
64 , m_h_rodID(0)
65 , m_h_subID(0)
66 , m_h_collRpuID(0)
67 , m_h_dataType(0)
68 , m_h_spuCt(0)
69 , m_h_cscRpuID(0)
70 , m_h_cscID(0)
71 , m_h_cscTime(0)
72 , m_h_cscWidth(0)
73 , m_h_cscSmpl(0)
74 , m_h_cscAdd(0)
75 , m_h_cscHashID(0)
76 , m_h_sdoID(0)
77 , m_h_sdoWord(0)
78 , m_h_barcode(0)
80 , m_h_energy(0)
81 , m_h_ypos(0)
82 , m_h_zpos(0)
83 , m_h_charge(0)
84
85 , m_tree(0)
86 , m_ntupleFileName("/ntuples/file1")
87 , m_ntupleDirName("/CSC_RDOAnalysis/")
88 , m_ntupleTreeName("CSC_RDOAna")
89 , m_path("/CSC_RDOAnalysis/")
90 , m_thistSvc("THistSvc", name)
91{
92 declareProperty("InputKey", m_inputKey);
93 declareProperty("InputTruthKey", m_inputTruthKey);
94 declareProperty("NtupleFileName", m_ntupleFileName);
95 declareProperty("NtupleDirectoryName", m_ntupleDirName);
96 declareProperty("NtupleTreeName", m_ntupleTreeName);
97 declareProperty("HistPath", m_path);
98}
99
101 ATH_MSG_DEBUG( "Initializing CSC_RDOAnalysis" );
102
103 // This will check that the properties were initialized
104 // properly by job configuration.
105 ATH_CHECK( m_inputKey.initialize() );
106 ATH_CHECK( m_inputTruthKey.initialize() );
107
108 ATH_CHECK(m_thistSvc.retrieve());
109
110 m_tree = new TTree(TString(m_ntupleTreeName), "CSC_RDOAna");
111 std::string fullNtupleName = m_ntupleFileName + m_ntupleDirName + m_ntupleTreeName;
112 ATH_CHECK(m_thistSvc->regTree(fullNtupleName, m_tree));
113 if (m_tree) {
114 m_tree->Branch("collID", &m_collID);
115 m_tree->Branch("rodID", &m_rodID);
116 m_tree->Branch("subID", &m_subID);
117 m_tree->Branch("collRpuID", &m_collRpuID);
118 m_tree->Branch("dataType", &m_dataType);
119 m_tree->Branch("smplPhase", &m_smplPhase);
120 m_tree->Branch("trigType", &m_trigType);
121 m_tree->Branch("firstBitSum", &m_firstBitSum);
122 m_tree->Branch("eventType", &m_eventType);
123 m_tree->Branch("calAmp", &m_calAmp);
124 m_tree->Branch("calLayer", &m_calLayer);
125 m_tree->Branch("scaAdd", &m_scaAdd);
126 m_tree->Branch("numSmpl", &m_numSmpl);
127 m_tree->Branch("latency", &m_latency);
128 m_tree->Branch("rate", &m_rate);
129 m_tree->Branch("sparse", &m_sparse);
130 m_tree->Branch("neutron", &m_neutron);
131 m_tree->Branch("calEn", &m_calEn);
132 m_tree->Branch("spuCt", &m_spuCt);
133 m_tree->Branch("cscRpuID", &m_cscRpuID);
134 m_tree->Branch("cscID", &m_cscID);
135 m_tree->Branch("cscTime", &m_cscTime);
136 m_tree->Branch("cscWidth", &m_cscWidth);
137 m_tree->Branch("cscTimeComp", &m_cscTimeComp);
138 m_tree->Branch("cscSmpl", &m_cscSmpl);
139 m_tree->Branch("cscAdd", &m_cscAdd);
140 m_tree->Branch("cscHashID", &m_cscHashID);
141 m_tree->Branch("sdoID", &m_sdoID);
142 m_tree->Branch("sdoWord", &m_sdoWord);
143 m_tree->Branch("barcode", &m_barcode);
144 m_tree->Branch("eventIndex", &m_eventIndex);
145 m_tree->Branch("energy", &m_energy);
146 m_tree->Branch("ypos", &m_ypos);
147 m_tree->Branch("zpos", &m_zpos);
148 m_tree->Branch("charge", &m_charge);
149 m_tree->Branch("barcode_vec", &m_barcode_vec);
150 m_tree->Branch("eventIndex_vec", &m_eventIndex_vec);
151 m_tree->Branch("energy_vec", &m_energy_vec);
152 m_tree->Branch("ypos_vec", &m_ypos_vec);
153 m_tree->Branch("zpos_vec", &m_zpos_vec);
154 m_tree->Branch("charge_vec", &m_charge_vec);
155 }
156 else {
157 ATH_MSG_ERROR("No tree found!");
158 }
159
160 // HISTOGRAMS
161
162 m_h_collID = new TH1F("h_collID", "Collection ID", 100, 0, 35);
163 m_h_collID->StatOverflows();
164 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_collID->GetName(), m_h_collID));
165
166 m_h_rodID = new TH1F("h_rodID", "Collection ROD ID", 100, 0, 150);
167 m_h_rodID->StatOverflows();
168 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_rodID->GetName(), m_h_rodID));
169
170 m_h_subID = new TH1F("h_subID", "Collection Sub-Detector ID", 100, 0, 110);
171 m_h_subID->StatOverflows();
172 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_subID->GetName(), m_h_subID));
173
174 m_h_collRpuID = new TH1F("h_collRpuID", "Collection RPU ID", 100, 0, 15);
175 m_h_collRpuID->StatOverflows();
176 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_collRpuID->GetName(), m_h_collRpuID));
177
178 m_h_dataType = new TH1F("h_dataType", "Collection data type", 100, 0, 5);
179 m_h_dataType->StatOverflows();
180 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_dataType->GetName(), m_h_dataType));
181
182 m_h_spuCt = new TH1F("h_spuCt", "Collection SPU count", 100, 0, 20);
183 m_h_spuCt->StatOverflows();
184 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_spuCt->GetName(), m_h_spuCt));
185
186 m_h_cscRpuID = new TH1F("h_cscRpuID", "SPU ID of strip", 100, 0, 10);
187 m_h_cscRpuID->StatOverflows();
188 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscRpuID->GetName(), m_h_cscRpuID));
189
190 m_h_cscID = new TH1F("h_cscID", "ID of strip collection", 100, 0, 35);
191 m_h_cscID->StatOverflows();
192 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscID->GetName(), m_h_cscID));
193
194 m_h_cscTime = new TH1F("h_cscTime", "Time of first strip", 100, 0, 10);
195 m_h_cscTime->StatOverflows();
196 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscTime->GetName(), m_h_cscTime));
197
198 m_h_cscWidth = new TH1F("h_cscWidth", "Width of strip cluster", 100, 0, 35);
199 m_h_cscWidth->StatOverflows();
200 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscWidth->GetName(), m_h_cscWidth));
201
202 m_h_cscSmpl = new TH1F("h_cscSmpl", "ADC samples", 100, 0, 4500);
203 m_h_cscSmpl->StatOverflows();
204 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscSmpl->GetName(), m_h_cscSmpl));
205
206 m_h_cscAdd = new TH1F("h_cscAdd", "ID of first strip", 100, 0, 1.5e5);
207 m_h_cscAdd->StatOverflows();
208 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscAdd->GetName(), m_h_cscAdd));
209
210 m_h_cscHashID = new TH1F("h_cscHashID", "hash ID of strip collection", 100, 0, 65000);
211 m_h_cscHashID->StatOverflows();
212 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_cscHashID->GetName(), m_h_cscHashID));
213
214 m_h_sdoID = new TH1F("h_sdoID", "sdoID", 100, 0, 1e19);
215 m_h_sdoID->StatOverflows();
216 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_sdoID->GetName(), m_h_sdoID));
217
218 m_h_sdoWord = new TH1F("h_sdoWord", "sdoWord", 100, 0, 10);
219 m_h_sdoWord->StatOverflows();
220 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_sdoWord->GetName(), m_h_sdoWord));
221
222 m_h_barcode= new TH1F("h_barcode", "Barcode (SDO)", 100, 0, 2.2e9);
223 m_h_barcode->StatOverflows();
224 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_barcode->GetName(), m_h_barcode));
225
226 m_h_eventIndex = new TH1F("h_eventIndex", "Event index (SDO)", 100, 0, 1000);
227 m_h_eventIndex->StatOverflows();
229
230 m_h_energy = new TH1F("h_energy", "Energy (SDO)", 100, 0, 0.3);
231 m_h_energy->StatOverflows();
232 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_energy->GetName(), m_h_energy));
233
234 m_h_ypos = new TH1F("h_ypos", "y-position (SDO)", 100, -1e5, 1e5);
235 m_h_ypos->StatOverflows();
236 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_ypos->GetName(), m_h_ypos));
237
238 m_h_zpos = new TH1F("h_zpos", "z-position (SDO)", 100, -1e5, 1e5);
239 m_h_zpos->StatOverflows();
240 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_zpos->GetName(), m_h_zpos));
241
242 m_h_charge = new TH1F("h_charge", "Charge (SDO)", 100, 0, 1e5);
243 m_h_charge->StatOverflows();
244 ATH_CHECK(m_thistSvc->regHist(m_path + m_h_charge->GetName(), m_h_charge));
245
246 return StatusCode::SUCCESS;
247}
248
250 ATH_MSG_DEBUG( "In CSC_RDOAnalysis::execute()" );
251
252 m_collID->clear();
253 m_rodID->clear();
254 m_subID->clear();
255 m_collRpuID->clear();
256 m_dataType->clear();
257 m_smplPhase->clear();
258 m_trigType->clear();
259 m_firstBitSum->clear();
260 m_eventType->clear();
261 m_calAmp->clear();
262 m_calLayer->clear();
263 m_scaAdd->clear();
264 m_numSmpl->clear();
265 m_latency->clear();
266 m_rate->clear();
267 m_sparse->clear();
268 m_neutron->clear();
269 m_calEn->clear();
270 m_spuCt->clear();
271 m_cscRpuID->clear();
272 m_cscID->clear();
273 m_cscTime->clear();
274 m_cscWidth->clear();
275 m_cscTimeComp->clear();
276 m_cscSmpl->clear();
277 m_cscAdd->clear();
278 m_cscHashID->clear();
279 m_sdoID->clear();
280 m_sdoWord->clear();
281 m_barcode->clear();
282 m_eventIndex->clear();
283 m_energy->clear();
284 m_ypos->clear();
285 m_zpos->clear();
286 m_charge->clear();
287 m_barcode_vec->clear();
288 m_eventIndex_vec->clear();
289 m_energy_vec->clear();
290 m_ypos_vec->clear();
291 m_zpos_vec->clear();
292 m_charge_vec->clear();
293
295 if(p_CSCcont.isValid()) {
296 CscRawDataContainer::const_iterator cscCont_itr(p_CSCcont->begin());
297 const CscRawDataContainer::const_iterator cscCont_end(p_CSCcont->end());
298
299 for ( ; cscCont_itr != cscCont_end; ++cscCont_itr ) {
300
301 const uint16_t collID((*cscCont_itr)->identify());
302 const uint16_t rodID((*cscCont_itr)->rodId());
303 const uint16_t subID((*cscCont_itr)->subDetectorId());
304 const std::vector<uint16_t>& collRpuID = (*cscCont_itr)->rpuID();
305 const std::vector<uint8_t>& dataType = (*cscCont_itr)->dataType();
306
307 m_collID->push_back(collID);
308 m_rodID->push_back(rodID);
309 m_subID->push_back(subID);
310
311 for (std::vector<uint16_t>::size_type i = 0; i != collRpuID.size(); ++i) {
312 m_collRpuID->push_back(collRpuID.at(i));
313 m_h_collRpuID->Fill(collRpuID.at(i));
314 }
315 for (std::vector<uint8_t>::size_type j = 0; j != dataType.size(); ++j) {
316 m_dataType->push_back(dataType.at(j));
317 m_h_dataType->Fill(dataType.at(j));
318 }
319
320 m_smplPhase->push_back((*cscCont_itr)->samplingPhase());
321 m_trigType->push_back((*cscCont_itr)->triggerType());
322 m_firstBitSum->push_back((*cscCont_itr)->firstBitSummary());
323 m_eventType->push_back((*cscCont_itr)->eventType());
324 m_calAmp->push_back((*cscCont_itr)->calAmplitude());
325 m_calLayer->push_back((*cscCont_itr)->calLayer());
326 m_scaAdd->push_back((*cscCont_itr)->scaAddress());
327 m_numSmpl->push_back((*cscCont_itr)->numSamples());
328 m_latency->push_back((*cscCont_itr)->latency());
329 m_rate->push_back((*cscCont_itr)->rate());
330 m_sparse->push_back((*cscCont_itr)->sparsified());
331 m_neutron->push_back((*cscCont_itr)->neutron());
332 m_calEn->push_back((*cscCont_itr)->calEnabled());
333
334 for (unsigned int k = 0; k != 10; ++k) {
335 m_spuCt->push_back((*cscCont_itr)->spuCount(k));
336 m_h_spuCt->Fill((*cscCont_itr)->spuCount(k));
337 }
338
339 m_h_collID->Fill(collID);
340 m_h_rodID->Fill(rodID);
341 m_h_subID->Fill(subID);
342
343 const CscRawDataCollection* p_CSCcoll(*cscCont_itr);
344 CscRawDataCollection::const_iterator csc_itr(p_CSCcoll->begin());
345 const CscRawDataCollection::const_iterator csc_end(p_CSCcoll->end());
346 for ( ; csc_itr != csc_end; ++csc_itr ) {
347
348 const uint16_t cscRpuID((*csc_itr)->rpuID());
349 const uint16_t cscID((*csc_itr)->identify());
350 const uint16_t cscTime((*csc_itr)->time());
351 const uint16_t cscWidth((*csc_itr)->width());
352 const bool cscTimeComp((*csc_itr)->isTimeComputed());
353 const std::vector<uint16_t> cscSmpl_vec((*csc_itr)->samples());
354 const uint32_t cscAdd((*csc_itr)->address());
355 const uint32_t cscHashID((*csc_itr)->hashId());
356
357 m_cscRpuID->push_back(cscRpuID);
358 m_cscID->push_back(cscID);
359 m_cscTime->push_back(cscTime);
360 m_cscWidth->push_back(cscWidth);
361 m_cscTimeComp->push_back(cscTimeComp);
362 m_cscSmpl->push_back(cscSmpl_vec);
363 m_cscAdd->push_back(cscAdd);
364 m_cscHashID->push_back(cscHashID);
365
366 m_h_cscRpuID->Fill(cscRpuID);
367 m_h_cscID->Fill(cscID);
368 m_h_cscTime->Fill(cscTime);
369 m_h_cscWidth->Fill(cscWidth);
370 for (std::vector<uint16_t>::size_type l = 0; l != cscSmpl_vec.size(); ++l) {
371 m_h_cscSmpl->Fill(cscSmpl_vec.at(l));
372 }
373 m_h_cscAdd->Fill(cscAdd);
374 m_h_cscHashID->Fill(cscHashID);
375 }
376 }
377 }
378
379 // SimData
381 if(simDataMapCSC.isValid()) {
382 CscSimDataCollection::const_iterator sdo_itr(simDataMapCSC->begin());
383 const CscSimDataCollection::const_iterator sdo_end(simDataMapCSC->end());
384
385 std::vector<int> barcode_vec;
386 std::vector<int> eventIndex_vec;
387 std::vector<float> energy_vec;
388 std::vector<float> ypos_vec;
389 std::vector<float> zpos_vec;
390 std::vector<float> charge_vec;
391 for ( ; sdo_itr != sdo_end; ++sdo_itr ) {
392 const Identifier sdoID((*sdo_itr).first);
393 const CscSimData& sdo((*sdo_itr).second);
394
395 const unsigned long long sdoID_int = sdoID.get_compact();
396 const int sdoWord(sdo.word());
397
398 m_sdoID->push_back(sdoID_int);
399 m_sdoWord->push_back(sdoWord);
400
401 // loop over deposits
402 const std::vector<CscSimData::Deposit>& deposits = sdo.getdeposits();
403 std::vector<CscSimData::Deposit>::const_iterator dep_itr(deposits.begin());
404 const std::vector<CscSimData::Deposit>::const_iterator dep_end(deposits.end());
405 for ( ; dep_itr != dep_end; ++dep_itr ) {
406 const HepMcParticleLink& particleLink = (*dep_itr).first;
407 const int bar(HepMC::barcode(particleLink)); // FIXME barcode-based
408 const int eventIx(particleLink.eventIndex());
409 const CscMcData& data = (*dep_itr).second;
410 const float sdoEnergy(data.energy());
411 const float sdoYpos(data.ypos());
412 const float sdoZpos(data.zpos());
413 const float sdoCharge(data.charge());
414
415 m_barcode->push_back(bar);
416 m_eventIndex->push_back(eventIx);
417 m_energy->push_back(sdoEnergy);
418 m_ypos->push_back(sdoYpos);
419 m_zpos->push_back(sdoZpos);
420 m_charge->push_back(sdoCharge);
421
422 m_h_barcode->Fill(bar);
423 m_h_eventIndex->Fill(eventIx);
424 m_h_energy->Fill(sdoEnergy);
425 m_h_ypos->Fill(sdoYpos);
426 m_h_zpos->Fill(sdoZpos);
427 m_h_charge->Fill(sdoCharge);
428
429 barcode_vec.push_back(bar);
430 eventIndex_vec.push_back(eventIx);
431 energy_vec.push_back(sdoEnergy);
432 ypos_vec.push_back(sdoYpos);
433 zpos_vec.push_back(sdoZpos);
434 charge_vec.push_back(sdoCharge);
435 }
436 m_barcode_vec->push_back(barcode_vec);
437 m_eventIndex_vec->push_back(eventIndex_vec);
438 m_energy_vec->push_back(energy_vec);
439 m_ypos_vec->push_back(ypos_vec);
440 m_zpos_vec->push_back(zpos_vec);
441 m_charge_vec->push_back(charge_vec);
442 barcode_vec.clear();
443 eventIndex_vec.clear();
444 energy_vec.clear();
445 ypos_vec.clear();
446 zpos_vec.clear();
447 charge_vec.clear();
448 }
449 }
450
451 if (m_tree) {
452 m_tree->Fill();
453 }
454
455 return StatusCode::SUCCESS;
456}
457
459 return StatusCode::SUCCESS;
460}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Handle class for reading from StoreGate.
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
std::vector< uint32_t > * m_scaAdd
std::vector< bool > * m_smplPhase
virtual StatusCode initialize() override final
std::vector< uint32_t > * m_cscHashID
std::string m_ntupleFileName
std::vector< bool > * m_sparse
virtual StatusCode finalize() override final
std::vector< std::vector< int > > * m_barcode_vec
std::vector< uint16_t > * m_subID
std::string m_ntupleTreeName
std::vector< int > * m_eventIndex
std::vector< std::vector< uint16_t > > * m_cscSmpl
SG::ReadHandleKey< CscRawDataContainer > m_inputKey
std::vector< std::vector< int > > * m_eventIndex_vec
std::vector< uint16_t > * m_cscWidth
std::vector< std::vector< float > > * m_charge_vec
std::vector< uint16_t > * m_collRpuID
std::vector< uint16_t > * m_spuCt
std::vector< std::vector< float > > * m_zpos_vec
std::vector< uint16_t > * m_numSmpl
std::vector< uint8_t > * m_rate
CSC_RDOAnalysis(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< uint32_t > * m_eventType
std::vector< uint8_t > * m_dataType
std::vector< uint16_t > * m_cscID
std::vector< int > * m_barcode
std::vector< uint16_t > * m_latency
std::vector< uint8_t > * m_firstBitSum
std::vector< uint8_t > * m_calAmp
std::vector< uint32_t > * m_cscAdd
std::string m_ntupleDirName
SG::ReadHandleKey< CscSimDataCollection > m_inputTruthKey
std::vector< std::vector< float > > * m_ypos_vec
std::vector< uint16_t > * m_cscTime
std::vector< uint16_t > * m_rodID
virtual StatusCode execute() override final
std::vector< int > * m_sdoWord
std::vector< uint16_t > * m_collID
ServiceHandle< ITHistSvc > m_thistSvc
std::vector< float > * m_charge
std::vector< uint8_t > * m_calLayer
std::vector< uint16_t > * m_cscRpuID
std::vector< float > * m_zpos
std::vector< bool > * m_cscTimeComp
std::vector< float > * m_ypos
std::vector< bool > * m_neutron
std::vector< bool > * m_calEn
std::vector< bool > * m_trigType
std::vector< unsigned long long > * m_sdoID
std::vector< float > * m_energy
std::vector< std::vector< float > > * m_energy_vec
Collection of CSC Raw Hits, arranged according to CSC Detector Elements Author: Ketevi A.
int word() const
Definition CscSimData.h:63
const std::vector< Deposit > & getdeposits() const
Definition CscSimData.h:67
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
value_type get_compact() const
Get the compact id.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
int barcode(const T *p)
Definition Barcode.h:16