CMS 3D CMS Logo

DD4hep_TrackingMaterialAnalyser.cc
Go to the documentation of this file.
1 #include <iostream> // FIXME: switch to MessagLogger & friends
2 #include <fstream>
3 #include <sstream>
4 #include <vector>
5 #include <string>
6 #include <stdexcept>
7 #include <cstring>
8 #include <cstdlib>
9 #include <boost/format.hpp>
10 
17 
20 
25 
26 //-------------------------------------------------------------------------
29  consumes<std::vector<MaterialAccountingTrack> >(iPSet.getParameter<edm::InputTag>("MaterialAccounting"));
30  m_groupNames = iPSet.getParameter<std::vector<std::string> >("Groups");
31  const std::string& splitmode = iPSet.getParameter<std::string>("SplitMode");
32  if (strcasecmp(splitmode.c_str(), "NearestLayer") == 0) {
34  } else if (strcasecmp(splitmode.c_str(), "InnerLayer") == 0) {
36  } else if (strcasecmp(splitmode.c_str(), "OuterLayer") == 0) {
38  } else {
41  << "Invalid SplitMode \"" << splitmode
42  << "\". Acceptable values are \"NearestLayer\", \"InnerLayer\", \"OuterLayer\".";
43  }
44  m_skipAfterLastDetector = iPSet.getParameter<bool>("SkipAfterLastDetector");
45  m_skipBeforeFirstDetector = iPSet.getParameter<bool>("SkipBeforeFirstDetector");
46  m_saveSummaryPlot = iPSet.getParameter<bool>("SaveSummaryPlot");
47  m_saveDetailedPlots = iPSet.getParameter<bool>("SaveDetailedPlots");
48  m_saveParameters = iPSet.getParameter<bool>("SaveParameters");
49  m_saveXml = iPSet.getParameter<bool>("SaveXML");
50  m_isHGCal = iPSet.getParameter<bool>("isHGCal");
51  m_isHFNose = iPSet.getParameter<bool>("isHFNose");
52  if (m_saveSummaryPlot) {
53  if (m_isHGCal) {
54  m_plotter = new DD4hep_TrackingMaterialPlotter(550., 300., 10);
55  } else if (m_isHFNose) {
56  m_plotter = new DD4hep_TrackingMaterialPlotter(1200., 350., 10);
57  } else {
58  m_plotter = new DD4hep_TrackingMaterialPlotter(300., 120., 10);
59  } // 10x10 points per cm2
60  } else {
61  m_plotter = nullptr;
62  }
63 }
64 
65 //-------------------------------------------------------------------------
67  if (m_plotter)
68  delete m_plotter;
69 }
70 
71 //-------------------------------------------------------------------------
73  std::ofstream parameters(name);
74  std::cout << std::endl;
75  for (unsigned int i = 0; i < m_groups.size(); ++i) {
77  std::cout << layer.name() << std::endl;
78  std::cout << boost::format("\tnumber of hits: %9d") % layer.tracks() << std::endl;
79  std::cout << boost::format("\tnormalized segment length: %9.1f ± %9.1f cm") % layer.averageLength() %
80  layer.sigmaLength()
81  << std::endl;
82  std::cout << boost::format("\tnormalized radiation lengths: %9.3f ± %9.3f") % layer.averageRadiationLengths() %
83  layer.sigmaRadiationLengths()
84  << std::endl;
85  std::cout << boost::format("\tnormalized energy loss: %6.5fe-03 ± %6.5fe-03 GeV") %
86  layer.averageEnergyLoss() % layer.sigmaEnergyLoss()
87  << std::endl;
88  parameters << boost::format("%-20s\t%7d\t%5.1f ± %5.1f cm\t%6.4f ± %6.4f \t%6.4fe-03 ± %6.4fe-03 GeV") %
89  layer.name() % layer.tracks() % layer.averageLength() % layer.sigmaLength() %
91  layer.sigmaEnergyLoss()
92  << std::endl;
93  }
94  std::cout << std::endl;
95 
96  parameters.close();
97 }
98 
99 //-------------------------------------------------------------------------
101  std::ofstream xml(name);
102  xml << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl;
103  xml << "<Groups>" << std::endl;
104  for (unsigned int i = 0; i < m_groups.size(); ++i) {
106  xml << " <Group name=\"" << layer.name() << "\">\n"
107  << " <Parameter name=\"TrackerRadLength\" value=\"" << layer.averageRadiationLengths() << "\"/>\n"
108  << " <Parameter name=\"TrackerXi\" value=\"" << layer.averageEnergyLoss() << "\"/>\n"
109  << " </Group>\n"
110  << std::endl;
111  }
112  xml << "</Groups>" << std::endl;
113 }
114 
115 //-------------------------------------------------------------------------
117  for (unsigned int i = 0; i < m_groups.size(); ++i) {
119  layer.savePlots();
120  }
121 }
122 
123 //-------------------------------------------------------------------------
125  if (m_saveParameters)
126  saveParameters("parameters");
127 
128  if (m_saveXml)
129  saveXml("parameters.xml");
130 
132  saveLayerPlots();
133 
134  if (m_saveSummaryPlot and m_plotter) {
135  m_plotter->normalize();
136  m_plotter->draw();
137  }
138 }
139 
140 //-------------------------------------------------------------------------
141 
142 //-------------------------------------------------------------------------
144  using namespace edm;
146  setup.get<IdealGeometryRecord>().get(hDDD);
147 
148  m_groups.reserve(m_groupNames.size());
149  // Initialize m_groups iff it has size equal to zero, so that we are
150  // sure it will never be repopulated with the same entries over and
151  // over again in the eventloop, at each call of the analyze method.
152  if (m_groups.empty()) {
153  for (unsigned int i = 0; i < m_groupNames.size(); ++i)
154  m_groups.push_back(new DD4hep_MaterialAccountingGroup(m_groupNames[i], *hDDD));
155 
156  edm::LogVerbatim("TrackingMaterialAnalyser") << "TrackingMaterialAnalyser: List of the tracker groups: " << std::endl;
157  for (unsigned int i = 0; i < m_groups.size(); ++i)
158  edm::LogVerbatim("TrackingMaterialAnalyser") << i << " TrackingMaterialAnalyser:\t" << m_groups[i]->info() << std::endl;
159  }
161  event.getByToken(m_materialToken, h_tracks);
162 
163  for (std::vector<MaterialAccountingTrack>::const_iterator t = h_tracks->begin(), end = h_tracks->end(); t != end;
164  ++t) {
166  split(track);
167  }
168 }
169 
170 //-------------------------------------------------------------------
171 // split a track in segments, each associated to a sensitive detector
172 // in a DetLayer; then, associate each step to one segment, splitting
173 // the steps across the segment boundaries
174 //
175 // Nota Bene: this implementation assumes that the steps stored along
176 // each track are consecutive and adjacent, and that no step can span
177 // across 3 layers, since all steps should split at layer boundaries
178 
180  using namespace edm;
181  // group sensitive detectors by their DetLayer
182  std::vector<int> group(track.detectors().size());
183  for (unsigned int i = 0; i < track.detectors().size(); ++i)
184  group[i] = findLayer(track.detectors()[i]);
185 
186  for (unsigned int i = 0; i < group.size(); ++i)
187  if (group[i] > 0)
188  edm::LogVerbatim("TrackingMaterialAnalyser") << "For detector i: " << i << " index: " << group[i]
189  << " R-ranges: " << m_groups[group[i] - 1]->getBoundingR().first << ", "
190  << m_groups[group[i] - 1]->getBoundingR().second << group[i]
191  << " Z-ranges: " << m_groups[group[i] - 1]->getBoundingZ().first << ", "
192  << m_groups[group[i] - 1]->getBoundingZ().second << std::endl;
193 
194  unsigned int detectors = track.detectors().size();
195  if (detectors == 0) {
196  // the track doesn't cross any active detector:
197  // keep al material as unassigned
198  if (m_plotter)
199  for (unsigned int i = 1; i < track.steps().size(); ++i)
201  } else {
202  const double TOLERANCE = 0.0001; // 1 um tolerance
203  std::vector<double> limits(detectors + 2);
204 
205  // define the trivial limits
207  limits[0] = track.detectors()[0].m_curvilinearIn - TOLERANCE;
208  else
209  limits[0] = -TOLERANCE;
211  limits[detectors] = track.detectors()[detectors - 1].m_curvilinearOut + TOLERANCE;
212  else
213  limits[detectors] = track.summary().length() + TOLERANCE;
214  limits[detectors + 1] = INFINITY; // this is probably no more needed, but doesn't harm...
215 
216  // pick the algorithm to define the non-trivial limits
217  switch (m_splitMode) {
218  // assign each segment to the the nearest layer
219  // e.g. the material between pixel barrel 3 and TIB 1 will be split among the two
220  case NEAREST_LAYER:
221  for (unsigned int i = 1; i < detectors; ++i) {
222  limits[i] = (track.detectors()[i - 1].m_curvilinearOut + track.detectors()[i].m_curvilinearIn) / 2.;
223  }
224  break;
225 
226  // assign each segment to the the inner layer
227  // e.g. all material between pixel barrel 3 and TIB 1 will go into the pixel barrel
228  case INNER_LAYER:
229  for (unsigned int i = 1; i < detectors; ++i)
230  limits[i] = track.detectors()[i].m_curvilinearIn - TOLERANCE;
231  break;
232 
233  // assign each segment to the the outer layer
234  // e.g. all material between pixel barrel 3 and TIB 1 will go into the TIB
235  case OUTER_LAYER:
236  for (unsigned int i = 1; i < detectors; ++i)
237  limits[i] = track.detectors()[i - 1].m_curvilinearOut + TOLERANCE;
238  break;
239 
240  case UNDEFINED:
241  [[fallthrough]];
242 
243  default:
244  // throw something
245  throw edm::Exception(edm::errors::LogicError) << "Invalid SplitMode";
246  }
247 
248  double begin = 0.; // beginning of step, along the track
249  double end = 0.; // end of step, along the track
250  unsigned int i = 1; // step conter
251 
252  // skip the material before the first layer
253  while (end < limits[0]) {
254  const MaterialAccountingStep& step = track.steps()[i++];
255  end = begin + step.length();
256 
257  // do not account material before the first layer
258  if (m_plotter)
260 
261  begin = end;
262  }
263 
264  unsigned int index = 0; // which detector
265  while (i < track.steps().size()) {
266  const MaterialAccountingStep& step = track.steps()[i++];
267 
268  end = begin + step.length();
269 
270  if (begin > limits[detectors]) {
271  // segment after last layer and skipping requested in configuation
272  if (m_plotter)
274  begin = end;
275  continue;
276  }
277 
278  // from here onwards we should be in the accountable region, either completely in a single layer:
279  // limits[index] <= begin < end <= limits[index+1]
280  // or possibly split between 2 layers
281  // limits[index] < begin < limits[index+1] < end < limits[index+2]
282  if (begin < limits[index] or end > limits[index + 2]) {
283  // sanity check
284  std::cerr << "MaterialAccountingTrack::split(): ERROR: internal logic error, expected " << limits[index]
285  << " < " << begin << " < " << limits[index + 1] << std::endl;
286  break;
287  }
288 
289  if (limits[index] <= begin and end <= limits[index + 1]) {
290  // step completely inside current detector range
291  track.detectors()[index].account(step, begin, end);
292  if (m_plotter)
294  } else {
295  // step shared beteewn two detectors, transition at limits[index+1]
296  double fraction = (limits[index + 1] - begin) / (end - begin);
297  assert(fraction < 1.);
298  std::pair<MaterialAccountingStep, MaterialAccountingStep> parts = step.split(fraction);
299 
300  if (m_plotter) {
301  if (index > 0)
303  else
304  // track outside acceptance, keep as unassocated
306 
307  if (index + 1 < detectors)
309  else
310  // track outside acceptance, keep as unassocated
312  }
313 
314  track.detectors()[index].account(parts.first, begin, limits[index + 1]);
315  ++index; // next layer
316  if (index < detectors)
317  track.detectors()[index].account(parts.second, limits[index + 1], end);
318  }
319  begin = end;
320  }
321  }
322 
323  // add the material from each detector to its layer (if there is one and only one)
324  for (unsigned int i = 0; i < track.detectors().size(); ++i)
325  if (group[i] != 0)
326  m_groups[group[i] - 1]->addDetector(track.detectors()[i]);
327 
328  // end of track: commit internal buffers and reset the m_groups internal state for a new track
329  for (unsigned int i = 0; i < m_groups.size(); ++i)
330  m_groups[i]->endOfTrack();
331 }
332 
333 //-------------------------------------------------------------------------
334 // find the layer index (0: none, 1-3: PixelBarrel,
335 // 4-7: TID, 8-13: TOB, 14-15,28-29: PixelEndcap,
336 // 16-18,30-32: TID, 19-27,33-41: TEC)
338  int index = 0;
339  size_t inside = 0;
340  for (size_t i = 0; i < m_groups.size(); ++i)
341  if (m_groups[i]->isInside(detector)) {
342  ++inside;
343  index = i + 1;
344  }
345  if (inside == 0) {
346  index = 0;
347  std::cerr << "TrackingMaterialAnalyser::findLayer(...): ERROR: detector does not belong to any DetLayer"
348  << std::endl;
349  std::cerr << "TrackingMaterialAnalyser::findLayer(...): detector position: " << std::fixed
350  << " (r: " << std::setprecision(1) << std::setw(5) << detector.position().perp()
351  << ", z: " << std::setprecision(1) << std::setw(6) << detector.position().z()
352  << ", phi: " << std::setprecision(3) << std::setw(6) << detector.position().phi() << ")" << std::endl;
353  }
354  if (inside > 1) {
355  index = 0;
356  std::cerr << "TrackingMaterialAnalyser::findLayer(...): ERROR: detector belongs to " << inside << " DetLayers"
357  << std::endl;
358  std::cerr << "TrackingMaterialAnalyser::findLayer(...): detector position: " << std::fixed
359  << " (r: " << std::setprecision(1) << std::setw(5) << detector.position().perp()
360  << ", z: " << std::setprecision(1) << std::setw(6) << detector.position().z()
361  << ", phi: " << std::setprecision(3) << std::setw(6) << detector.position().phi() << ")" << std::endl;
362  }
363 
364  return index;
365 }
366 
367 //-------------------------------------------------------------------------
368 // define as a plugin
DD4hep_TrackingMaterialAnalyser::m_groupNames
std::vector< std::string > m_groupNames
Definition: DD4hep_TrackingMaterialAnalyser.h:46
MuonGeometrySanityCheck_cfi.detectors
def detectors(dt=True, csc=True, me42=False, chambers=True, superlayers=False, layers=False)
Definition: MuonGeometrySanityCheck_cfi.py:13
DD4hep_MaterialAccountingGroup::tracks
unsigned int tracks(void) const
Definition: DD4hep_MaterialAccountingGroup.h:68
alignBH_cfg.fixed
fixed
Definition: alignBH_cfg.py:54
DD4hep_TrackingMaterialPlotter
Definition: DD4hep_TrackingMaterialPlotter.h:16
mps_fire.i
i
Definition: mps_fire.py:355
ESTransientHandle.h
MessageLogger.h
MaterialAccountingStep.h
step
step
Definition: StallMonitor.cc:94
edm::errors::LogicError
Definition: EDMException.h:37
DD4hep_TrackingMaterialAnalyser::INNER_LAYER
Definition: DD4hep_TrackingMaterialAnalyser.h:22
DD4hep_TrackingMaterialAnalyser::saveLayerPlots
void saveLayerPlots()
Definition: DD4hep_TrackingMaterialAnalyser.cc:116
edm
HLT enums.
Definition: AlignableModifier.h:19
DD4hep_TrackingMaterialAnalyser::m_saveParameters
bool m_saveParameters
Definition: DD4hep_TrackingMaterialAnalyser.h:41
gather_cfg.cout
cout
Definition: gather_cfg.py:144
DD4hep_TrackingMaterialAnalyser::m_splitMode
SplitMode m_splitMode
Definition: DD4hep_TrackingMaterialAnalyser.h:36
cms::cuda::assert
assert(be >=bs)
DD4hep_MaterialAccountingGroup::sigmaRadiationLengths
double sigmaRadiationLengths(void) const
Definition: DD4hep_MaterialAccountingGroup.cc:227
DD4hep_TrackingMaterialAnalyser::m_saveXml
bool m_saveXml
Definition: DD4hep_TrackingMaterialAnalyser.h:42
DD4hep_TrackingMaterialAnalyser.h
DD4hep_TrackingMaterialAnalyser::UNDEFINED
Definition: DD4hep_TrackingMaterialAnalyser.h:22
DD4hep_MaterialAccountingGroup::sigmaLength
double sigmaLength(void) const
Definition: DD4hep_MaterialAccountingGroup.cc:223
edm::Handle
Definition: AssociativeIterator.h:50
DD4hep_TrackingMaterialPlotter::plotSegmentInLayer
void plotSegmentInLayer(const MaterialAccountingStep &step, int layer)
Definition: DD4hep_TrackingMaterialPlotter.cc:136
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
end
#define end
Definition: vmac.h:39
parameters
parameters
Definition: BeamSpot_PayloadInspector.cc:14
EDMException.h
DD4hep_TrackingMaterialAnalyser::analyze
void analyze(const edm::Event &, const edm::EventSetup &) override
Definition: DD4hep_TrackingMaterialAnalyser.cc:143
MakerMacros.h
DD4hep_TrackingMaterialAnalyser::m_isHGCal
bool m_isHGCal
Definition: DD4hep_TrackingMaterialAnalyser.h:43
contentValuesFiles.parts
parts
Definition: contentValuesFiles.py:58
DD4hep_TrackingMaterialPlotter.h
DD4hep_MaterialAccountingGroup
Definition: DD4hep_MaterialAccountingGroup.h:23
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
MaterialAccountingDetector
Definition: MaterialAccountingDetector.h:15
DD4hep_TrackingMaterialAnalyser::m_groups
std::vector< DD4hep_MaterialAccountingGroup * > m_groups
Definition: DD4hep_TrackingMaterialAnalyser.h:45
dqm-mbProfile.format
format
Definition: dqm-mbProfile.py:16
MaterialAccountingTrack.h
DD4hep_TrackingMaterialAnalyser::endJob
void endJob() override
Definition: DD4hep_TrackingMaterialAnalyser.cc:124
DDCompactView.h
OrderedSet.t
t
Definition: OrderedSet.py:90
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
DD4hep_TrackingMaterialAnalyser::m_skipBeforeFirstDetector
bool m_skipBeforeFirstDetector
Definition: DD4hep_TrackingMaterialAnalyser.h:38
DD4hep_MaterialAccountingGroup::averageLength
double averageLength(void) const
Definition: DD4hep_MaterialAccountingGroup.cc:215
edm::ParameterSet
Definition: ParameterSet.h:36
Event.h
beam_dqm_sourceclient-live_cfg.cerr
cerr
Definition: beam_dqm_sourceclient-live_cfg.py:17
DD4hep_MaterialAccountingGroup::sigmaEnergyLoss
double sigmaEnergyLoss(void) const
Definition: DD4hep_MaterialAccountingGroup.cc:233
DD4hep_TrackingMaterialAnalyser::NEAREST_LAYER
Definition: DD4hep_TrackingMaterialAnalyser.h:22
ModuleDef.h
DD4hep_TrackingMaterialAnalyser::m_saveSummaryPlot
bool m_saveSummaryPlot
Definition: DD4hep_TrackingMaterialAnalyser.h:39
MaterialAccountingTrack
Definition: MaterialAccountingTrack.h:11
DD4hep_TrackingMaterialAnalyser::m_plotter
DD4hep_TrackingMaterialPlotter * m_plotter
Definition: DD4hep_TrackingMaterialAnalyser.h:47
DD4hep_TrackingMaterialAnalyser::saveXml
void saveXml(const char *name)
Definition: DD4hep_TrackingMaterialAnalyser.cc:100
edm::LogVerbatim
Definition: MessageLogger.h:297
DD4hep_TrackingMaterialAnalyser::OUTER_LAYER
Definition: DD4hep_TrackingMaterialAnalyser.h:22
IdealGeometryRecord.h
edm::EventSetup
Definition: EventSetup.h:57
DD4hep_MaterialAccountingGroup::savePlots
void savePlots(void)
Definition: DD4hep_MaterialAccountingGroup.cc:151
DD4hep_TrackingMaterialPlotter::plotSegmentUnassigned
void plotSegmentUnassigned(const MaterialAccountingStep &step)
Definition: DD4hep_TrackingMaterialPlotter.cc:125
get
#define get
DD4hep_TrackingMaterialAnalyser::m_saveDetailedPlots
bool m_saveDetailedPlots
Definition: DD4hep_TrackingMaterialAnalyser.h:40
edm::ESTransientHandle
Definition: ESTransientHandle.h:41
DD4hep_TrackingMaterialAnalyser::~DD4hep_TrackingMaterialAnalyser
~DD4hep_TrackingMaterialAnalyser() override
Definition: DD4hep_TrackingMaterialAnalyser.cc:66
DD4hep_MaterialAccountingGroup::averageEnergyLoss
double averageEnergyLoss(void) const
Definition: DD4hep_MaterialAccountingGroup.cc:219
TH2PolyOfflineMaps.limits
limits
Definition: TH2PolyOfflineMaps.py:45
DD4hep_TrackingMaterialAnalyser::m_skipAfterLastDetector
bool m_skipAfterLastDetector
Definition: DD4hep_TrackingMaterialAnalyser.h:37
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
MaterialAccountingStep
Definition: MaterialAccountingStep.h:9
DD4hep_TrackingMaterialAnalyser
Definition: DD4hep_TrackingMaterialAnalyser.h:16
Exception
Definition: hltDiff.cc:246
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
EventSetup.h
or
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
DD4hep_MaterialAccountingGroup::averageRadiationLengths
double averageRadiationLengths(void) const
Definition: DD4hep_MaterialAccountingGroup.cc:237
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
DD4hep_TrackingMaterialAnalyser::m_materialToken
edm::EDGetTokenT< std::vector< MaterialAccountingTrack > > m_materialToken
Definition: DD4hep_TrackingMaterialAnalyser.h:35
hgcalTestNeighbor_cfi.detector
detector
Definition: hgcalTestNeighbor_cfi.py:6
DD4hep_TrackingMaterialAnalyser::m_isHFNose
bool m_isHFNose
Definition: DD4hep_TrackingMaterialAnalyser.h:44
HLT_2018_cff.track
track
Definition: HLT_2018_cff.py:10352
DD4hep_TrackingMaterialAnalyser::split
void split(MaterialAccountingTrack &track)
Definition: DD4hep_TrackingMaterialAnalyser.cc:179
DD4hep_TrackingMaterialAnalyser::saveParameters
void saveParameters(const char *name)
Definition: DD4hep_TrackingMaterialAnalyser.cc:72
ParameterSet.h
DD4hep_TrackingMaterialPlotter::draw
void draw(void)
Definition: DD4hep_TrackingMaterialPlotter.cc:147
DD4hep_MaterialAccountingGroup::name
const std::string & name(void) const
Definition: DD4hep_MaterialAccountingGroup.h:69
event
Definition: event.py:1
edm::Event
Definition: Event.h:73
HLT_2018_cff.fraction
fraction
Definition: HLT_2018_cff.py:51317
edm::InputTag
Definition: InputTag.h:15
begin
#define begin
Definition: vmac.h:32
IdealGeometryRecord
Definition: IdealGeometryRecord.h:27
DD4hep_TrackingMaterialAnalyser::DD4hep_TrackingMaterialAnalyser
DD4hep_TrackingMaterialAnalyser(const edm::ParameterSet &)
Definition: DD4hep_TrackingMaterialAnalyser.cc:27
DD4hep_TrackingMaterialPlotter::normalize
void normalize(void)
Definition: DD4hep_TrackingMaterialPlotter.h:24
DD4hep_TrackingMaterialAnalyser::findLayer
int findLayer(const MaterialAccountingDetector &detector)
Definition: DD4hep_TrackingMaterialAnalyser.cc:337
watchdog.group
group
Definition: watchdog.py:82