ATLAS Offline Software
Loading...
Searching...
No Matches
EFMuonMon.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "EFMuonMon.h"
6
8#include "MuonMatchingTool.h"
11
12EFMuonMon :: EFMuonMon(const std::string& name, ISvcLocator* pSvcLocator )
13 : TrigMuonMonitorAlgorithm(name, pSvcLocator)
14{}
15
16
17StatusCode EFMuonMon :: initialize(){
19 ATH_CHECK( m_EFSAMuonContainerKey.initialize() );
20 ATH_CHECK( m_EFCBMuonContainerKey.initialize() );
21 ATH_CHECK( m_MStrackContainerKey.initialize() );
22 ATH_CHECK( m_CBtrackContainerKey.initialize() );
23 ATH_CHECK( m_muonIso30Key.initialize() );
24
25 for( const std::string& chain : m_monitored_chains ){
26 m_doEFSA[chain] = true;
27
28 if( chain.find("msonly") != std::string::npos ) m_doEFCB[chain] = false;
29 else m_doEFCB[chain] = true;
30
31 if( chain.find("ivar") != std::string::npos ) m_doEFIso[chain] = true;
32 else m_doEFIso[chain] = false;
33 }
34
35 return sc;
36}
37
38
39StatusCode EFMuonMon :: fillVariablesPerChain(const EventContext &ctx, const std::string &chain) const {
40
41 ATH_MSG_DEBUG ("Filling histograms for " << name() << "...");
42
43 const float ZERO_LIMIT = 0.00001;
44
45 // EFSA
46 if( m_doEFSA.at(chain) ){
47 std::vector< TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> > featureContSA = getTrigDecisionTool()->features<xAOD::MuonContainer>( chain, TrigDefs::includeFailedDecisions, "HLT_Muons_.*");
48
49 for (const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer>& muSALinkInfo : featureContSA) {
50 ATH_CHECK( muSALinkInfo.isValid() );
51 const ElementLink<xAOD::MuonContainer> muSAEL = muSALinkInfo.link;
52 if ( (*muSAEL)->muonType() != xAOD::Muon::MuonType::MuonStandAlone ) continue;
53
54 auto EFSAPt = Monitored::Scalar<float>(chain+"_EFSA_Pt", -999.);
55 auto EFSAEta = Monitored::Scalar<float>(chain+"_EFSA_Eta", -999.);
56 auto EFSAPhi = Monitored::Scalar<float>(chain+"_EFSA_Phi", -999.);
57
58 EFSAPt = (*muSAEL)->pt()/1e3 * (*muSAEL)->charge();
59 EFSAEta = (*muSAEL)->eta();
60 EFSAPhi = (*muSAEL)->phi();
61
62 fill(m_group+"_"+chain, EFSAPt, EFSAEta, EFSAPhi);
63 }
64 }
65
66
67 // EFCB
68 if( m_doEFCB.at(chain) ){
69 std::vector< TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> > featureContCB = getTrigDecisionTool()->features<xAOD::MuonContainer>( chain, TrigDefs::includeFailedDecisions, "HLT_MuonsCB.*");
70
71 for (const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer>& muCBLinkInfo : featureContCB) {
72 ATH_CHECK( muCBLinkInfo.isValid() );
73 const ElementLink<xAOD::MuonContainer> muCBEL = muCBLinkInfo.link;
74 if ( (*muCBEL)->muonType() != xAOD::Muon::MuonType::Combined ) continue;
75
76 auto EFCBPt = Monitored::Scalar<float>(chain+"_EFCB_Pt", -999.);
77 auto EFCBEta = Monitored::Scalar<float>(chain+"_EFCB_Eta", -999.);
78 auto EFCBPhi = Monitored::Scalar<float>(chain+"_EFCB_Phi", -999.);
79
80 EFCBPt = (*muCBEL)->pt()/1e3 * (*muCBEL)->charge();
81 EFCBEta = (*muCBEL)->eta();
82 EFCBPhi = (*muCBEL)->phi();
83
84 fill(m_group+"_"+chain, EFCBPt, EFCBEta, EFCBPhi);
85 }
86 }
87
88
89 // EFIso
90 if( m_doEFIso.at(chain) ){
91 std::vector< TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> > featureContIso = getTrigDecisionTool()->features<xAOD::MuonContainer>( chain, TrigDefs::includeFailedDecisions, "HLT_MuonsIso");
92 for (const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer>& muIsoLinkInfo : featureContIso) {
93 ATH_CHECK( muIsoLinkInfo.isValid() );
94 const ElementLink<xAOD::MuonContainer> muIsoEL = muIsoLinkInfo.link;
95 if ( (*muIsoEL)->muonType() != xAOD::Muon::MuonType::Combined ) continue;
96
97 // basic variables used decision
98 auto PtCone03 = Monitored::Scalar<float>(chain+"_PtCone03",-999.);
99 auto PtCone03overMuonPt = Monitored::Scalar<float>(chain+"_PtCone03overMuonPt",-999.);
100
102 float ptcone30 = muonIso30(*(*muIsoEL));
103
104 if (ptcone30 > ZERO_LIMIT ){
105 PtCone03 = ptcone30/1e3;
106 PtCone03overMuonPt = ptcone30 / (*muIsoEL)->pt();
107 }
108
109 fill(m_group+"_"+chain, PtCone03, PtCone03overMuonPt);
110 }
111 }
112
113 return StatusCode::SUCCESS;
114}
115
116
117StatusCode EFMuonMon :: fillVariablesPerOfflineMuonPerChain(const EventContext &ctx, const xAOD::Muon* mu, const std::string &chain) const {
118
119 ATH_MSG_DEBUG ("Filling histograms for " << name() << "...");
120
121 const float ZERO_LIMIT = 0.00001;
122
123 const xAOD::TrackParticle* OfflineSATrack = mu->trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
124 const xAOD::TrackParticle* OfflineCBTrack = mu->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle);
125
126
127 // OfflineSA
128 if( m_doEFSA.at(chain) && OfflineSATrack ){
129 auto OfflineSAPt = Monitored::Scalar<float>(chain+"_OfflineSA_Pt",-999.);
130 auto OfflineSAEta = Monitored::Scalar<float>(chain+"_OfflineSA_Eta",-999.);
131 auto OfflineSAPhi = Monitored::Scalar<float>(chain+"_OfflineSA_Phi",-999.);
132
133 auto matchedEFSA = Monitored::Scalar<bool>(chain+"_matchedEFSA",false);
134 auto matchedL2SA = Monitored::Scalar<bool>(chain+"_matchedL2SA",false);
135
136 auto OfflineSAmatchedL2SAPt = Monitored::Scalar<float>(chain+"_OfflineSAmatchedL2SA_Pt",-999.);
137 auto OfflineSAmatchedL2SAEta = Monitored::Scalar<float>(chain+"_OfflineSAmatchedL2SA_Eta",-999.);
138 auto OfflineSAmatchedL2SAPhi = Monitored::Scalar<float>(chain+"_OfflineSAmatchedL2SA_Phi",-999.);
139
140 auto MatchedEFSAPt = Monitored::Scalar<float>(chain+"_MatchedEFSA_Pt",-999.);
141 auto MatchedEFSAEta = Monitored::Scalar<float>(chain+"_MatchedEFSA_Eta",-999.);
142 auto MatchedEFSAPhi = Monitored::Scalar<float>(chain+"_MatchedEFSA_Phi",-999.);
143
144 auto SAdR = Monitored::Scalar<float>(chain+"_SAdR",1000.);
145 auto SAdPt = Monitored::Scalar<float>(chain+"_SAdPt",-999.);
146 auto SAdEta = Monitored::Scalar<float>(chain+"_SAdEta",-999.);
147 auto SAdPhi = Monitored::Scalar<float>(chain+"_SAdPhi",-999.);
148
149 // basic EDM variables
150 OfflineSAPt = OfflineSATrack->pt()/1e3 * OfflineSATrack->charge(); // convert to GeV
151 OfflineSAEta = OfflineSATrack->eta();
152 OfflineSAPhi = OfflineSATrack->phi();
153
154 // correlation histograms EFSA vs. OfflineSA
155 // get the EFSA muon matched to offlineSA muon
156 const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> EFSAMuonLinkInfo = m_matchTool->matchEFSALinkInfo(mu, chain);
157 if( EFSAMuonLinkInfo.isValid() ){
158 const xAOD::TrackParticle* EFSATrack = m_matchTool->SearchEFTrack(ctx, EFSAMuonLinkInfo, m_MStrackContainerKey);
159 if ( EFSATrack ){
160 matchedEFSA = true;
161
162 MatchedEFSAPt = EFSATrack->pt()/1e3 * EFSATrack->charge(); // convert to GeV
163 MatchedEFSAEta = EFSATrack->eta();
164 MatchedEFSAPhi = EFSATrack->phi();
165
166 SAdR = xAOD::P4Helpers::deltaR(OfflineSATrack, EFSATrack, false);
167 SAdPt = std::abs(OfflineSAPt) - std::abs(MatchedEFSAPt);
168 SAdEta = OfflineSAEta - MatchedEFSAEta;
169 SAdPhi = OfflineSAPhi - MatchedEFSAPhi;
170
171
172 // correlation histograms offlineSA (matched to EFSA) vs. offlineSA (matched to L2SA)
173 // get L2SA feature
174 const TrigCompositeUtils::Decision* EFSAMuonDecision = EFSAMuonLinkInfo.source;
175 const std::vector<TrigCompositeUtils::LinkInfo<xAOD::L2StandAloneMuonContainer>> L2SALinkInfo = TrigCompositeUtils::findLinks<xAOD::L2StandAloneMuonContainer>(EFSAMuonDecision, "feature");
176 if(L2SALinkInfo.size() > 1) {
177 ATH_MSG_DEBUG("More than one L2SA candidate associated to the EFSA");
178 }
179 ATH_CHECK( L2SALinkInfo.at(0).isValid());
180 const ElementLink<xAOD::L2StandAloneMuonContainer> L2SAEL = L2SALinkInfo.at(0).link;
181
182 // get offline muon matched to L2SA
183 const xAOD::Muon *OfflineSAmatchedL2SA = m_matchTool->matchL2SAtoOff(ctx, (*L2SAEL));
184 if (OfflineSAmatchedL2SA){
185 const xAOD::TrackParticle* OfflineSATrackmatchedL2SA = OfflineSAmatchedL2SA->trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
186 if ( OfflineSATrackmatchedL2SA ){
187 matchedL2SA = true;
188 OfflineSAmatchedL2SAPt = OfflineSATrackmatchedL2SA->pt()/1e3 * OfflineSATrackmatchedL2SA->charge(); // convert to GeV
189 OfflineSAmatchedL2SAEta = OfflineSATrackmatchedL2SA->eta();
190 OfflineSAmatchedL2SAPhi = OfflineSATrackmatchedL2SA->phi();
191 }
192 }
193 }
194 }
195 fill(m_group+"_"+chain, OfflineSAPt, OfflineSAEta, OfflineSAPhi, OfflineSAmatchedL2SAPt, OfflineSAmatchedL2SAEta, OfflineSAmatchedL2SAPhi,
196 MatchedEFSAPt, MatchedEFSAEta, MatchedEFSAPhi, SAdPt, SAdEta, SAdPhi, SAdR, matchedEFSA, matchedL2SA);
197 }
198
199
200 // OfflineCB
201 if( m_doEFCB.at(chain) && OfflineCBTrack ){
202 auto OfflineCBPt = Monitored::Scalar<float>(chain+"_OfflineCB_Pt",-999.);
203 auto OfflineCBEta = Monitored::Scalar<float>(chain+"_OfflineCB_Eta",-999.);
204 auto OfflineCBPhi = Monitored::Scalar<float>(chain+"_OfflineCB_Phi",-999.);
205
206 auto matchedEFCB = Monitored::Scalar<bool>(chain+"_matchedEFCB",false);
207 auto matchedL2CB = Monitored::Scalar<bool>(chain+"_matchedL2CB",false);
208
209 auto OfflineCBmatchedL2CBPt = Monitored::Scalar<float>(chain+"_OfflineCBmatchedL2CB_Pt",-999.);
210 auto OfflineCBmatchedL2CBEta = Monitored::Scalar<float>(chain+"_OfflineCBmatchedL2CB_Eta",-999.);
211 auto OfflineCBmatchedL2CBPhi = Monitored::Scalar<float>(chain+"_OfflineCBmatchedL2CB_Phi",-999.);
212
213 auto MatchedEFCBPt = Monitored::Scalar<float>(chain+"_MatchedEFCB_Pt",-999.);
214 auto MatchedEFCBEta = Monitored::Scalar<float>(chain+"_MatchedEFCB_Eta",-999.);
215 auto MatchedEFCBPhi = Monitored::Scalar<float>(chain+"_MatchedEFCB_Phi",-999.);
216
217 auto CBdR = Monitored::Scalar<float>(chain+"_CBdR",1000.);
218 auto CBdPt = Monitored::Scalar<float>(chain+"_CBdPt",-999.);
219 auto CBdEta = Monitored::Scalar<float>(chain+"_CBdEta",-999.);
220 auto CBdPhi = Monitored::Scalar<float>(chain+"_CBdPhi",-999.);
221
222 // basic EDM variables
223 OfflineCBPt = OfflineCBTrack->pt()/1e3 * OfflineCBTrack->charge(); // convert to GeV
224 OfflineCBEta = OfflineCBTrack->eta();
225 OfflineCBPhi = OfflineCBTrack->phi();
226
227 // correlation histograms EFCB vs. OfflineCB
228 // get the closest EFCB muon
229 const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> EFCBMuonLinkInfo = m_matchTool->matchEFCBLinkInfo(mu, chain);
230 if( EFCBMuonLinkInfo.isValid() ){
231 const xAOD::TrackParticle* EFCBTrack = m_matchTool->SearchEFTrack(ctx, EFCBMuonLinkInfo, m_CBtrackContainerKey);
232 if ( EFCBTrack ){
233 matchedEFCB = true;
234
235 MatchedEFCBPt = EFCBTrack->pt()/1e3 * EFCBTrack->charge(); // convert to GeV
236 MatchedEFCBEta = EFCBTrack->eta();
237 MatchedEFCBPhi = EFCBTrack->phi();
238
239 CBdR = xAOD::P4Helpers::deltaR(OfflineCBTrack, EFCBTrack, false);
240 CBdPt = std::abs(OfflineCBPt) - std::abs(MatchedEFCBPt);
241 CBdEta = OfflineCBEta - MatchedEFCBEta;
242 CBdPhi = OfflineCBPhi - MatchedEFCBPhi;
243
244
245 // correlation histograms offlineCB (matched to EFCB) vs. offlineCB (matched to L2CB)
246 // get L2CB feature
247 const TrigCompositeUtils::Decision* EFCBMuonDecision = EFCBMuonLinkInfo.source;
248 const std::vector<TrigCompositeUtils::LinkInfo<xAOD::L2CombinedMuonContainer>>L2CBLinkInfo = TrigCompositeUtils::findLinks<xAOD::L2CombinedMuonContainer>(EFCBMuonDecision, "feature");
249 if(L2CBLinkInfo.size() >1) {
250 ATH_MSG_DEBUG("More than one L2CB muon associated to EFCBMuon");
251 }
252 ATH_CHECK( L2CBLinkInfo.at(0).isValid() );
253 const ElementLink<xAOD::L2CombinedMuonContainer> L2CBEL = L2CBLinkInfo.at(0).link;
254
255 // get offline muon matched to L2CB
256 const xAOD::Muon *OfflineCBmatchedL2CB = m_matchTool->matchL2CBtoOff(ctx, (*L2CBEL));
257 if (OfflineCBmatchedL2CB){
258 const xAOD::TrackParticle* OfflineCBTrackmatchedL2CB = OfflineCBmatchedL2CB->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle);
259 if ( OfflineCBTrackmatchedL2CB ){
260 matchedL2CB = true;
261 OfflineCBmatchedL2CBPt = OfflineCBTrackmatchedL2CB->pt()/1e3 * OfflineCBTrackmatchedL2CB->charge(); // convert to GeV
262 OfflineCBmatchedL2CBEta = OfflineCBTrackmatchedL2CB->eta();
263 OfflineCBmatchedL2CBPhi = OfflineCBTrackmatchedL2CB->phi();
264 }
265 }
266 }
267 }
268 fill(m_group+"_"+chain, OfflineCBPt, OfflineCBEta, OfflineCBPhi, OfflineCBmatchedL2CBPt, OfflineCBmatchedL2CBEta, OfflineCBmatchedL2CBPhi,
269 MatchedEFCBPt, MatchedEFCBEta, MatchedEFCBPhi, CBdPt, CBdEta, CBdPhi, CBdR, matchedEFCB, matchedL2CB);
270 }
271
272
273 // offoine isolation variable
274 float OfflineIsoptcone30=-1.;
275 mu->isolation(OfflineIsoptcone30, xAOD::Iso::IsolationType::ptvarcone30);
276 if ( m_doEFIso.at(chain) && OfflineIsoptcone30 > ZERO_LIMIT ){
277
278 auto OfflineIsoPtCone03 = Monitored::Scalar<float>(chain+"_OfflineIsoPtCone03",-999.);
279 auto OfflineIsoPtCone03overMuonPt = Monitored::Scalar<float>(chain+"_OfflineIsoPtCone03overMuonPt",-999.);
280 auto MatchedEFIsoPtCone03 = Monitored::Scalar<float>(chain+"_MatchedEFPIsotCone03",-999.);
281 auto MatchedEFIsoPtCone03overMuonPt = Monitored::Scalar<float>(chain+"_MatchedEFIsoPtCone03overMuonPt",-999.);
282
283 OfflineIsoPtCone03 = OfflineIsoptcone30/1e3;
284 OfflineIsoPtCone03overMuonPt = OfflineIsoptcone30 / mu->pt();
285
286 // get the closest EFIso muon
287 const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> EFIsoMuonLinkInfo = m_matchTool->matchEFIsoLinkInfo(mu, chain);
288 if( EFIsoMuonLinkInfo.isValid() ){
289 const ElementLink<xAOD::MuonContainer> EFIsoMuon = EFIsoMuonLinkInfo.link;
290
292 float EFIsoptcone30 = muonIso30(*(*EFIsoMuon));
293
294 if ( EFIsoptcone30 > ZERO_LIMIT ){
295 MatchedEFIsoPtCone03 = EFIsoptcone30/1e3;
296 MatchedEFIsoPtCone03overMuonPt = EFIsoptcone30 / (*EFIsoMuon)->pt();
297 }
298 }
299 fill(m_group+"_"+chain, OfflineIsoPtCone03, OfflineIsoPtCone03overMuonPt, MatchedEFIsoPtCone03, MatchedEFIsoPtCone03overMuonPt);
300 }
301
302 return StatusCode::SUCCESS;
303}
304
305
306StatusCode EFMuonMon :: fillVariables(const EventContext &ctx) const {
307
308 ATH_MSG_DEBUG ("Filling histograms for " << name() << "...");
309
312
313 return StatusCode::SUCCESS;
314
315}
316
317
318StatusCode EFMuonMon :: fillVariablesPerOfflineMuon(const EventContext &ctx, const xAOD::Muon* mu) const {
319
320 ATH_CHECK( fillVariablesRatioPlots<xAOD::Muon>(ctx, mu, "EFSA", xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle,
321 [this](const EventContext &ctx, const xAOD::Muon *mu){ return m_matchTool->matchEFSAReadHandle(ctx,mu); }
322 ));
323
324 ATH_CHECK( fillVariablesRatioPlots<xAOD::Muon>(ctx, mu, "EFCB", xAOD::Muon::TrackParticleType::CombinedTrackParticle,
325 [this](const EventContext &ctx, const xAOD::Muon *mu){ return m_matchTool->matchEFCBReadHandle(ctx,mu); }
326 ));
327
328 return StatusCode::SUCCESS;
329
330}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
static Double_t sc
Handle class for reading a decoration on an object.
const float ZERO_LIMIT
const ToolHandle< Trig::TrigDecisionTool > & getTrigDecisionTool() const
Get the trigger decision tool member.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_MStrackContainerKey
Definition EFMuonMon.h:30
std::map< std::string, bool > m_doEFCB
Definition EFMuonMon.h:35
SG::ReadHandleKey< xAOD::MuonContainer > m_EFCBMuonContainerKey
Definition EFMuonMon.h:29
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_CBtrackContainerKey
Definition EFMuonMon.h:31
SG::ReadDecorHandleKey< xAOD::MuonContainer > m_muonIso30Key
Definition EFMuonMon.h:32
std::map< std::string, bool > m_doEFIso
Definition EFMuonMon.h:36
SG::ReadHandleKey< xAOD::MuonContainer > m_EFSAMuonContainerKey
Definition EFMuonMon.h:28
std::map< std::string, bool > m_doEFSA
Definition EFMuonMon.h:34
Declare a monitored scalar variable.
static std::tuple< bool, double, double > trigPosForMatchSATrack(const xAOD::Muon *mu)
static std::tuple< bool, double, double > trigPosForMatchCBTrack(const xAOD::Muon *mu)
Handle class for reading a decoration on an object.
StatusCode fillVariablesRatioPlots(const EventContext &ctx, const xAOD::Muon *mu, std::string &&trigstep, xAOD::Muon::TrackParticleType type, FUNCT matchFunc) const
Function that fills variables of ratio plots.
Gaudi::Property< std::string > m_group
Name of monitored group.
TrigMuonMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< std::vector< std::string > > m_monitored_chains
List of trigger chains that are monitored in fillVariablesPerChain and fillVariablesPerOfflineMuonPer...
StatusCode fillVariableEtaPhi(const EventContext &ctx, SG::ReadHandleKey< DataVector< T > > ReadHandleKey, std::string &&trigstep, std::tuple< bool, double, double >(*PosFunc)(const T *)=&TrigMuonMonitorAlgorithm::defaultPosFunc< T >) const
Function that fills variables of etaphi2D plots.
virtual StatusCode initialize() override
initialize
ToolHandle< MuonMatchingTool > m_matchTool
const TrackParticle * trackParticle(TrackParticleType type) const
Returns a pointer (which can be NULL) to the TrackParticle used in identification of this muon.
Definition Muon_v1.cxx:482
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float charge() const
Returns the charge.
void findLinks(const Decision *start, const std::string &linkName, std::vector< LinkInfo< T > > &links, unsigned int behaviour=TrigDefs::allFeaturesOfType, std::set< const xAOD::TrigComposite * > *fullyExploredFrom=nullptr)
search back the TC links for the object of type T linked to the one of TC (recursively) Populates pro...
static const unsigned int includeFailedDecisions
Run3 synonym of alsoDeactivateTEs.
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition LinkInfo.h:22
const Decision * source
The node in the NavGraph for this feature.
Definition LinkInfo.h:53
ElementLink< T > link
Link to the feature.
Definition LinkInfo.h:55
void fill(H5::Group &out_file, size_t iterations)