ATLAS Offline Software
TrackSelectionAlgs.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Header include
9 
11 
12 #include <iostream>
13 
14 #include "TH1D.h"
15 #include "TNtuple.h"
16 #include "TTree.h"
17 #include "TROOT.h"
18 
19 //-------------------------------------------------
20 
21 using namespace std;
22 
23 namespace VKalVrtAthena {
24 
25 
26  //____________________________________________________________________________________________________
27  bool VrtSecInclusive::selectTrack_d0Cut ( const xAOD::TrackParticle* trk ) const { return ( fabs( trk->d0() ) > m_jp.d0TrkPVDstMinCut && fabs( trk->d0() ) < m_jp.d0TrkPVDstMaxCut ); }
28  bool VrtSecInclusive::selectTrack_z0Cut ( const xAOD::TrackParticle* trk ) const { return ( fabs( trk->z0() ) > m_jp.z0TrkPVDstMinCut && fabs( trk->z0() ) < m_jp.z0TrkPVDstMaxCut ); }
29  bool VrtSecInclusive::selectTrack_d0errCut ( const xAOD::TrackParticle* trk ) const { const double cov11 = trk->definingParametersCovMatrix()(0,0); return cov11 < m_jp.d0TrkErrorCut*m_jp.d0TrkErrorCut; }
30  bool VrtSecInclusive::selectTrack_z0errCut ( const xAOD::TrackParticle* trk ) const { const double cov22 = trk->definingParametersCovMatrix()(1,1); return cov22 < m_jp.z0TrkErrorCut*m_jp.z0TrkErrorCut; }
31  bool VrtSecInclusive::selectTrack_d0signifCut ( const xAOD::TrackParticle* ) { return true; }
32  bool VrtSecInclusive::selectTrack_z0signifCut ( const xAOD::TrackParticle* ) { return true; }
33  bool VrtSecInclusive::selectTrack_pTCut ( const xAOD::TrackParticle* trk ) const { return trk->pt() > m_jp.TrkPtCut; }
34  bool VrtSecInclusive::selectTrack_chi2Cut ( const xAOD::TrackParticle* trk ) const { return trk->chiSquared() / (trk->numberDoF()+AlgConsts::infinitesimal) < m_jp.TrkChi2Cut; }
35 
36  //____________________________________________________________________________________________________
37  bool VrtSecInclusive::selectTrack_hitPattern( const xAOD::TrackParticle* trk ) const {
38 
39  uint8_t PixelHits = 0;
40  uint8_t SCTHits = 0;
41  uint8_t BLayHits = 0;
42  uint8_t PixShare = 0;
43  uint8_t SCTShare = 0;
44  uint8_t TRTHits = 0;
45 
46  if( !(trk->summaryValue( PixelHits, xAOD::numberOfPixelHits ) ) ) PixelHits =0;
47  if( !(trk->summaryValue( SCTHits, xAOD::numberOfSCTHits ) ) ) SCTHits =0;
48  if( !(trk->summaryValue( BLayHits, xAOD::numberOfInnermostPixelLayerHits ) ) ) BLayHits =0;
49  if( !(trk->summaryValue( PixShare, xAOD::numberOfPixelSharedHits ) ) ) PixShare =0;
50  if( !(trk->summaryValue( SCTShare, xAOD::numberOfSCTSharedHits ) ) ) SCTShare =0;
51  if( !(trk->summaryValue( TRTHits, xAOD::numberOfTRTHits ) ) ) TRTHits =0;
52 
53  uint8_t SharedHits = PixShare + SCTShare;
54 
55  // do Pixel/SCT/SiHits only if we exclude StandAlone TRT hits
56  if( !m_jp.SAloneTRT ) {
57  if(PixelHits < m_jp.CutPixelHits) return false;
58  if(SCTHits < m_jp.CutSctHits) return false;
59  if((PixelHits+SCTHits) < m_jp.CutSiHits) return false;
60  if(BLayHits < m_jp.CutBLayHits) return false;
61  if(SharedHits > m_jp.CutSharedHits) return false;
62  }
63 
64  // The folloing part reproduces the track selection in RPVDixpVrt
65  if( m_jp.doTRTPixCut ) {
66  if(TRTHits == 0 && PixelHits < 2) return false;
67  }
68 
69  if( PixelHits == 0 && SCTHits < 6 ) return false;
70 
71  return true;
72  }
73 
74  //____________________________________________________________________________________________________
75  bool VrtSecInclusive::selectTrack_hitPatternTight( const xAOD::TrackParticle* trk ) const {
76  uint8_t PixelHits = 0;
77  uint8_t SCTHits = 0;
78  uint8_t TRTHits = 0;
79 
80  if( !(trk->summaryValue( PixelHits, xAOD::numberOfPixelHits ) ) ) PixelHits =0;
81  if( !(trk->summaryValue( SCTHits, xAOD::numberOfSCTHits ) ) ) SCTHits =0;
82  if( !(trk->summaryValue( TRTHits, xAOD::numberOfTRTHits ) ) ) TRTHits =0;
83 
84  if( trk->pt() > 20.e3 ) return true;
85 
86  if( SCTHits < m_jp.CutTightSCTHits ) return false;
87 
88  if( fabs( trk->eta() ) < 1.7 ) {
89  if( TRTHits < m_jp.CutTightTRTHits ) return false;
90  }
91 
92  return true;
93  }
94 
95  //____________________________________________________________________________________________________
96  bool VrtSecInclusive::selectTrack_notPVassociated ( const xAOD::TrackParticle* trk ) const {
97  return !( VKalVrtAthena::isAssociatedToVertices( trk, m_primaryVertices ) );
98  }
99 
100  //____________________________________________________________________________________________________
101  bool VrtSecInclusive::selectTrack_LRTR3Cut( const xAOD::TrackParticle* trk ) const {
102  uint8_t npix = 0;
104  uint8_t nsct = 0;
106  uint8_t nSiHits = npix + nsct ;
107  uint8_t nSCTHoles=0;
108  trk->summaryValue(nSCTHoles, xAOD::numberOfSCTHoles);
109 
110  double dTheta = std::fabs(TMath::ATan2(std::fabs(trk->d0()),trk->z0())-2*std::atan(std::exp(-1*trk->eta())));
111  bool geometric_cut = dTheta < 1. || std::fabs(trk->z0()) < 200. ;
112 
113  bool z0_cut = trk->z0() <= 500. ;
114  bool chi2_cut = (trk->chiSquared()/ (trk->numberDoF()+AlgConsts::infinitesimal)) <= 9. ;
115  bool NSiHits_cut = nSiHits >=8 ;
116  bool NSCTHits_cut = nsct >= 7 ;
117  bool NSCTHoles_cut = nSCTHoles <= 1;
118 
119  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": z0_cut, chi2_cut, NSiHits_cut, NSCTHits_cut, NSCTHoles_cut = " <<z0_cut<<", "<<chi2_cut<<", "<<NSiHits_cut<<", "<<NSCTHits_cut<<", "<< NSCTHoles_cut );
120  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": npix, nsct, nSiHits, nSCTHoles, dTheta, z0, d0, chi2 = " <<unsigned(npix)<<", "<<unsigned(nsct)<<", "<<unsigned(nSiHits)<<", "<<unsigned(nSCTHoles)<<", "<< dTheta<<", "<< trk->z0()<<", "<< trk->d0()<<", " <<trk->chiSquared() ) ;
121 
122  const std::bitset<xAOD::NumberOfTrackRecoInfo> patternReco = trk->patternRecoInfo();
123  bool isLRT = patternReco.test(49) ;
124  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Track is LRT = " << isLRT ) ;
125  if (isLRT) { // apply all cuts to LRT tracks
126  return (z0_cut && chi2_cut && NSiHits_cut && NSCTHits_cut && NSCTHoles_cut && geometric_cut);
127  }
128  else{ // not LRT track; only apply SiHit cut
129  return NSiHits_cut ;
130  }
131  }
132 
133 
134  //____________________________________________________________________________________________________
135  void VrtSecInclusive::selectTrack( const xAOD::TrackParticle* trk ) {
136 
137  if( !m_decor_isSelected ) m_decor_isSelected = std::make_unique< SG::AuxElement::Decorator< char > >( "is_selected" + m_jp.augVerString );
138 
139  // Setup cut functions
140  if( m_trackSelectionFuncs.empty() && !m_jp.passThroughTrackSelection ) {
141 
142  // These cuts are optional. Specified by JobProperty
143  if( m_jp.do_PVvetoCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_notPVassociated );
144  if( m_jp.do_d0Cut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0Cut );
145  if( m_jp.do_z0Cut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0Cut );
146  if( m_jp.do_d0errCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0errCut );
147  if( m_jp.do_z0errCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0errCut );
148  if (m_jp.doSelectTracksWithLRTCuts) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_LRTR3Cut );
149  //if( m_jp.do_d0signifCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_d0signifCut ); // not implemented yet
150  //if( m_jp.do_z0signifCut ) m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_z0signifCut ); // not implemented yet
151 
152  // These cuts are used by default
153  m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_hitPattern );
154  m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_hitPatternTight );
155  m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_chi2Cut );
156  m_trackSelectionFuncs.emplace_back( &VrtSecInclusive::selectTrack_pTCut );
157 
158  }
159 
160  if( std::find( m_selectedTracks->begin(), m_selectedTracks->end(), trk ) != m_selectedTracks->end() ) return;
161 
162  std::vector<bool> cutBits;
163 
164  cutBits.reserve(m_trackSelectionFuncs.size());
165 for( auto func : m_trackSelectionFuncs ) cutBits.emplace_back( (this->*func)( trk ) );
166 
167  if( m_jp.FillHist ) {
168  m_hists["trkSelCuts"]->Fill( 0 );
169  for( size_t ibit = 0; ibit < cutBits.size(); ibit++) {
170  if( cutBits.at(ibit) ) {
171  m_hists["trkSelCuts"]->Fill( ibit+1 );
172  } else {
173  break;
174  }
175  }
176  }
177 
178  // Good track should not find any false bit
179  bool isGood_standard = ( std::find( cutBits.begin(), cutBits.end(), false ) == cutBits.end() );
180 
181  if( isGood_standard ) {
182 
183  // Store the selected track to the new m_selectedTracks
184  // Here we firstly need to register the empty pointer to the m_selectedTracks,
185  // then need to do deep copy after then. This is the feature of xAOD.
186 
187  unsigned long barcode=0;
188 
189  if( m_jp.doTruth ) {
190 
191  const auto* truth = getTrkGenParticle(trk);
192 
193  if ( truth ) {
194  barcode = truth->barcode();
195  }
196 
197  }
198 
199  (*m_decor_isSelected)( *trk ) = true;
200  if (m_jp.doSelectTracksFromElectrons || m_jp.doSelectIDAndGSFTracks) {
201  const xAOD::TrackParticle *id_tr;
203  if (id_tr != nullptr){
204  (*m_decor_isSelected)( *id_tr ) = true; }
205  }
206 
207  m_selectedTracks->emplace_back( trk );
208 
209  if( m_jp.FillNtuple ) m_ntupleVars->get< vector<int> >( "SelTrk_barcode" ).emplace_back(barcode); // will need this later
210 
211  ATH_MSG_VERBOSE( " > " << __FUNCTION__ << ": Track index " << trk->index() << " has been selected." );
212  ATH_MSG_VERBOSE( " > " << __FUNCTION__ << ": Track index " << trk->index()
213  << " parameter:"
214  << " pt = " << trk->pt()
215  << " eta = " << trk->eta()
216  << " d0 = " << trk->d0()
217  << " z0 = " << trk->z0() << "." );
218 
219  }
220 
221  }
222 
223  //____________________________________________________________________________________________________
224  StatusCode VrtSecInclusive::selectTracksInDet() {
225 
226  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": begin" );
227 
228  //--------------------------------------------------------
229  // Extract tracks from xAOD::TrackParticle container
230  //
231 
232  const xAOD::TrackParticleContainer* trackParticleContainer ( nullptr );
233  ATH_CHECK( evtStore()->retrieve( trackParticleContainer, m_jp.TrackLocation) );
234 
235  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Extracted xAOD::TrackParticle number=" << trackParticleContainer->size() );
236 
237  if( m_jp.FillNtuple )
238  m_ntupleVars->get<unsigned int>( "NumAllTrks" ) = static_cast<int>( trackParticleContainer->size() );
239 
240 
241  // Loop over tracks
242  for( const auto *trk : *trackParticleContainer ) { selectTrack( trk ); }
243 
244  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of total ID tracks = " << trackParticleContainer->size() );
245  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of selected tracks = " << m_selectedTracks->size() );
246 
247  return StatusCode::SUCCESS;
248  }
249 
250 
251  //____________________________________________________________________________________________________
252  StatusCode VrtSecInclusive::selectTracksFromMuons() {
253 
254  const xAOD::MuonContainer* muons ( nullptr );
255  ATH_CHECK( evtStore()->retrieve( muons, m_jp.MuonLocation) );
256 
257 
258  for( const auto *const muon : *muons ) {
259  const auto* trk = muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
260 
261  if( !trk ) continue;
262  // remove calo-tagged muons when selecting muons
263  if (m_jp.doRemoveCaloTaggedMuons) {
264  if (muon->muonType() == xAOD::Muon::CaloTagged) continue;
265  }
266  selectTrack( trk );
267 
268  }
269 
270  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of total muons = " << muons->size() );
271  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of selected tracks = " << m_selectedTracks->size() );
272 
273  return StatusCode::SUCCESS;
274  }
275 
276 
277  //____________________________________________________________________________________________________
278  StatusCode VrtSecInclusive::selectTracksFromElectrons() {
279 
280  const xAOD::ElectronContainer *electrons( nullptr );
281  ATH_CHECK( evtStore()->retrieve( electrons, m_jp.ElectronLocation ) );
282 
283  for( const auto *const electron : *electrons ) {
284  if( 0 == electron->nTrackParticles() ) continue;
285 
286  // The first track is the best-matched track
287  const auto* trk = electron->trackParticle(0);
288 
289  if( !trk ) continue;
290  selectTrack( trk );
291  }
292 
293  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of total electrons = " << electrons->size() );
294  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of selected tracks = " << m_selectedTracks->size() );
295 
296  return StatusCode::SUCCESS;
297  }
298 
299 
300  //____________________________________________________________________________________________________
301  StatusCode VrtSecInclusive::selectInDetAndGSFTracks() {
302 
303  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": begin" );
304 
305  //--------------------------------------------------------
306  // Extract tracks from xAOD::TrackParticle container
307  //
308 
309  const xAOD::TrackParticleContainer* IDtracks ( nullptr );
310  ATH_CHECK( evtStore()->retrieve( IDtracks, m_jp.TrackLocation) );
311 
312  const xAOD::ElectronContainer *electrons( nullptr );
313  ATH_CHECK( evtStore()->retrieve( electrons, m_jp.ElectronLocation ) );
314 
315  const xAOD::MuonContainer* muons ( nullptr );
316  ATH_CHECK( evtStore()->retrieve( muons, m_jp.MuonLocation) );
317 
318  std::vector<const xAOD::TrackParticle*> IDTrksFromEls;
319 
320  // Loop over electrons to select all GSF tracks
321  for( const auto *electron : *electrons ) {
322  if( 0 == electron->nTrackParticles() ) { continue; }
323  // The first track is the best-matched GSF track
324  const auto* el_trk = electron->trackParticle(0);
325  selectTrack( el_trk );
326  m_leptonicTracks->emplace_back(el_trk);
327  IDTrksFromEls.emplace_back(xAOD::EgammaHelpers::getOriginalTrackParticle(electron));
328  }
329 
330  // Loop over ID tracks to select all non-el tracks
331  for( const auto *trk : *IDtracks ) {
332  // do not select ID track if matched to an electron
333  if ( std::find(IDTrksFromEls.begin(), IDTrksFromEls.end(), trk) != IDTrksFromEls.end() ) { continue; }
334  selectTrack( trk );
335  }
336 
337  // Loop over muons to book-keep all ID tracks matched to muons
338  for (const auto *muon : *muons) {
339  if (m_jp.doRemoveCaloTaggedMuons && muon->muonType() == xAOD::Muon::CaloTagged) { continue; }
340  const auto* mu_trk = muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
341  if(!mu_trk) { continue; }
342  m_leptonicTracks->emplace_back(mu_trk);
343  }
344 
345  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of total ID tracks = " << IDtracks->size() );
346  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of total electrons = " << electrons->size() );
347  ATH_MSG_DEBUG( " > " << __FUNCTION__ << ": Number of selected tracks = " << m_selectedTracks->size() );
348 
349  return StatusCode::SUCCESS;
350  }
351 
352 
353 } // end of namespace VKalVrtAthena
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
VKalVrtAthena::AlgConsts::infinitesimal
constexpr double infinitesimal
Definition: Reconstruction/VKalVrt/VrtSecInclusive/VrtSecInclusive/Constants.h:19
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:195
xAOD::numberOfSCTSharedHits
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
Definition: TrackingPrimitives.h:272
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
xAOD::TrackParticle_v1::summaryValue
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Definition: TrackParticle_v1.cxx:736
xAOD::TrackParticle_v1::z0
float z0() const
Returns the parameter.
xAOD::TrackParticle_v1::chiSquared
float chiSquared() const
Returns the of the overall track fit.
ElectronxAODHelpers.h
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
xAOD::numberOfTRTHits
@ numberOfTRTHits
number of TRT hits [unit8_t].
Definition: TrackingPrimitives.h:275
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
NtupleVars.h
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
Tools.h
xAOD::TrackParticle_v1::d0
float d0() const
Returns the parameter.
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
VrtSecInclusive.h
VKalVrtAthena
Definition: AANT_Tools.cxx:24
VKalVrtAthena::isAssociatedToVertices
bool isAssociatedToVertices(const xAOD::TrackParticle *trk, const xAOD::VertexContainer *vertices)
Definition: Reconstruction/VKalVrt/VrtSecInclusive/src/Utilities.cxx:34
xAOD::numberOfPixelSharedHits
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
Definition: TrackingPrimitives.h:262
TauGNNUtils::Variables::Track::nSiHits
bool nSiHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:691
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::numberOfSCTHoles
@ numberOfSCTHoles
number of SCT holes [unit8_t].
Definition: TrackingPrimitives.h:270
DataVector< xAOD::TrackParticle_v1 >
xAOD::TrackParticle_v1::definingParametersCovMatrix
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
Definition: TrackParticle_v1.cxx:246
xAOD::TrackParticle_v1::patternRecoInfo
std::bitset< NumberOfTrackRecoInfo > patternRecoInfo() const
Access method for pattern recognition algorithm.
Definition: TrackParticle_v1.cxx:706
xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
Definition: ElectronxAODHelpers.cxx:22
plotIsoValidation.el_trk
el_trk
Definition: plotIsoValidation.py:166
python.HLT.Muon.MuonRecoSequences.isLRT
def isLRT(name)
Definition: MuonRecoSequences.py:66
xAOD::EgammaParameters::electron
@ electron
Definition: EgammaEnums.h:18
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:268
xAOD::EgammaHelpers::getOriginalTrackParticle
const xAOD::TrackParticle * getOriginalTrackParticle(const xAOD::Electron *el)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the electron.
Definition: ElectronxAODHelpers.cxx:11
xAOD::TrackParticle_v1::numberDoF
float numberDoF() const
Returns the number of degrees of freedom of the overall track or vertex fit as float.
plotIsoValidation.mu_trk
mu_trk
Definition: plotIsoValidation.py:153
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
xAOD::numberOfInnermostPixelLayerHits
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
Definition: TrackingPrimitives.h:237
LArGeo::ATan2
GeoGenfun::FunctionNoop ATan2(GeoGenfun::GENFUNCTION y, GeoGenfun::GENFUNCTION x)
Definition: BarrelAuxFunctions.cxx:50