ATLAS Offline Software
Loading...
Searching...
No Matches
LArHVPathologyDbAlg.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
10
16
25#include "LArHV/HECHVSubgap.h"
27#include "LArHV/FCALHVLine.h"
28#include "GaudiKernel/ThreadLocalContext.h"
29
30#include <fstream>
31#include <cstdlib>
32
34#include "CoralBase/Blob.h"
35
36#include "TBufferFile.h"
37#include "TClass.h"
38
39
41{
42 ATH_MSG_INFO(" in initialize()");
43
44 if(m_writeCondObjs && m_folder.value().empty()) {
45 ATH_MSG_ERROR("Folder property not set. Exiting ... ");
46 return StatusCode::FAILURE;
47 }
48
49 // Get HVPathology tool
50 //ATH_CHECK(m_pathologyTool.retrieve());
51
52 // retrieve LArEM id helpers
53 ATH_CHECK(detStore()->retrieve(m_caloIdMgr));
54
55 m_larem_id = m_caloIdMgr->getEM_ID();
56 m_larhec_id = m_caloIdMgr->getHEC_ID();
57 m_larfcal_id = m_caloIdMgr->getFCAL_ID();
58
59 ATH_CHECK(detStore()->retrieve(m_laronline_id,"LArOnlineID"));
60
61 ATH_CHECK( m_hvCablingKey.initialize() );
62 ATH_CHECK( m_cablingKey.initialize() );
63 ATH_CHECK( m_caloMgrKey.initialize() );
65
66 return StatusCode::SUCCESS;
67}
68
70{
71 ATH_MSG_INFO(" in execute()");
72
73 const EventContext& ctx = Gaudi::Hive::currentContext();
74
75 int nevt = ctx.eventID().event_number();
76 if (nevt!=1) return StatusCode::SUCCESS;
77
78
80 ATH_CHECK(caloMgrHandle.isValid());
81 const CaloDetDescrManager* calodetdescrmgr = *caloMgrHandle;
82
83
84 const std::vector<LArHVPathologiesDb::LArHVElectPathologyDb>* pathologyContainer=nullptr;
85 if(m_writeCondObjs) {
86 ATH_MSG_INFO("Creating conditions objects");
87
88 // Create cond objects
89 auto pathologies=createCondObjects(ctx,calodetdescrmgr);
90 if(!pathologies) {
91 ATH_MSG_ERROR("Could not create cond objects ");
92 m_writeCondObjs = false;
93 return StatusCode::FAILURE;
94 }
95 pathologyContainer=&(pathologies->m_v);
96 std::unique_ptr<AthenaAttributeList> attrlist = hvPathology2AttrList(*pathologies);
97 ATH_MSG_INFO("Created Attribute List");
98 coral::Blob& blob=(*attrlist)["Constants"].data<coral::Blob>();
99 ATH_MSG_DEBUG("Blob size=" << blob.size());
100 StatusCode sc = detStore()->record(std::move(attrlist),m_folder.value());
101 if(!sc.isSuccess()) {
102 ATH_MSG_ERROR("Could not record " << m_folder.value());
103 return sc;
104 }
105 else
106 ATH_MSG_INFO("Recorded " << m_folder.value());
107 }
108 // Dump cond objects
109 ATH_CHECK(printCondObjects (ctx,calodetdescrmgr,pathologyContainer));
110 return StatusCode::SUCCESS;
111}
112
113
114std::optional<LArHVPathologiesDb> LArHVPathologyDbAlg::createCondObjects (const EventContext & ctx, const CaloDetDescrManager* calodetdescrmgr) const
115{
116 ATH_MSG_INFO(" in createCondObjects() ");
117
119
121 const LArOnOffIdMapping *cabling = *cabHdl;
122 if(!cabling) {
123 ATH_MSG_ERROR("Do not have cabling object with key " << m_cablingKey.key());
124 return std::nullopt;
125 }
126 // Read input file and construct LArHVPathologiesDb for given folder
127 std::ifstream infile;
128 infile.open(m_inpFile.value().c_str());
129
130 if(!infile.is_open()) {
131 ATH_MSG_ERROR("Unable to open " << m_inpFile << " for reading");
132 return std::nullopt;
133 }
134
135 char checkChar;
136 char commentSign('#');
137 std::string commentLine(""), foldername("");
138 unsigned int cellID;
139 unsigned short electInd, pathologyType;
140
141 // Look for the folder name in the file
142 while(!infile.eof()) {
143 infile >> foldername;
144 if(foldername==m_folder.value())
145 break;
146 }
147
148 if(foldername!=m_folder.value()) {
149 ATH_MSG_ERROR("Unable to find data for the folder " << m_folder.value()
150 << " in the input file");
151 return std::nullopt;
152 }
153 else
154 ATH_MSG_INFO("Found folder " << foldername << " in the input file");
155
156 // Get data corresponding to the folder and put it into LArHVPathologiesDb object
157 LArHVPathologiesDb pathologies;
158
159 ATH_MSG_INFO(" start reading input file ");
160 while(!infile.eof()) {
161 // Number or string?
162 checkChar = static_cast<char> (infile.get());
163 if(checkChar=='\n')
164 continue;
165 if((checkChar >= '0') && (checkChar <= '9')) {
166 // Number - read three values
167 infile.unget();
168 std::vector<unsigned int> elecList;
169 elecList.reserve(2);
170 if (m_mode==0) {
171 infile >> cellID >> electInd >> pathologyType;
172 elecList.push_back(electInd);
173 } else {
174 unsigned int bec,pos_neg,FT,slot,channel,hvModule,hvLine;
175 infile >> bec >> pos_neg >> FT >> slot >> channel >> hvModule >> hvLine >> pathologyType;
176 ATH_MSG_INFO(" read " << bec << " " << pos_neg << " " << FT << " " << slot << " " << channel << " " << hvModule << " " << hvLine << " " << pathologyType);
177 HWIdentifier hwid = m_laronline_id->channel_Id(bec,pos_neg,FT,slot,channel);
178 Identifier id = cabling->cnvToIdentifier( hwid);
179 cellID = (unsigned int)(id.get_identifier32().get_compact());
180 elecList=getElectInd(**hvIdMapping, id,hvModule,hvLine,calodetdescrmgr);
181 ATH_MSG_INFO(" cellId , elecList size " << cellID << " " << elecList.size());
182 }
183 for (unsigned int i=0;i<elecList.size();i++) {
185 electPath.cellID = cellID;
186 electPath.electInd = elecList[i];
187 if(m_mode==2) electPath.pathologyType = ((pathologyType&0x0FFF)<<4);
188 else electPath.pathologyType = pathologyType;
189 pathologies.m_v.push_back(electPath);
190 ATH_MSG_INFO("Created electrode pathology (" << cellID
191 << "," << elecList[i]
192 << "," << pathologyType << ")");
193 }
194 }
195 else if(checkChar==commentSign) {
196 // Skip the comment
197 std::getline(infile,commentLine);
198 }
199 else {
200 // We found another folder. Stop parsing
201 break;
202 }
203 }
204
205 infile.close();
206 ATH_MSG_INFO("Finished parsing input file");
207 return std::make_optional<LArHVPathologiesDb>(pathologies);
208}
209
210StatusCode LArHVPathologyDbAlg::printCondObjects (const EventContext& ctx, const CaloDetDescrManager* calodetdescrmgr,
211 const std::vector<LArHVPathologiesDb::LArHVElectPathologyDb>* pathologyContainer) const
212{
213 ATH_MSG_INFO(" in printCondObjects() ");
214
217 const LArOnOffIdMapping *cabling = *cabHdl;
218 if(!cabling) {
219 ATH_MSG_ERROR("Do not have cabling object with key " << m_cablingKey.key());
220 return StatusCode::FAILURE;
221 }
222
223 std::ofstream *fout=nullptr;
224 if (!m_hvPathologyKey.empty() && pathologyContainer==nullptr) {
226 pathologyContainer=&(pathHdl->getPathology());
227 }
228 if (!pathologyContainer) {
229 ATH_MSG_WARNING("No input data ");
230
231 return StatusCode::SUCCESS;
232 }
233
234 else {
235 if(!m_outFile.value().empty()) {
236 fout = new std::ofstream(m_outFile.value().c_str());
237 if((!fout) || (fout && !(fout->good()))) {
238 ATH_MSG_WARNING("Could not open output file: " << m_outFile.value());
239 fout=nullptr;
240 }
241 if(fout) *fout<<m_folder.value()<<std::endl;
242 }
243 for (const LArHVPathologiesDb::LArHVElectPathologyDb& electPath : *pathologyContainer) {
244 if(m_mode==0) {
245 ATH_MSG_INFO("Got pathology for cell ID: " << electPath.cellID
246 << "(" << electPath.electInd
247 << "," << electPath.pathologyType << ") ");
248 if(fout) *fout<<electPath.cellID<<"\t"<<electPath.electInd<<"\t"<<electPath.pathologyType<<std::endl;
249 } else {
250 ATH_MSG_INFO("Got pathology for cell ID: " << electPath.cellID);
251 HWIdentifier hwid = cabling->createSignalChannelID(Identifier32(electPath.cellID));
252 int HVLine=getHVline(**hvIdMapping,Identifier(electPath.cellID),electPath.electInd,calodetdescrmgr);
253 if(HVLine<0) {
254 ATH_MSG_ERROR("No HVline for cell "<<electPath.cellID);
255 } else {
256 int hvmodule=HVLine/1000;
257 int hvline=HVLine%1000;
258 if(m_mode==1) {
259 ATH_MSG_INFO(m_laronline_id->barrel_ec(hwid) << " " << m_laronline_id->pos_neg(hwid) << " " << m_laronline_id->feedthrough(hwid) << " " << m_laronline_id->slot(hwid) << " " << m_laronline_id->channel(hwid) << " " << hvmodule << " " << hvline << " " << electPath.pathologyType);
260 if(fout) *fout << m_laronline_id->barrel_ec(hwid) << " " << m_laronline_id->pos_neg(hwid) << " " << m_laronline_id->feedthrough(hwid) << " " << m_laronline_id->slot(hwid) << " " << m_laronline_id->channel(hwid) << " " << hvmodule << " " << hvline << " " << electPath.pathologyType << std::endl;
261 } else if (m_mode==2){
262 ATH_MSG_INFO(m_laronline_id->barrel_ec(hwid) << " " << m_laronline_id->pos_neg(hwid) << " " << m_laronline_id->feedthrough(hwid) << " " << m_laronline_id->slot(hwid) << " " << m_laronline_id->channel(hwid) << " " << hvmodule << " " << hvline << " " << ((electPath.pathologyType&0xFF0)>>4));
263 if(fout) *fout << m_laronline_id->barrel_ec(hwid) << " " << m_laronline_id->pos_neg(hwid) << " " << m_laronline_id->feedthrough(hwid) << " " << m_laronline_id->slot(hwid) << " " << m_laronline_id->channel(hwid) << " " << hvmodule << " " << hvline << " " << ((electPath.pathologyType&0xFFF0)>>4) << std::endl;
264
265 }
266 }
267 }
268 }
269 }
270 if(fout) fout->close();
271 return StatusCode::SUCCESS;
272}
273
274std::vector<unsigned int>
276 const Identifier & id,
277 unsigned int module,
278 unsigned int line,
279 const CaloDetDescrManager* calodetdescrmgr) const
280{
281
282 std::vector<unsigned int> list;
283 int HVline = 1000*module + line;
284// EM calo
285 if (m_larem_id->is_lar_em(id)) {
286// LAr EMB
287 if (abs(m_larem_id->barrel_ec(id))==1 && m_larem_id->sampling(id) > 0) {
288 if (const EMBDetectorElement* embElement = dynamic_cast<const EMBDetectorElement*>(calodetdescrmgr->get_element(id))) {
289 const EMBCellConstLink cell = embElement->getEMBCell();
290 unsigned int nelec = cell->getNumElectrodes();
291 for (unsigned int i=0;i<nelec;i++) {
292 const EMBHVElectrode& electrode = cell->getElectrode(i);
293 for (unsigned int igap=0;igap<2;igap++) {
294 if (electrode.hvLineNo(igap, &hvIdMapping)==HVline) {
295 list.push_back(2*i+igap);
296 }
297 }
298 }
299 }
300 }
301// LAr EMEC
302 if (abs(m_larem_id->barrel_ec(id))>1 && m_larem_id->sampling(id) > 0) {
303 if (const EMECDetectorElement* emecElement = dynamic_cast<const EMECDetectorElement*>(calodetdescrmgr->get_element(id))) {
304 const EMECCellConstLink cell = emecElement->getEMECCell();
305 unsigned int nelec = cell->getNumElectrodes();
306 for (unsigned int i=0;i<nelec;i++) {
307 const EMECHVElectrode& electrode = cell->getElectrode(i);
308 for (unsigned int igap=0;igap<2;igap++) {
309 if (electrode.hvLineNo(igap, &hvIdMapping)==HVline) {
310 list.push_back(2*i+igap);
311 }
312 }
313 }
314 }
315 }
316// EMBPS
317 if (abs(m_larem_id->barrel_ec(id))==1 && m_larem_id->sampling(id)==0) {
318 if (const EMBDetectorElement* embElement = dynamic_cast<const EMBDetectorElement*>(calodetdescrmgr->get_element(id))) {
319 const EMBCellConstLink cell = embElement->getEMBCell();
320 const EMBPresamplerHVModule& hvmodule = cell->getPresamplerHVModule ();
321 for (unsigned int igap=0;igap<2;igap++) {
322 if (hvmodule.hvLineNo(igap, &hvIdMapping)==HVline) {
323 list.push_back(igap);
324 }
325 }
326 }
327 }
328// EMECPS
329 if (abs(m_larem_id->barrel_ec(id))>1 && m_larem_id->sampling(id)==0) {
330 if (const EMECDetectorElement* emecElement = dynamic_cast<const EMECDetectorElement*>(calodetdescrmgr->get_element(id))) {
331 const EMECCellConstLink cell = emecElement->getEMECCell();
332 const EMECPresamplerHVModule& hvmodule = cell->getPresamplerHVModule ();
333 for (unsigned int igap=0;igap<2;igap++) {
334 if (hvmodule.hvLineNo(igap, &hvIdMapping)==HVline) {
335 list.push_back(igap);
336 }
337 }
338 }
339 }
340 }
341//HEC
342 if (m_larhec_id->is_lar_hec(id)) {
343 if (const HECDetectorElement* hecElement = dynamic_cast<const HECDetectorElement*>(calodetdescrmgr->get_element(id))) {
344 const HECCellConstLink cell = hecElement->getHECCell();
345 unsigned int nsubgaps = cell->getNumSubgaps();
346 for (unsigned int i=0;i<nsubgaps;i++) {
347 const HECHVSubgap& subgap = cell->getSubgap(i);
348 if (subgap.hvLineNo(&hvIdMapping)==HVline) {
349 list.push_back(i);
350 }
351 }
352 }
353 }
354//FCAL
355 if (m_larfcal_id->is_lar_fcal(id)) {
356 if (const FCALDetectorElement* fcalElement = dynamic_cast<const FCALDetectorElement*>(calodetdescrmgr->get_element(id))) {
357 const FCALTile* tile = fcalElement->getFCALTile();
358 unsigned int nlines = FCALTile::getNumHVLines();
359 for (unsigned int i=0;i<nlines;i++) {
360 const FCALHVLine* line2 = tile->getHVLine(i);
361 if(line2) {
362 if (line2->hvLineNo(&hvIdMapping)==HVline) {
363 list.push_back(i);
364 }
365 }
366 }
367 }
368 }
369
370 return list;
371
372}
373
375 const Identifier & id,
376 short unsigned int ElectInd,
377 const CaloDetDescrManager* calodetdescrmgr) const
378{
379
380 unsigned int igap, ielec;
381// EM calo
382 if (m_larem_id->is_lar_em(id)) {
383// LAr EMB
384 if (abs(m_larem_id->barrel_ec(id))==1 && m_larem_id->sampling(id) > 0) {
385 if (const EMBDetectorElement* embElement = dynamic_cast<const EMBDetectorElement*>(calodetdescrmgr->get_element(id))) {
386 const EMBCellConstLink cell = embElement->getEMBCell();
387 unsigned int nelec = cell->getNumElectrodes();
388 igap = ElectInd % 2;
389 ielec = std::div(ElectInd - igap, 2).quot;
390 if (ielec > nelec) {
391 ATH_MSG_ERROR("Wrong electrode number " << ielec << " for cell "<< id.get_identifier32().get_compact());
392 return -1;
393 } else {
394 return cell->getElectrode(ielec).hvLineNo(igap, &hvIdMapping);
395 }
396 }
397 }
398// LAr EMEC
399 if (abs(m_larem_id->barrel_ec(id))>1 && m_larem_id->sampling(id) > 0) {
400 if (const EMECDetectorElement* emecElement = dynamic_cast<const EMECDetectorElement*>(calodetdescrmgr->get_element(id))) {
401 const EMECCellConstLink cell = emecElement->getEMECCell();
402 unsigned int nelec = cell->getNumElectrodes();
403 igap = ElectInd % 2;
404 ielec = std::div(ElectInd - igap, 2).quot;
405 if (ielec > nelec) {
406 ATH_MSG_ERROR("Wrong electrode number " << ielec << " for cell "<< id.get_identifier32().get_compact());
407 return -1;
408 } else {
409 return cell->getElectrode(ielec).hvLineNo(igap, &hvIdMapping);
410 }
411 }
412 }
413// EMBPS
414 if (abs(m_larem_id->barrel_ec(id))==1 && m_larem_id->sampling(id)==0) {
415 if (const EMBDetectorElement* embElement = dynamic_cast<const EMBDetectorElement*>(calodetdescrmgr->get_element(id))) {
416 const EMBCellConstLink cell = embElement->getEMBCell();
417 const EMBPresamplerHVModule& hvmodule = cell->getPresamplerHVModule ();
418 if(ElectInd >= 2) {
419 ATH_MSG_ERROR("Wrong igap "<<ElectInd<<" for EMBPS cell "<<id.get_identifier32().get_compact());
420 return -1;
421 } else {
422 return hvmodule.hvLineNo(ElectInd, &hvIdMapping);
423 }
424 }
425 }
426// EMECPS
427 if (abs(m_larem_id->barrel_ec(id))>1 && m_larem_id->sampling(id)==0) {
428 if (const EMECDetectorElement* emecElement = dynamic_cast<const EMECDetectorElement*>(calodetdescrmgr->get_element(id))) {
429 const EMECCellConstLink cell = emecElement->getEMECCell();
430 const EMECPresamplerHVModule& hvmodule = cell->getPresamplerHVModule ();
431 if(ElectInd >= 2) {
432 ATH_MSG_ERROR("Wrong igap "<<ElectInd<<" for EMECPS cell "<<id.get_identifier32().get_compact());
433 return -1;
434 } else {
435 return hvmodule.hvLineNo(ElectInd, &hvIdMapping);
436 }
437 }
438 }
439 }
440//HEC
441 if (m_larhec_id->is_lar_hec(id)) {
442 if (const HECDetectorElement* hecElement = dynamic_cast<const HECDetectorElement*>(calodetdescrmgr->get_element(id))) {
443 const HECCellConstLink cell = hecElement->getHECCell();
444 unsigned int nsubgaps = cell->getNumSubgaps();
445 if( ElectInd >= nsubgaps) {
446 ATH_MSG_ERROR("Wrong igap "<<ElectInd<<" for HEC cell "<<id.get_identifier32().get_compact());
447 return -1;
448 } else {
449 return cell->getSubgap(ElectInd).hvLineNo(&hvIdMapping);
450 }
451 }
452 }
453//FCAL
454 if (m_larfcal_id->is_lar_fcal(id)) {
455 if (const FCALDetectorElement* fcalElement = dynamic_cast<const FCALDetectorElement*>(calodetdescrmgr->get_element(id))) {
456 const FCALTile* tile = fcalElement->getFCALTile();
457 unsigned int nlines = FCALTile::getNumHVLines();
458 if( ElectInd >= nlines) {
459 ATH_MSG_ERROR("Wrong line "<<ElectInd<<" for FCAL cell "<<id.get_identifier32().get_compact());
460 return -1;
461 } else {
462 const FCALHVLine* line2 = tile->getHVLine(ElectInd);
463 if(line2) {
464 return line2->hvLineNo(&hvIdMapping);
465 } else {
466 ATH_MSG_ERROR("Do not have HVLine for "<<ElectInd<<" for FCAL cell "<<id.get_identifier32().get_compact());
467 return -1;
468 }
469 }
470 }
471 }
472
473 // should not get up to this point....
474 return -1;
475
476}
477
478std::unique_ptr<AthenaAttributeList> LArHVPathologyDbAlg::hvPathology2AttrList(const LArHVPathologiesDb& pathologyContainer) const {
479
480 coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
481 spec->extend("blobVersion",
482 "unsigned int"); // Should allow schema evolution if needed
483 spec->extend("Constants", "blob"); // Holds the container
484
485 std::unique_ptr<AthenaAttributeList> attrList = std::make_unique<AthenaAttributeList>(*spec);
486
487 (*attrList)["blobVersion"].data<unsigned int>() = (unsigned int)0;
488 coral::Blob& blob = (*attrList)["Constants"].data<coral::Blob>();
489
490 TClass* klass = TClass::GetClass("LArHVPathologiesDb");
491 if (klass == nullptr) {
492 ATH_MSG_ERROR("Can't find TClass LArHVPathologiesDb");
493 return nullptr;
494 } else
495 ATH_MSG_DEBUG("Got TClass LArHVPathologiesDb");
496
497 TBufferFile buf(TBuffer::kWrite);
498
499 if (buf.WriteObjectAny(&pathologyContainer, klass) != 1) {
500 ATH_MSG_ERROR("Failed to stream LArHVPathologiesDb");
501 return nullptr;
502 }
503
504 blob.resize(buf.Length());
505 void* adr = blob.startingAddress();
506 memcpy(adr, buf.Buffer(), buf.Length());
507 return attrList;
508}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Calo Subsystem specific Detector Elements + Dummy element for testing.
This is an interface to a tool used to register conditions objects in the Interval of Validity (IOV) ...
static Double_t sc
const ServiceHandle< StoreGateSvc > & detStore() const
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
This class provides the client interface for accessing the detector description information common to...
LAr EMB Detector Element.
int hvLineNo(int iGap, const LArHVIdMapping *hvIdMapping) const
Describes one HV Module within the EMB Presampler.
int hvLineNo(int iGap, const LArHVIdMapping *hvIdMapping) const
LAr EMEC Detector Element.
int hvLineNo(int iGap, const LArHVIdMapping *hvIdMapping) const
Describes one HV Module within the EMEc Presampler.
int hvLineNo(int iGap, const LArHVIdMapping *hvIdMapping) const
LAr FCAL Detector Element.
A tile of the forward calorimeter readout geometry.
Definition FCALTile.h:27
static unsigned int getNumHVLines()
Get num hvlines.
Definition FCALTile.cxx:81
LAr HEC Detector Element.
int hvLineNo(const LArHVIdMapping *hvIdMapping) const
std::vector< LArHVElectPathologyDb > m_v
SG::ReadCondHandleKey< LArHVIdMapping > m_hvCablingKey
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
virtual StatusCode execute() override
const CaloIdManager * m_caloIdMgr
std::vector< unsigned int > getElectInd(const LArHVIdMapping &hvIdMapping, const Identifier &id, unsigned int module, unsigned int line, const CaloDetDescrManager *calodetdescrmgr) const
virtual StatusCode initialize() override
const LArHEC_ID * m_larhec_id
SG::ReadCondHandleKey< LArHVPathology > m_hvPathologyKey
std::unique_ptr< AthenaAttributeList > hvPathology2AttrList(const LArHVPathologiesDb &pathologyContainer) const
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
StatusCode printCondObjects(const EventContext &ctx, const CaloDetDescrManager *calodetdescrmgr, const std::vector< LArHVPathologiesDb::LArHVElectPathologyDb > *path=nullptr) const
const LArFCAL_ID * m_larfcal_id
std::optional< LArHVPathologiesDb > createCondObjects(const EventContext &ctx, const CaloDetDescrManager *calodetdescrmgr) const
BooleanProperty m_writeCondObjs
int getHVline(const LArHVIdMapping &hvIdMapping, const Identifier &id, short unsigned int ElectInd, const CaloDetDescrManager *calodetdescrmgr) const
const LArEM_ID * m_larem_id
const LArOnlineID * m_laronline_id
static TFile * fout
Definition listroot.cxx:40