ATLAS Offline Software
Loading...
Searching...
No Matches
VertexPlus1TrackCascade.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5
7
12
13namespace DerivationFramework {
14
15
16 typedef std::vector<const xAOD::TrackParticle*> TrackBag;
17
19
20 // retrieving vertex Fitter
21 if ( m_iVertexFitter.retrieve().isFailure() ) {
22 ATH_MSG_FATAL("Failed to retrieve tool " << m_iVertexFitter);
23 return StatusCode::FAILURE;
24 } else {
25 ATH_MSG_DEBUG("Retrieved tool " << m_iVertexFitter);
26 }
27
28 // Get the track selector tool from ToolSvc
29 if ( m_trkSelector.retrieve().isFailure() ) {
30 ATH_MSG_FATAL("Failed to retrieve tool " << m_trkSelector);
31 return StatusCode::FAILURE;
32 } else {
33 ATH_MSG_DEBUG("Retrieved tool " << m_trkSelector);
34 }
35 if(!m_vertexContainerKey.key().empty()) ATH_CHECK(m_vertexContainerKey.initialize());
36 if(!m_TrackPContainerKey.key().empty()) ATH_CHECK(m_TrackPContainerKey.initialize());
37 if(!m_MuonsUsedInJpsiKey.key().empty()) ATH_CHECK(m_MuonsUsedInJpsiKey.initialize());
38
39 return StatusCode::SUCCESS;
40 }
41
43
44 return StatusCode::SUCCESS;
45
46 }
47
48 VertexPlus1TrackCascade::VertexPlus1TrackCascade(const std::string& t, const std::string& n, const IInterface* p) : AthAlgTool(t,n,p),
55 m_trkMaxEta(102.5),
56// m_BThresholdPt(0.0),
57// m_BMassUpper(0.0),
58// m_BMassLower(0.0),
61 m_iVertexFitter("Trk::TrkVKalVrtFitter"),
62 m_trkSelector("InDet::TrackSelectorTool")
63 {
64 declareProperty("InitialVertices", m_vertexContainerKey);
65 declareProperty("TrackParticleCollection", m_TrackPContainerKey);
66 declareProperty("MuonCollection", m_MuonsUsedInJpsiKey);
67 declareProperty("MassHypthesis", m_massHypothesis);
68 declareProperty("MassContraintTracksVtx1", m_massConstraintTracksVtx1);
69 declareProperty("MassContraintTracksVtx2", m_massConstraintTracksVtx2);
70
71 declareProperty("Vtx1MassConstraint", m_Vtx1MassConstraint);
72 declareProperty("Vtx2MassConstraint", m_Vtx2MassConstraint);
73
74 declareProperty("trkThresholdPtCut", m_trkThresholdPt);
75 declareProperty("trkMassEtaCut", m_trkMaxEta);
76// declareProperty("BThresholdPtCut", m_BThresholdPt);
77// declareProperty("BMassUpperCut", m_BMassUpper);
78// declareProperty("BMassLowerCut", m_BMassLower);
79
80 declareProperty("RoughMassUpperCut", m_roughMassLower);
81 declareProperty("RoughMassLowerCut", m_roughMassUpper);
82
83 }
84
86
87 double VertexPlus1TrackCascade::getInvariantMass(const TrackBag &Tracks, const std::vector<double> &massHypotheses){
88
89 TLorentzVector total;
90 total.SetVectM(Tracks[0]->p4().Vect(), massHypotheses[0]);
91 TLorentzVector temp;
92 for(size_t i=1; i < Tracks.size(); i++){
93 temp.SetVectM(Tracks[i]->p4().Vect(), massHypotheses[i]);
94 total += temp;
95 }
96 return total.M();
97 }
98
100 return std::find_if(theColl->begin(), theColl->end(),
101 [theTrack](const xAOD::Muon* muon){
102 return muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle) == theTrack;
103 }) != theColl->end();
104 }
105
106 StatusCode VertexPlus1TrackCascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer, const EventContext& ctx) const
107 {
108 ATH_MSG_DEBUG( "VertexPlus1TrackCascade::performSearch" );
109 assert(cascadeinfoContainer!=nullptr);
111 if(!vertexContainer.isValid()){
112 ATH_MSG_ERROR("No VertexContainer with key " << m_vertexContainerKey.key() << " found in StoreGate. BCandidates will be EMPTY!");
113 return StatusCode::FAILURE;
114 }
115
116 // Get tracks
118 if(!TrackPContainer.isValid()){
119 ATH_MSG_ERROR("No track particle collection with name " << m_TrackPContainerKey.key() << " found in StoreGate!");
120 return StatusCode::FAILURE;
121 }
122
123
124 // Get the muon collection used to build the J/psis
125 const xAOD::MuonContainer* importedMuonCollection = nullptr;
126 if (!m_MuonsUsedInJpsiKey.key().empty()) {
128 if(handle.isValid()) importedMuonCollection = handle.cptr();
129 else {
130 ATH_MSG_FATAL("problem retrieving MuonContainer " << m_MuonsUsedInJpsiKey.key());
131 return StatusCode::FAILURE;
132 }
133 ATH_MSG_DEBUG("Muon container size "<< importedMuonCollection->size());
134 }
135
136 // Select the inner detector tracks
137 TrackBag theIDTracksAfterSelection;
138 for (auto tp : *TrackPContainer){
139 if ( tp->pt()<m_trkThresholdPt ) continue;
140 if ( fabs(tp->eta())>m_trkMaxEta ) continue;
141 if (importedMuonCollection!=NULL) {
142 if (isContainedIn(tp, importedMuonCollection)) continue;
143 }
144 if ( m_trkSelector->decision(*tp, NULL) ) theIDTracksAfterSelection.push_back(tp);
145 }
146
147 const std::vector<double> &fullMassHypoth = (m_massHypothesis);
148 const std::vector<double> initialVertexMassHypo(fullMassHypoth.begin(), fullMassHypoth.end()-1);
149
150 TrackBag originalVertexTracks(initialVertexMassHypo.size());
151 TrackBag secondVertexTracks(fullMassHypoth.size());
152
153 const std::vector< Trk::VertexID > emptyVtxList;
154 TrackBag ConstraintTracksVtx1(m_massConstraintTracksVtx1.size());
155 TrackBag ConstraintTracksVtx2(m_massConstraintTracksVtx2.size());
156
157 assert(fullMassHypoth.size() == secondVertexTracks.size());
158
159 for(auto vertex : *vertexContainer){ //Iterate over previous vertices
160
161 size_t OriginaltrackNum = vertex->nTrackParticles();
162 if(initialVertexMassHypo.size() != OriginaltrackNum){
163 ATH_MSG_FATAL("Mass hypothesis not correctly set");
164 return StatusCode::FAILURE;
165 }
166 for(size_t i = 0;i<OriginaltrackNum;i++)
167 originalVertexTracks[i] = secondVertexTracks[i] = (vertex->trackParticle(i));
168
169 for(auto newtrack : theIDTracksAfterSelection){
170 //Skip any track already used in vertex
171 if(std::find(originalVertexTracks.begin(), originalVertexTracks.end(), newtrack) != originalVertexTracks.end()) continue;
172
173 secondVertexTracks.back() = newtrack;
174
175 double roughmass = getInvariantMass(secondVertexTracks, fullMassHypoth);
176
177 if(m_roughMassUpper > 0.0 && (roughmass < m_roughMassLower || roughmass > m_roughMassUpper)) continue;
178
179 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState(ctx);
180 m_iVertexFitter->setRobustness( 0, *state );
181
182 auto vID1 = m_iVertexFitter->startVertex( originalVertexTracks, initialVertexMassHypo, *state );
183 auto vID2 = m_iVertexFitter->nextVertex( secondVertexTracks, fullMassHypoth, *state );
184
185 if(!m_massConstraintTracksVtx1.empty()){
186 for(size_t i =0; i<m_massConstraintTracksVtx1.size(); i++) ConstraintTracksVtx1[i] = originalVertexTracks.at(m_massConstraintTracksVtx1[i]);
187 if( !m_iVertexFitter->addMassConstraint( vID1, ConstraintTracksVtx1, emptyVtxList, *state, m_Vtx1MassConstraint ).isSuccess() ) {
188 ATH_MSG_WARNING( "cascade fit: addMassConstraint failed" );
189 }
190 }
191
192 if(!m_massConstraintTracksVtx2.empty()){
193 for(size_t i =0; i<m_massConstraintTracksVtx2.size(); i++) ConstraintTracksVtx2[i] = secondVertexTracks.at(m_massConstraintTracksVtx2[i]);
194 if( !m_iVertexFitter->addMassConstraint( vID2, ConstraintTracksVtx2, emptyVtxList,*state, m_Vtx2MassConstraint ).isSuccess() ) {
195 ATH_MSG_WARNING( "cascade fit: addMassConstraint failed" );
196 }
197 }
198
199 auto result = m_iVertexFitter->fitCascade(*state);
200 if(result ==nullptr ){ ATH_MSG_WARNING("Cascade Fit failed"); continue; }
201 assert(result->vertices().size()==2);
202 cascadeinfoContainer->push_back(result);
203
204 }
205
206 }
207 ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
208 return StatusCode::SUCCESS;
209 }
210
211
212}
213
214
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
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.
ToolHandle< Trk::TrkVKalVrtFitter > m_iVertexFitter
StatusCode performSearch(std::vector< Trk::VxCascadeInfo * > *cascadeinfoContainer, const EventContext &ctx) const
static bool isContainedIn(const xAOD::TrackParticle *theTrack, const xAOD::MuonContainer *theColl)
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainerKey
ToolHandle< Trk::ITrackSelectorTool > m_trkSelector
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_TrackPContainerKey
static double getInvariantMass(const std::vector< const xAOD::TrackParticle * > &Tracks, const std::vector< double > &massHypotheses)
SG::ReadHandleKey< xAOD::MuonContainer > m_MuonsUsedInJpsiKey
VertexPlus1TrackCascade(const std::string &t, const std::string &n, const IInterface *p)
virtual bool isValid() override final
Can the handle be successfully dereferenced?
THE reconstruction tool.
std::vector< const xAOD::TrackParticle * > TrackBag
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".