53 {
54 const EventContext &ctx = Gaudi::Hive::currentContext();
55 std::vector<const xAOD::TrackParticle*> tauTracks;
56 std::vector<const xAOD::TrackParticle*> wideTracks;
57 std::vector<const xAOD::TrackParticle*> otherTracks;
58
59
61
63 if (!trackPartInHandle.isValid()) {
64 ATH_MSG_ERROR (
"Could not retrieve HiveDataObj with key " << trackPartInHandle.key());
65 return StatusCode::FAILURE;
66 }
67 trackParticleCont = trackPartInHandle.cptr();
68
69
71 std::vector<const xAOD::TrackParticle*> vecTrksLargeD0;
74 if (!trackPartInHandle.isValid()) {
75 ATH_MSG_VERBOSE (
"Could not retrieve HiveDataObj with key " << trackPartInHandle.key());
76 ATH_MSG_VERBOSE (
"LRT container " << trackPartInHandle.key()<<
" is not being used for tau tracks");
77 }
78 else {
79 largeD0TracksParticleCont = trackPartInHandle.cptr();
80 vecTrksLargeD0 = std::vector<const xAOD::TrackParticle*>(largeD0TracksParticleCont->
begin(), largeD0TracksParticleCont->
end());
81 }
82 }
83
84
85
86
89 SG::ReadHandle<xAOD::JetContainer> jetContHandle(
m_jetContainer, ctx );
90 if (!jetContHandle.isValid()) {
91 ATH_MSG_ERROR (
"Could not retrieve HiveDataObj with key " << jetContHandle.key());
92 return StatusCode::FAILURE;
93 }
94 jetContainer = jetContHandle.cptr();
95 }
96
97 std::vector<const xAOD::TrackParticle*> vecTrks;
98 vecTrks.reserve( trackParticleCont->
size() );
99 for (auto trk : *trackParticleCont){
100 if (!
inEleRM()) { vecTrks.push_back(trk); }
101 else{
103 auto original_id_track_link = acc_originalObject(*trk);
104 if (!original_id_track_link.isValid()) {
106 continue;
107 }
108 vecTrks.push_back(*original_id_track_link);
109 }
110 }
111
112
114
115
116
117
119
120 bool foundLRTCont =
bool (largeD0TracksParticleCont !=
nullptr);
121
122 if (foundLRTCont){
123
124 getTauTracksFromPV(pTau, vecTrksLargeD0, pVertex,
false,
nullptr, tauTracks, wideTracks, otherTracks);
125 }
126
127
130 }
131
133 bool alreadyUsed = false;
134 for (std::vector<const xAOD::TrackParticle*>::iterator track_it = tauTracks.begin(); track_it != tauTracks.end() ;)
135 {
136 alreadyUsed = false;
137
139
141 if( (*track_it) == tau_trk->track()) alreadyUsed = true;
142 }
143
144 if(alreadyUsed) {
145 ATH_MSG_INFO(
"Found Already Used track new, now removing: " << *track_it );
146 track_it = tauTracks.erase(track_it);
147 } else ++track_it;
148 }
149 }
150
151
153 for (
unsigned int i = 0;
i < tauTracks.size(); ++
i) {
155
157 <<
" eta " << trackParticle->
eta()
158 <<
" phi " << trackParticle->
phi());
159
161
163 tauTrackCon.push_back(track);
164
165 ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
169 }
170 else {
172 }
173 track->addTrackLink(linkToTrackParticle);
174
175 track->setP4(trackParticle->
pt(), trackParticle->
eta(), trackParticle->
phi(), trackParticle->
m());
178
181
185
188 <<
" phi " << pTau.
track(i)->
phi());
189 }
190
192
193 for (
unsigned int i = 0;
i < wideTracks.size(); ++
i) {
195
197 <<
" eta " << trackParticle->
eta()
198 <<
" phi " << trackParticle->
phi());
199
201 tauTrackCon.push_back(track);
202
203 ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
207 }
208 else {
210 }
211 track->addTrackLink(linkToTrackParticle);
212
213 track->setP4(trackParticle->
pt(), trackParticle->
eta(), trackParticle->
phi(), trackParticle->
m());
216
220
224 }
225
226
229
230 for (
unsigned int i = 0;
i < otherTracks.size(); ++
i) {
232
234 <<
" eta " << trackParticle->
eta()
235 <<
" phi " << trackParticle->
phi());
236
238 tauTrackCon.push_back(track);
239
240 ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
244 }
245 else {
248 }
249 track->addTrackLink(linkToTrackParticle);
250
251 track->setP4(trackParticle->
pt(), trackParticle->
eta(), trackParticle->
phi(), trackParticle->
m());
252 float dR =
track->p4().DeltaR(pTau.
p4());
256
260 }
261
263
265
268
269
271
273 vxbkp.makePrivateStore();
274
275
278 }
281
282 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle {
m_beamSpotKey, ctx };
285 const auto&
cov = beamSpotHandle->beamVtx().covariancePosition();
287
288 if(!tauTracks.empty()) {
289 vxbkp.
setZ(tauTracks.at(0)->z0());
290 }
291 }
292 else {
294 }
295 vxcand = & vxbkp;
296 }
297
298
299
300 static const SG::Accessor<float> dec_d0TJVA("d0TJVA");
301 static const SG::Accessor<float> dec_z0sinthetaTJVA("z0sinthetaTJVA");
302 static const SG::Accessor<float> dec_d0SigTJVA("d0SigTJVA");
303 static const SG::Accessor<float> dec_z0sinthetaSigTJVA("z0sinthetaSigTJVA");
304
306 {
307 assert (trackLink.getStorableObjectPointer() == &tauTrackCon);
309 dec_d0TJVA(*track) =
track->track()->d0();
310 dec_z0sinthetaTJVA(*track) =
track->z0sinThetaTJVA(pTau);
311 dec_d0SigTJVA(*track) = -999.;
312 dec_z0sinthetaSigTJVA(*track) = -999.;
313
314
315 if(vxcand) {
316 std::unique_ptr<const Trk::ImpactParametersAndSigma> myIPandSigma
318
319 if(myIPandSigma) {
320 dec_d0TJVA(*track) = myIPandSigma->IPd0;
321 dec_z0sinthetaTJVA(*track) = myIPandSigma->IPz0SinTheta;
322 dec_d0SigTJVA(*track) = (myIPandSigma->sigmad0 != 0.) ? static_cast<float>( myIPandSigma->IPd0 / myIPandSigma->sigmad0 ) : -999.f;
323 dec_z0sinthetaSigTJVA(*track) = (myIPandSigma->sigmaz0SinTheta != 0.) ? static_cast<float>( myIPandSigma->IPz0SinTheta / myIPandSigma->sigmaz0SinTheta ) : -999.f;
324 }
325 }
326 }
327
328
329
331 {
333 if (
sc.isFailure() && !
sc.isRecoverable()) {
334 ATH_MSG_ERROR(
"couldn't extrapolate tracks to calo surface");
335 return StatusCode::FAILURE;
336 }
337 }
338
339 return StatusCode::SUCCESS;
340}
ElementLink()
Default constructor.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
double charge(const T &p)
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool toContainedElement(BaseConstReference container, ElementType element)
Set link to point to given element (slowest).
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackPartInputContainer
StatusCode extrapolateToCaloSurface(const EventContext &ctx, xAOD::TauJet &pTau, xAOD::TauTrackContainer &tauTrackCon) const
Extrapolate track eta and phi to the calorimeter middle surface.
void getTauTracksFromPV(const xAOD::TauJet &tauJet, const std::vector< const xAOD::TrackParticle * > &vecTrackParticles, const xAOD::Vertex *primaryVertex, const bool &useGhostTracks, const xAOD::JetContainer *jetContainer, std::vector< const xAOD::TrackParticle * > &tauTracks, std::vector< const xAOD::TrackParticle * > &wideTracks, std::vector< const xAOD::TrackParticle * > &otherTracks) const
ToolHandle< Trk::ITrackToVertexIPEstimator > m_trackToVertexIPEstimator
SG::ReadHandleKey< xAOD::JetContainer > m_jetContainer
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_largeD0TracksInputContainer
Gaudi::Property< float > m_z0maxDelta
Gaudi::Property< bool > m_applyZ0cut
Gaudi::Property< double > m_maxJetDr_tau
Gaudi::Property< bool > m_bypassExtrapolator
Gaudi::Property< bool > m_useGhostTracks
void removeOffsideTracksWrtLeadTrk(const EventContext &ctx, std::vector< const xAOD::TrackParticle * > &tauTracks, std::vector< const xAOD::TrackParticle * > &wideTracks, std::vector< const xAOD::TrackParticle * > &otherTracks, const xAOD::Vertex *tauOrigin, double maxDeltaZ0) const
Gaudi::Property< bool > m_removeDuplicateCoreTracks
bool isLargeD0Track(const xAOD::TrackParticle *track) const
virtual FourMom_t p4() const
The full 4-momentum of the particle.
const TauTrack * track(size_t i, TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged, int *container_index=0) const
Get the pointer to a given tauTrack associated with this tau /*container index needed by trackNonCons...
void setDetail(TauJetParameters::Detail detail, int value)
const Vertex * vertex() const
size_t nAllTracks() const
const TauTrackLinks_t & allTauTrackLinks() const
void addTauTrackLink(const ElementLink< TauTrackContainer > &tr)
add a TauTrack to the tau
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double m() const override final
The invariant mass of the particle..
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 setCovariancePosition(const AmgSymMatrix(3)&covariancePosition)
Sets the vertex covariance matrix.
void setZ(float value)
Sets the z position.
void setX(float value)
Sets the x position.
void setY(float value)
Sets the y position.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
VxType::VertexType vertexType() const
The type of the vertex.
::StatusCode StatusCode
StatusCode definition for legacy code.
SG::ConstAccessor< T, ALLOC > ConstAccessor
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauTrack_v1 TauTrack
Definition of the current version.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
setBGCode setTAP setLVL2ErrorBits bool
JetContainer_v1 JetContainer
Definition of the current "jet container version".