ATLAS Offline Software
Loading...
Searching...
No Matches
LArMiniFCAL_ID.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9#include "IdDict/IdDictMgr.h"
10#include "IdDict/IdDictRegion.h"
14
15#include <cmath>
16#include <fstream>
17#include <iostream>
18#include <set>
19#include <sstream>
20#include <stdexcept>
21#include <string>
22
23#include "CxxUtils/StrFormat.h"
24
26
27
29 :
30 CaloIDHelper ("LArMiniFCAL_ID", "lar_mini_fcal"),
31 m_is_initialized(false),
33 m_LAR_INDEX(999),
35 m_POSNEG_INDEX(999),
36 m_MODULE_INDEX(999),
37 m_DEPTH_INDEX(999),
38 m_ETA_INDEX(999),
39 m_PHI_INDEX(999),
41{}
42
44
45int LArMiniFCAL_ID::eta_min(const Identifier modId) const
46{
48 IdContext module_cntxt = module_context();
49 if(!get_expanded_id(modId, expId, &module_cntxt)) {
50 int result = -999;
51 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
52 const Range& range = m_full_channel_range[i];
53 if (range.match(expId)) {
54 const Range::field& eta_field = range[m_ETA_INDEX];
55 if (not eta_field.empty()) {
56 int etamin = eta_field.get_minimum();
57 if (-999 == result) {
58 result = etamin;
59 }
60 else {
61 if (etamin < result) result = etamin;
62 }
63 }
64 }
65 }
66 return (result);
67 }
68 return (-999);
69}
70
71int LArMiniFCAL_ID::eta_max(const Identifier modId) const
72{
74 IdContext module_cntxt = module_context();
75 if(!get_expanded_id(modId, expId, &module_cntxt)) {
76 int result = -999;
77 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
78 const Range& range = m_full_channel_range[i];
79 if (range.match(expId)) {
80 const Range::field& eta_field = range[m_ETA_INDEX];
81 if (not eta_field.empty()) {
82 int etamax = eta_field.get_maximum();
83 if (result < etamax) result = etamax;
84 }
85 }
86 }
87 return (result);
88 }
89 return (-999); // default
90}
91
93{
95 IdContext module_cntxt = module_context();
96 if(!get_expanded_id(modId, expId, &module_cntxt)) {
97 int result = -999;
98 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
99 const Range& range = m_full_channel_range[i];
100 if (range.match(expId)) {
101 const Range::field& phi_field = range[m_PHI_INDEX];
102 if (not phi_field.empty()) {
103 int phimin = phi_field.get_minimum();
104 if (-999 == result) {
105 result = phimin;
106 }
107 else {
108 if (phimin < result) result = phimin;
109 }
110 }
111 }
112 }
113 return (result);
114 }
115 return (-999); // default
116}
117
119{
120 ExpandedIdentifier expId;
121 IdContext module_cntxt = module_context();
122 if(!get_expanded_id(modId, expId, &module_cntxt)) {
123 int result = -999;
124 for (unsigned int i = 0; i < m_full_channel_range.size(); ++i) {
125 const Range& range = m_full_channel_range[i];
126 if (range.match(expId)) {
127 const Range::field& phi_field = range[m_PHI_INDEX];
128 if (not phi_field.empty()) {
129 int phimax = phi_field.get_maximum();
130 if (result < phimax) result = phimax;
131 }
132 }
133 }
134 return (result);
135 }
136 return (-999); // default
137}
138
139int LArMiniFCAL_ID::get_neighbours(const IdentifierHash id, const LArNeighbours::neighbourOption& option, std::vector<IdentifierHash>& neighbourList) const
140{
141 int result = 1;
142
143 neighbourList.clear();
144
145 if(!m_do_neighbours) {
146 ATH_MSG_WARNING("neighbours not initialized !!! returning empty list");
147 return result;
148 }
149
150 if(id>=channels().hash_max()) {
151 ATH_MSG_WARNING("neighbours requested for non-existing channel -- id/max " << id << "/"
152 << channel_hash_max());
153 return result;
154 }
155
156 if( dictionaryVersion() == "fullAtlas" ) {
157
158 if ( (option & LArNeighbours::all2D) == LArNeighbours::all2D ){
159 if ( !m_neighbors_2d_vec[(unsigned int)id].empty() ) {
160 neighbourList.insert(neighbourList.end(),
161 m_neighbors_2d_vec[(unsigned int)id].begin(),
162 m_neighbors_2d_vec[(unsigned int)id].end());
163 }
164 }
165
166 if ( (option & LArNeighbours::prevInSamp) ){
167 if ( !m_neighbors_3d_prev_vec[(unsigned int)id].empty() ) {
168 neighbourList.insert(neighbourList.end(),
169 m_neighbors_3d_prev_vec[(unsigned int)id].begin(),
170 m_neighbors_3d_prev_vec[(unsigned int)id].end());
171 }
172 }
173
174 if ( (option & LArNeighbours::nextInSamp) ){
175 if ( !m_neighbors_3d_next_vec[(unsigned int)id].empty() ) {
176 neighbourList.insert(neighbourList.end(),
177 m_neighbors_3d_next_vec[(unsigned int)id].begin(),
178 m_neighbors_3d_next_vec[(unsigned int)id].end());
179 }
180 }
181
182 } else {
183 ATH_MSG_WARNING(" NO MiniFCAL neighbours (yet) in the context of " << dictionaryVersion());
184 }
185 return result;
186}
187
190{
191 return region_context();
192}
193
195/*=================================================================*/
196{
197 ATH_MSG_DEBUG("initialize_from_dictionary");
198
199 // Check whether this helper should be reinitialized
200 if (!reinitialize(dict_mgr)) {
201 ATH_MSG_DEBUG("Request to reinitialize not satisfied - tags have not changed");
202 return (0);
203 }
204 else {
205 ATH_MSG_DEBUG("(Re)initialize");
206 }
207
208 // init base object
210 "LArCalorimeter"))
211 return (1);
212
213 // initialize dictionary version
214 AtlasDetectorID::setDictVersion(dict_mgr, "LArCalorimeter");
215
216 // Check whether dictionary has miniFCAL
217 if (!dict()->find_group("lar_mini_fcal")) {
218 ATH_MSG_INFO("initialize_from_dict - LArCalorimeter dictionary does NOT contain miniFCAL description. Unable to initialize LArMiniFCAL_ID.");
219 return 0; // return OK
220 }
221
222
223 // Initialize the field indices
224 if(initLevelsFromDict()) {
225 ATH_MSG_WARNING("initialize_from_dict - cannot initialize MiniFCAL part of LArCalorimeter dictionary");
226 return (1);
227 }
228 else {
229
230 // Find value for the field LAr Calorimeter
231 const IdDictDictionary* atlasDict = dict_mgr.find_dictionary ("ATLAS");
232 int larField = -1;
233 if (atlasDict->get_label_value("subdet", "LArCalorimeter", larField)) {
234 ATH_MSG_ERROR("Could not get value for label 'LArCalorimeter' of field 'subdet' in dictionary " << atlasDict->name());
235 return (1);
236 }
237
238
239 // Find value for the field LArMiniFCAL - here the "part" has to be LArFCAL
240 int larFcalField = -1;
241 if (dict()->get_label_value("part", "LArFCAL", larFcalField)) {
242 ATH_MSG_ERROR("Could not get value for label 'LArMiniFCAL' of field 'part' in dictionary " << atlasDict->name());
243 return (1);
244 }
245
246 // Set up id for region and range prefix
247
248 // RDS: need to find the range for MiniFCAL module 0, which includes
249 // both pos/neg endcaps
251 region_id.add(larField);
252 region_id.add(larFcalField);
253 Range prefix;
254 std::string str = "lar_mini_fcal";
256 m_full_module_range = dict()->build_multirange(region_id, str, prefix, "module");
257 m_full_depth_range = dict()->build_multirange(region_id, str, prefix, "depth-mfcal");
258
259 ATH_MSG_DEBUG("initialize_from_dict : ");
260 ATH_MSG_DEBUG(" channel range -> " << (std::string)m_full_channel_range);
261 ATH_MSG_DEBUG(" module range -> " << (std::string)m_full_module_range);
262 ATH_MSG_DEBUG(" depth range -> " << (std::string)m_full_depth_range);
263
264 // Setup the hash tables
265 if(init_hashes()) return (1);
266
267 // initilize m_two_sym_sides
268 m_two_sym_sides = ( dictionaryVersion() == "fullAtlas" );
269
270 // collect the regions to later access deta/dphi etc.
271 if (fill_vec_of_dict_regions()) return 1;
272
273 m_vecOfPhiMin.resize(regions().hash_max());
274 for (unsigned int i = 1; i < regions().hash_max(); ++i) {
275 Identifier modId = module_id(i);
276 m_vecOfPhiMin[i] = phi_min_init(modId);
277 }
278
279 // Setup hash tables for finding neighbors
280 if(m_do_neighbours) {
281 if(init_neighbors(dict_mgr)) return (1);
282 }
283
284 }
285
286 m_is_initialized = true;
287 return 0;
288
289}
290
291void LArMiniFCAL_ID::module_id_checks ( int pos_neg, int /*module*/ ) const
292{
293
294 // Check that id is within allowed range
295 // Fill expanded id
297 //expId << pos_neg << module;
298 expId << pos_neg << 0;
299
300 if (!m_full_module_range.match(expId)) {
301 std::string errorMessage = "LArMiniFCAL_ID::module_id() result is not OK: ID, range = "
302 + std::string(expId) + " , " + (std::string)m_full_module_range;
303 throw LArID_Exception(errorMessage , 6);
304 }
305}
306
307void LArMiniFCAL_ID::channel_id_checks ( int pos_neg, int /*module*/, int depth, int eta, int phi) const
308{
309
310 // Check that id is within allowed range
311 // Fill expanded id
313 //expId << pos_neg << module << depth << eta << phi ;
314 expId << pos_neg << 0 << depth << eta << phi ;
315
316 if (!m_full_channel_range.match(expId)) {
317 std::string errorMessage = "LArMiniFCAL_ID::channel_id() result is not OK: ID, range = "
318 + std::string(expId) + " , " + (std::string)m_full_channel_range;
319 throw LArID_Exception(errorMessage , 10);
320 }
321}
322
324 int eta, int phi) const
325{
326 // Check that id is within allowed range
327 // Fill expanded id
328 ExpandedIdentifier expId;
329
330 IdContext context = module_context();
331 if (get_expanded_id(moduleId, expId, &context)) {
332 std::string errorMessage = "LArMiniFCAL_ID::channel_id(modId) result is not OK: ID = "
333 + show_to_string(moduleId) ;
334 throw LArID_Exception(errorMessage , 10);
335 }
336
337 expId << depth << eta << phi ;
338
339 if (!m_full_channel_range.match(expId)) {
340 std::string errorMessage = "LArMiniFCAL_ID::channel_id(modId) result is not OK: ID, range = "
341 + std::string(expId) + " , " + (std::string)m_full_channel_range;
342 throw LArID_Exception(errorMessage , 10);
343 }
344}
345
346int LArMiniFCAL_ID::get_expanded_id (const Identifier& id, ExpandedIdentifier& exp_id, const IdContext* context) const
347{
348 // We assume that the context is >= region
349 exp_id.clear();
350 exp_id << lar_field_value()
352 << pos_neg(id)
353 << module(id);
354 if (context && context->end_index() >= m_DEPTH_INDEX) {
355 exp_id << depth(id);
356 if (context->end_index() >= m_ETA_INDEX) {
357 exp_id << eta(id);
358 if (context->end_index() >= m_PHI_INDEX) {
359 exp_id << phi(id);
360 }
361 }
362 }
363 return 0;
364}
365
367{
368 if(!dict()) {
369 ATH_MSG_ERROR("initLevelsFromDict - dictionary NOT initialized");
370 return (1);
371 }
372
373 // Find out which identifier field corresponds to each level.
374
375 m_fcal_region_index = 999 ;
376 m_LAR_INDEX = 999 ;
377 m_MiniFCAL_INDEX = 999 ;
378 m_POSNEG_INDEX = 999 ;
379 m_MODULE_INDEX = 999 ;
380 m_DEPTH_INDEX = 999 ;
381 m_ETA_INDEX = 999 ;
382 m_PHI_INDEX = 999 ;
383
384 const IdDictField* field = dict()->find_field("subdet") ;
385 if (field) {
386 m_LAR_INDEX = field->index();
387 }
388 else {
389 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'subdet' field");
390 return (1);
391 }
392
393 field = dict()->find_field("part") ;
394 if (field) {
395 m_MiniFCAL_INDEX = field->index();
396 }
397 else {
398 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'part' field");
399 return (1);
400 }
401
402 field = dict()->find_field("barrel-endcap") ;
403 if (field) {
404 m_POSNEG_INDEX = field->index();
405 }
406 else {
407 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'barrel-endcap' field");
408 return (1);
409 }
410
411 field = dict()->find_field("module") ;
412 if (field) {
413 m_MODULE_INDEX = field->index();
414 }
415 else {
416 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'module' field");
417 return (1);
418 }
419
420
421 field = dict()->find_field("depth-mfcal") ;
422 if (field) {
423 m_DEPTH_INDEX = field->index();
424 }
425 else {
426 ATH_MSG_WARNING("initLevelsFromDict - unable to find 'depth' field");
427 return (1);
428 }
429
430
431 field = dict()->find_field("eta-mfcal") ;
432 if (field) {
433 m_ETA_INDEX = field->index();
434 }
435 else {
436 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'eta' field");
437 return (1);
438 }
439
440 field = dict()->find_field("phi-mfcal") ;
441 if (field) {
442 m_PHI_INDEX = field->index();
443 }
444 else {
445 ATH_MSG_ERROR("initLevelsFromDict - unable to find 'phi' field");
446 return (1);
447 }
448
449 // Save index to a MiniFCAL region for unpacking
450
451 // Fill expanded identifier with id for module 0 of the MiniFCAL,
452 // i.e. add on module == 0 to the id below
453
455 if (dict()->find_region(id,m_fcal_region_index)){
456 ATH_MSG_ERROR("initLevelsFromDict - unable to find fcal region index: id, reg " << id << " " << m_fcal_region_index);
457 return (1);
458 }
459
460 // Set the field implementations
461
462
463 const IdDictRegion& region = *dict()->find_region ("", "lar_mini_fcal");
464
472
473 ATH_MSG_DEBUG("decode index and bit fields for each level: ");
474 ATH_MSG_DEBUG("lar " << m_lar_impl.show_to_string());
475 ATH_MSG_DEBUG("fcal " << m_fcal_impl.show_to_string());
476 ATH_MSG_DEBUG("pn " << m_pn_impl.show_to_string());
477 ATH_MSG_DEBUG("mod " << m_module_impl.show_to_string());
478 ATH_MSG_DEBUG("depth " << m_depth_impl.show_to_string());
479 ATH_MSG_DEBUG("eta " << m_eta_impl.show_to_string());
480 ATH_MSG_DEBUG("phi " << m_phi_impl.show_to_string());
481
482 return(0) ;
483}
484
486{
487 if (channels().init (*this, "channels",
491 return 1;
492 if (regions().init (*this, "regions",
496 return 1;
497
498 return (0);
499}
500
501
502int LArMiniFCAL_ID::init_neighbors_from_file(const std::string& filename, std::vector<std::set<IdentifierHash> > & vec)
503{
504 ATH_MSG_DEBUG("init_neighbors_from_file");
505 // Find the full path to filename:
506 std::string file = PathResolver::find_file (filename, "DATAPATH");
507 ATH_MSG_INFO("Reading file " << file);
508
509 std::ifstream fin;
510 if (!file.empty()) {
511 fin.open(file.c_str());
512 }
513 else {
514 ATH_MSG_ERROR("Could not find input file " << filename);
515 return 1;
516 }
517 if (fin.bad()) {
518 ATH_MSG_ERROR("Could not open file " << file);
519 return 1;
520 }
521
522 //
523 // Parse the input file
524 //
525
526 vec.resize(channels().hash_max());
527
528 char aLine[1024];
529 std::string sLine;
530 bool isComment = true;
531 char AorC,dot;
532 int isamp,idepth, iphi,ieta;
533
534 while( isComment ) {
535 sLine.resize( 0 );
536 do {
537 fin.getline(aLine,sizeof(aLine)-1);
538 sLine = std::string(aLine);
539 } while (sLine.empty() && !fin.eof());
540 isComment = ( sLine.find('#') != std::string::npos );
541 }
542 do {
543 while ( sLine.empty() && !fin.eof()) {
544 fin.getline(aLine,sizeof(aLine)-1);
545 sLine = std::string(aLine);
546 }
547 std::istringstream es( sLine.c_str() );
548
549 if ( es >> AorC >> isamp >> dot >> idepth >> dot >> iphi >> dot >> ieta ) {
550 Identifier thisCell = channel_id((AorC=='A'?2:-2),isamp,idepth,ieta,iphi);
551 IdentifierHash ic = channel_hash(thisCell);
552 while ( es >> AorC >> isamp >> dot >> idepth >> dot >> iphi >> dot >> ieta ) {
553 if (!ic.is_valid()) continue;
554 Identifier nextCell = channel_id((AorC=='A'?2:-2),isamp,idepth,ieta,iphi);
555 IdentifierHash inext = channel_hash(nextCell);
556 vec[ic].insert(vec[ic].end(),inext);
557 }
558 sLine.resize(0);
559 }
560 }while (!fin.eof()) ;
561 fin.close();
562
563 return 0;
564}
565
567{
568 ATH_MSG_DEBUG("init_neighbors");
569
570 int status;
571 std::string f2d,f3dnext,f3dprev;
572
573 f2d = dict_mgr.find_metadata("FCAL2DNEIGHBORS");
574 f3dnext = dict_mgr.find_metadata("FCAL3DNEIGHBORSNEXT");
575 f3dprev = dict_mgr.find_metadata("FCAL3DNEIGHBORSPREV");
576 if (f2d.empty() || f3dnext.empty() || f3dprev.empty()) {
577 ATH_MSG_ERROR("init_neighbours: cannot find neighbours files: "
578 << " f2d: " << f2d << " f3dnext: " << f3dnext << " f3dprev: " << f3dprev);
579 throw std::runtime_error("LArMiniFCAL_ID::init_neighbours: Cannot find the FCAL Neighbour file names");
580 }
581
582 status = init_neighbors_2d(f2d);
583 if ( status == 0 )
584 status = init_neighbors_3d_next(f3dnext);
585 if ( status == 0 )
586 status = init_neighbors_3d_prev(f3dprev);
587
588 if ( status == 0 )
589 return (0);
590 else
591 return (1);
592}
593
594
595
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
std::vector< size_t > vec
Provide helper functions to create formatted strings.
static const Attributes_t empty
virtual std::string dictionaryVersion(void) const override
bool m_do_neighbours
Flag for subclasses to know whether or not to perform neighbour initialization.
bool reinitialize(const IdDictMgr &dict_mgr)
Test whether an idhelper should be reinitialized based on the change of tags.
int lar_fcal_field_value() const
virtual void setDictVersion(const IdDictMgr &dict_mgr, const std::string &name) override
ExpandedIdentifier lar_fcal_exp(void) const
int lar_field_value() const
std::string show_to_string(Identifier id, const IdContext *context=0, char sep='.') const
or provide the printout in string form
size_type hash_max() const
Return one more than the largest hash code.
const HashGroup & regions() const
Return the HashGroup for regions.
int initialize_base_from_dictionary(const IdDictMgr &dict_mgr, const std::string &dict_name)
Do basic initialization of the helper.
IdContext region_context() const
Return the context for regions.
size_type channel_hash_max() const
One more than the largest channel (cell) hash code.
CaloIDHelper(const std::string &name, const std::string &group)
Constructor.
Identifier region_id(IdentifierHash hashId) const
Return the region Identifier for a given hash code (no checking).
int fill_vec_of_dict_regions(const std::string &group_name="")
Initialize the list of detector regions.
const IdDictDictionary * dict() const
Return the dictionary for this subdetector.
const HashGroup & channels() const
Return the HashGroup for channels (cells).
void clear()
Erase all fields.
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
size_type end_index() const
Definition IdContext.h:46
MultiRange build_multirange() const
Get MultiRange for full dictionary.
int get_label_value(const std::string &field, const std::string &label, int &value) const
const std::string & name() const
Dictionary name.
const IdDictField * find_field(const std::string &name) const
const IdDictRegion * find_region(const std::string &region_name) const
const IdDictDictionary * find_dictionary(const std::string &name) const
Access dictionary by name.
const std::string & find_metadata(const std::string &name) const
Access to meta data, name/value pairs.
Definition IdDictMgr.cxx:87
const IdDictFieldImplementation & implementation(size_t i) const
element_type get_minimum() const
Query the values.
bool empty() const
If true, this field does not have any constraints, and may hold any value representable by element_ty...
element_type get_maximum() const
This is a "hash" representation of an Identifier.
Exception class for LAr Identifiers.
virtual int initialize_from_dictionary(const IdDictMgr &dict_mgr)
initialization from the identifier dictionary
size_type m_ETA_INDEX
IdDictFieldImplementation m_depth_impl
void module_id_checks(int pos_neg, int module) const
int eta_max(const Identifier regId) const
max value of eta index (-999 == failure)
int init_neighbors_from_file(const std::string &filename, std::vector< std::set< IdentifierHash > > &vec)
IdDictFieldImplementation m_phi_impl
int get_neighbours(const IdentifierHash id, const LArNeighbours::neighbourOption &option, std::vector< IdentifierHash > &neighbourList) const
access to hashes for neighbours return == 0 for neighbours found option = all2D,...
int phi_max(const Identifier regId) const
max value of phi index (-999 == failure)
IdDictFieldImplementation m_module_impl
MultiRange m_full_depth_range
int depth(const Identifier id) const
depth [0,3]
MultiRange m_full_module_range
IdDictFieldImplementation m_pn_impl
int pos_neg(const Identifier id) const
pos_neg : +/- 2 (A/C side)
size_type m_POSNEG_INDEX
int eta_min(const Identifier regId) const
min value of eta index (-999 == failure)
IdentifierHash channel_hash(Identifier channelId) const
Convert a connected channel (cell) Identifier to a hash code.
size_type m_PHI_INDEX
IdDictFieldImplementation m_lar_impl
std::vector< short int > m_vecOfPhiMin
int init_neighbors_3d_next(const std::string &filename)
MultiRange m_full_channel_range
size_type m_MiniFCAL_INDEX
int eta(const Identifier id) const
eta [0,63] module 1 ; [0,31] module 2 ; [0,15] module 3
IdContext module_context() const
context for modules – method kept for backward compatibility.
size_type m_LAR_INDEX
virtual int get_expanded_id(const Identifier &id, ExpandedIdentifier &exp_id, const IdContext *context) const
create expanded Identifier from Identifier (return == 0 for OK)
size_type m_fcal_region_index
IdDictFieldImplementation m_fcal_impl
IdDictFieldImplementation m_eta_impl
int phi_min_init(const Identifier regId) const
void channel_id_checks(int pos_neg, int module, int depth, int eta, int phi) const
std::vector< std::set< IdentifierHash > > m_neighbors_2d_vec
Identifier channel_id(const ExpandedIdentifier &exp_id) const
cell identifier for a channel from ExpandedIdentifier
int phi(const Identifier id) const
phi [0,15]
size_type m_DEPTH_INDEX
size_type m_MODULE_INDEX
int init_neighbors(const IdDictMgr &dict_mgr)
Identifier module_id(const ExpandedIdentifier &exp_id) const
module identifier for a channel from ExpandedIdentifier
int init_neighbors_3d_prev(const std::string &filename)
int init_neighbors_2d(const std::string &filename)
std::vector< std::set< IdentifierHash > > m_neighbors_3d_next_vec
std::vector< std::set< IdentifierHash > > m_neighbors_3d_prev_vec
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
A Range describes the possible ranges for the field values of an ExpandedIdentifier.
std::string depth
tag string for intendation
Definition fastadd.cxx:46
std::string strformat(const char *fmt,...)
return a std::string according to a format fmt and varargs
Definition StrFormat.cxx:49
Definition dot.py:1
TFile * file