53 {
54
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 );
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{
102 static const SG::ConstAccessor<ElementLink<xAOD::TrackParticleContainer>> acc_originalObject("ERMOriginalTrack");
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)
ATH_MSG_INFO(
"Found Already Used track new, now removing: " << *track_it );
145 if (alreadyUsed) track_it = tauTracks.erase(track_it);
146 else ++track_it;
147 }
148 }
149
150
152 for (
unsigned int i = 0;
i < tauTracks.size(); ++
i) {
154
156 <<
" eta " << trackParticle->
eta()
157 <<
" phi " << trackParticle->
phi());
158
160
162 tauTrackCon.push_back(track);
163
164 ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
168 }
169 else {
171 }
172 track->addTrackLink(linkToTrackParticle);
173
174 track->setP4(trackParticle->
pt(), trackParticle->
eta(), trackParticle->
phi(), trackParticle->
m());
177
180
181 ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
184
187 <<
" phi " << pTau.
track(i)->
phi());
188 }
189
191
192 for (
unsigned int i = 0;
i < wideTracks.size(); ++
i) {
194
196 <<
" eta " << trackParticle->
eta()
197 <<
" phi " << trackParticle->
phi());
198
200 tauTrackCon.push_back(track);
201
202 ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
206 }
207 else {
209 }
210 track->addTrackLink(linkToTrackParticle);
211
212 track->setP4(trackParticle->
pt(), trackParticle->
eta(), trackParticle->
phi(), trackParticle->
m());
215
219
220 ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
223 }
224
225
228
229 for (
unsigned int i = 0;
i < otherTracks.size(); ++
i) {
231
233 <<
" eta " << trackParticle->
eta()
234 <<
" phi " << trackParticle->
phi());
235
237 tauTrackCon.push_back(track);
238
239 ElementLink<xAOD::TrackParticleContainer> linkToTrackParticle;
243 }
244 else {
247 }
248 track->addTrackLink(linkToTrackParticle);
249
250 track->setP4(trackParticle->
pt(), trackParticle->
eta(), trackParticle->
phi(), trackParticle->
m());
251 float dR =
track->p4().DeltaR(pTau.
p4());
255
256 ElementLink<xAOD::TauTrackContainer> linkToTauTrack;
259 }
260
262
264
267
268
270
273
274
277 }
280
281 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle {
m_beamSpotKey };
284 const auto&
cov = beamSpotHandle->beamVtx().covariancePosition();
286
287 if(!tauTracks.empty()) {
288 vxbkp.
setZ(tauTracks.at(0)->z0());
289 }
290 }
291 else {
293 }
294 vxcand = & vxbkp;
295 }
296
297
298
299 static const SG::Accessor<float> dec_d0TJVA("d0TJVA");
300 static const SG::Accessor<float> dec_z0sinthetaTJVA("z0sinthetaTJVA");
301 static const SG::Accessor<float> dec_d0SigTJVA("d0SigTJVA");
302 static const SG::Accessor<float> dec_z0sinthetaSigTJVA("z0sinthetaSigTJVA");
303
304 for(
const ElementLink<xAOD::TauTrackContainer>& trackLink : pTau.
allTauTrackLinks())
305 {
306 assert (trackLink.getStorableObjectPointer() == &tauTrackCon);
308 dec_d0TJVA(*track) =
track->track()->d0();
309 dec_z0sinthetaTJVA(*track) =
track->z0sinThetaTJVA(pTau);
310 dec_d0SigTJVA(*track) = -999.;
311 dec_z0sinthetaSigTJVA(*track) = -999.;
312
313
314 if(vxcand) {
315 std::unique_ptr<const Trk::ImpactParametersAndSigma> myIPandSigma
317
318 if(myIPandSigma) {
319 dec_d0TJVA(*track) = myIPandSigma->IPd0;
320 dec_z0sinthetaTJVA(*track) = myIPandSigma->IPz0SinTheta;
321 dec_d0SigTJVA(*track) = (myIPandSigma->sigmad0 != 0.) ? static_cast<float>( myIPandSigma->IPd0 / myIPandSigma->sigmad0 ) : -999.f;
322 dec_z0sinthetaSigTJVA(*track) = (myIPandSigma->sigmaz0SinTheta != 0.) ? static_cast<float>( myIPandSigma->IPz0SinTheta / myIPandSigma->sigmaz0SinTheta ) : -999.f;
323 }
324 }
325 }
326
327
328
330 {
332 if (
sc.isFailure() && !
sc.isRecoverable()) {
333 ATH_MSG_ERROR(
"couldn't extrapolate tracks to calo surface");
334 return StatusCode::FAILURE;
335 }
336 }
337
338 return StatusCode::SUCCESS;
339}
#define ATH_MSG_VERBOSE(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 data, ElementType element, IProxyDict *sg=0)
Set from element pointer and a reference to the container (storable)
void makePrivateStore()
Create a new (empty) private store for this object.
const SG::AuxVectorData * container() const
Return the container holding this element.
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackPartInputContainer
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
StatusCode extrapolateToCaloSurface(xAOD::TauJet &pTau, xAOD::TauTrackContainer &tauTrackCon) const
Extrapolate track eta and phi to the calorimeter middle surface.
ToolHandle< Trk::ITrackToVertexIPEstimator > m_trackToVertexIPEstimator
void removeOffsideTracksWrtLeadTrk(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
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
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.
@ 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".