ATLAS Offline Software
Loading...
Searching...
No Matches
VertexPlus1TrackCascade.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 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 bool isContained(false);
101 for (auto muItr=theColl->cbegin(); muItr!=theColl->cend(); ++muItr) {
102 auto& link = ( *muItr )->inDetTrackParticleLink();
103 if ( link.isValid() && ( *link == theTrack ) ) {isContained=true; break;}
104 }
105 return isContained;
106 }
107
108 StatusCode VertexPlus1TrackCascade::performSearch(std::vector<Trk::VxCascadeInfo*> *cascadeinfoContainer) const
109 {
110 ATH_MSG_DEBUG( "VertexPlus1TrackCascade::performSearch" );
111 assert(cascadeinfoContainer!=nullptr);
113 if(!vertexContainer.isValid()){
114 ATH_MSG_ERROR("No VertexContainer with key " << m_vertexContainerKey.key() << " found in StoreGate. BCandidates will be EMPTY!");
115 return StatusCode::FAILURE;
116 }
117
118 // Get tracks
120 if(!TrackPContainer.isValid()){
121 ATH_MSG_ERROR("No track particle collection with name " << m_TrackPContainerKey.key() << " found in StoreGate!");
122 return StatusCode::FAILURE;
123 }
124
125
126 // Get the muon collection used to build the J/psis
127 const xAOD::MuonContainer* importedMuonCollection = nullptr;
128 if (!m_MuonsUsedInJpsiKey.key().empty()) {
130 if(handle.isValid()) importedMuonCollection = handle.cptr();
131 else {
132 ATH_MSG_FATAL("problem retrieving MuonContainer " << m_MuonsUsedInJpsiKey.key());
133 return StatusCode::FAILURE;
134 }
135 ATH_MSG_DEBUG("Muon container size "<< importedMuonCollection->size());
136 }
137
138 // Select the inner detector tracks
139 TrackBag theIDTracksAfterSelection;
140 for (auto tp : *TrackPContainer){
141 if ( tp->pt()<m_trkThresholdPt ) continue;
142 if ( fabs(tp->eta())>m_trkMaxEta ) continue;
143 if (importedMuonCollection!=NULL) {
144 if (isContainedIn(tp, importedMuonCollection)) continue;
145 }
146 if ( m_trkSelector->decision(*tp, NULL) ) theIDTracksAfterSelection.push_back(tp);
147 }
148
149 const std::vector<double> &fullMassHypoth = (m_massHypothesis);
150 const std::vector<double> initialVertexMassHypo(fullMassHypoth.begin(), fullMassHypoth.end()-1);
151
152 TrackBag originalVertexTracks(initialVertexMassHypo.size());
153 TrackBag secondVertexTracks(fullMassHypoth.size());
154
155 const std::vector< Trk::VertexID > emptyVtxList;
156 TrackBag ConstraintTracksVtx1(m_massConstraintTracksVtx1.size());
157 TrackBag ConstraintTracksVtx2(m_massConstraintTracksVtx2.size());
158
159 assert(fullMassHypoth.size() == secondVertexTracks.size());
160
161 for(auto vertex : *vertexContainer){ //Iterate over previous vertices
162
163 size_t OriginaltrackNum = vertex->nTrackParticles();
164 if(initialVertexMassHypo.size() != OriginaltrackNum){
165 ATH_MSG_FATAL("Mass hypothesis not correctly set");
166 return StatusCode::FAILURE;
167 }
168 for(size_t i = 0;i<OriginaltrackNum;i++)
169 originalVertexTracks[i] = secondVertexTracks[i] = (vertex->trackParticle(i));
170
171 for(auto newtrack : theIDTracksAfterSelection){
172 //Skip any track already used in vertex
173 if(std::find(originalVertexTracks.begin(), originalVertexTracks.end(), newtrack) != originalVertexTracks.end()) continue;
174
175 secondVertexTracks.back() = newtrack;
176
177 double roughmass = getInvariantMass(secondVertexTracks, fullMassHypoth);
178
179 if(m_roughMassUpper > 0.0 && (roughmass < m_roughMassLower || roughmass > m_roughMassUpper)) continue;
180
181 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
182 m_iVertexFitter->setRobustness( 0, *state );
183
184 auto vID1 = m_iVertexFitter->startVertex( originalVertexTracks, initialVertexMassHypo, *state );
185 auto vID2 = m_iVertexFitter->nextVertex( secondVertexTracks, fullMassHypoth, *state );
186
187 if(!m_massConstraintTracksVtx1.empty()){
188 for(size_t i =0; i<m_massConstraintTracksVtx1.size(); i++) ConstraintTracksVtx1[i] = originalVertexTracks.at(m_massConstraintTracksVtx1[i]);
189 if( !m_iVertexFitter->addMassConstraint( vID1, ConstraintTracksVtx1, emptyVtxList, *state, m_Vtx1MassConstraint ).isSuccess() ) {
190 ATH_MSG_WARNING( "cascade fit: addMassConstraint failed" );
191 }
192 }
193
194 if(!m_massConstraintTracksVtx2.empty()){
195 for(size_t i =0; i<m_massConstraintTracksVtx2.size(); i++) ConstraintTracksVtx2[i] = secondVertexTracks.at(m_massConstraintTracksVtx2[i]);
196 if( !m_iVertexFitter->addMassConstraint( vID2, ConstraintTracksVtx2, emptyVtxList,*state, m_Vtx2MassConstraint ).isSuccess() ) {
197 ATH_MSG_WARNING( "cascade fit: addMassConstraint failed" );
198 }
199 }
200
201 auto result = m_iVertexFitter->fitCascade(*state);
202 if(result ==nullptr ){ ATH_MSG_WARNING("Cascade Fit failed"); continue; }
203 assert(result->vertices().size()==2);
204 cascadeinfoContainer->push_back(result);
205
206 }
207
208 }
209 ATH_MSG_DEBUG("cascadeinfoContainer size " << cascadeinfoContainer->size());
210 return StatusCode::SUCCESS;
211 }
212
213
214}
215
216
#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 cbegin() 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.
const_iterator cend() const noexcept
Return a const_iterator pointing past the end of the collection.
ToolHandle< Trk::TrkVKalVrtFitter > m_iVertexFitter
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)
StatusCode performSearch(std::vector< Trk::VxCascadeInfo * > *cascadeinfoContainer) const
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?
const_pointer_type cptr()
Dereference the pointer.
THE reconstruction tool.
std::vector< const xAOD::TrackParticle * > TrackBag
TrackParticle_v1 TrackParticle
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".