176 {
178
179
182 if(!jpsihandle.isValid()){
184 return StatusCode::FAILURE;
185 }else{
186 importedJpsiCollection = jpsihandle.cptr();
188 }
190
191
194 if(!trackshandle.isValid()){
196 return StatusCode::FAILURE;
197 } else {
198 importedTrackCollection = trackshandle.cptr();
200 }
202
207 importedGSFTrackCollection =
h.cptr();
208 }
209
210
216 return StatusCode::FAILURE;
217 } else {
218 importedMuonCollection =
h.cptr();
220 }
222 }
223
224
225 typedef std::vector<const xAOD::TrackParticle*>
TrackBag;
226
227
229 for (
auto trkPBItr=importedTrackCollection->
cbegin(); trkPBItr!=importedTrackCollection->
cend(); ++trkPBItr) {
235 }
236 if (
m_trkSelector->decision(*tp, NULL) ) theIDTracksAfterSelection.push_back(tp);
237 }
238 if (theIDTracksAfterSelection.size() == 0) return StatusCode::SUCCESS;
239 ATH_MSG_DEBUG(
"Number of tracks after ID trkSelector: " << theIDTracksAfterSelection.size());
240
241
242 std::vector<const xAOD::Vertex*> selectedJpsiCandidates;
243 std::vector<const xAOD::TrackParticle*> jpsiTracks;
244 for(
auto vxcItr=importedJpsiCollection->
cbegin(); vxcItr!=importedJpsiCollection->
cend(); ++vxcItr) {
245
246
248 xAOD::BPhysHelper jpsiCandidate(*vxcItr);
251 if (!pass) continue;
252 }
253 selectedJpsiCandidates.push_back(*vxcItr);
254
255
257
260 jpsiTracks.push_back(jpsiTP1);
261 jpsiTracks.push_back(jpsiTP2);
262 }
263 }
264 ATH_MSG_DEBUG(
"selectedJpsiCandidates: " << selectedJpsiCandidates.size());
265
266
267
268
269
270
271 std::vector<const xAOD::TrackParticle*> QuadletTracks(4, nullptr);
272
273 std::vector<double> massCuts;
274
277 for(auto muon : *importedMuonCollection){
278 if(!
muon->inDetTrackParticleLink().isValid())
continue;
279 auto track =
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
280 if(track==nullptr) continue;
282 muonTracks.push_back(track);
283 }
284 }
285
286 for(auto jpsiItr=selectedJpsiCandidates.begin(); jpsiItr!=selectedJpsiCandidates.end(); ++jpsiItr) {
287
288
291 QuadletTracks[0] = jpsiTP1;
292 QuadletTracks[1] = jpsiTP2;
293
294
296 jpsiTracks.resize(2);
297 jpsiTracks[0] = jpsiTP1;
298 jpsiTracks[1] = jpsiTP2;
299 }
300
301
302 for (TrackBag::iterator trkItr1=theIDTracksAfterSelection.begin(); trkItr1<theIDTracksAfterSelection.end(); ++trkItr1) {
304 int linkedMuonTrk1 = 0;
307 if (linkedMuonTrk1)
ATH_MSG_DEBUG(
"This id track 1 is muon track!");
308
310 if (linkedMuonTrk1)
ATH_MSG_DEBUG(
"ID track 1 removed: id track is selected to build Jpsi!");
311 continue;
312 }
313 }
314
315
317 std::abs((*trkItr1)->z0() + (*trkItr1)->vz() - (*jpsiItr)->z()) >
m_trkDeltaZ )
318 continue;
319
320 for (TrackBag::iterator trkItr2=trkItr1+1; trkItr2!=theIDTracksAfterSelection.end(); ++trkItr2) {
323 return StatusCode::SUCCESS;
324 }
326
329 if (linkedMuonTrk2)
ATH_MSG_DEBUG(
"This id track 2 is muon track!");
331 if (linkedMuonTrk2)
ATH_MSG_DEBUG(
"ID track 2 removed: id track is selected to build Jpsi Vtx!");
332 continue;
333 }
336 continue;
337 }
338 }
339
340
342 std::abs((*trkItr2)->z0() + (*trkItr2)->vz() - (*jpsiItr)->z()) >
m_trkDeltaZ )
343 continue;
344
347
349
350
351 if((*trkItr2)->qOverP()>0) {
352 QuadletTracks[2] = *trkItr2;
353 QuadletTracks[3] = *trkItr1;
354 }else{
355 QuadletTracks[2] = *trkItr1;
356 QuadletTracks[3] = *trkItr2;
357 }
358
360
361
362 bool passesDiTrack(true);
364 massCuts.clear();
370 }
374 }
377
378 }
379 if (!passesDiTrack) continue;
380
381
382 bool passes4TrackMass(true);
384 massCuts.clear();
385
391 }
395 }
397
399 }
400 if (!passes4TrackMass) continue;
401
402
403 std::unique_ptr<xAOD::Vertex> bVertex (
fit(QuadletTracks, importedTrackCollection, importedGSFTrackCollection));
404 if(!bVertex) continue;
405 double bChi2DOF = bVertex->chiSquared()/bVertex->numberDoF();
408 if(!chi2CutPassed) {
ATH_MSG_DEBUG(
"Chi Cut failed!");
continue; }
409 xAOD::BPhysHelper bHelper(bVertex.get());
410 bHelper.setRefTrks();
412 if(!passesCuts) continue;
413
414
415 std::vector<const xAOD::Vertex*> theJpsiPreceding;
416 theJpsiPreceding.push_back(*jpsiItr);
417 bHelper.setPrecedingVertices(theJpsiPreceding, importedJpsiCollection);
419
420 }
421 }
422 }
424 return StatusCode::SUCCESS;
425
426 }
#define ATH_MSG_WARNING(x)
static bool oppositeCharges(const xAOD::TrackParticle *, const xAOD::TrackParticle *)
xAOD::Vertex * fit(const std::vector< const xAOD::TrackParticle * > &, const xAOD::TrackParticleContainer *, const xAOD::TrackParticleContainer *GSL) const
bool vertexCuts(xAOD::BPhysHelper &bHelper) const
static double getInvariantMass(const xAOD::TrackParticle *, double, const xAOD::TrackParticle *, double)
static bool isContainedIn(const xAOD::TrackParticle *, const std::vector< const xAOD::TrackParticle * > &)
static bool cutRangeOR(const std::vector< double > &values, double min, double max)
static double getPt(const xAOD::TrackParticle *, const xAOD::TrackParticle *)
value_type push_back(value_type pElem)
Add an element to the end of the collection.
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.
std::vector< const xAOD::TrackParticle * > TrackBag
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".