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 auto track =
muon->trackParticle( xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle );
279 if(track==nullptr) continue;
281 muonTracks.push_back(track);
282 }
283 }
284
285 for(auto jpsiItr=selectedJpsiCandidates.begin(); jpsiItr!=selectedJpsiCandidates.end(); ++jpsiItr) {
286
287
290 QuadletTracks[0] = jpsiTP1;
291 QuadletTracks[1] = jpsiTP2;
292
293
295 jpsiTracks.resize(2);
296 jpsiTracks[0] = jpsiTP1;
297 jpsiTracks[1] = jpsiTP2;
298 }
299
300
301 for (TrackBag::iterator trkItr1=theIDTracksAfterSelection.begin(); trkItr1<theIDTracksAfterSelection.end(); ++trkItr1) {
303 int linkedMuonTrk1 = 0;
306 if (linkedMuonTrk1)
ATH_MSG_DEBUG(
"This id track 1 is muon track!");
307
309 if (linkedMuonTrk1)
ATH_MSG_DEBUG(
"ID track 1 removed: id track is selected to build Jpsi!");
310 continue;
311 }
312 }
313
314
316 std::abs((*trkItr1)->z0() + (*trkItr1)->vz() - (*jpsiItr)->z()) >
m_trkDeltaZ )
317 continue;
318
319 for (TrackBag::iterator trkItr2=trkItr1+1; trkItr2!=theIDTracksAfterSelection.end(); ++trkItr2) {
322 return StatusCode::SUCCESS;
323 }
325
328 if (linkedMuonTrk2)
ATH_MSG_DEBUG(
"This id track 2 is muon track!");
330 if (linkedMuonTrk2)
ATH_MSG_DEBUG(
"ID track 2 removed: id track is selected to build Jpsi Vtx!");
331 continue;
332 }
335 continue;
336 }
337 }
338
339
341 std::abs((*trkItr2)->z0() + (*trkItr2)->vz() - (*jpsiItr)->z()) >
m_trkDeltaZ )
342 continue;
343
346
348
349
350 if((*trkItr2)->qOverP()>0) {
351 QuadletTracks[2] = *trkItr2;
352 QuadletTracks[3] = *trkItr1;
353 }else{
354 QuadletTracks[2] = *trkItr1;
355 QuadletTracks[3] = *trkItr2;
356 }
357
359
360
361 bool passesDiTrack(true);
363 massCuts.clear();
369 }
373 }
376
377 }
378 if (!passesDiTrack) continue;
379
380
381 bool passes4TrackMass(true);
383 massCuts.clear();
384
390 }
394 }
396
398 }
399 if (!passes4TrackMass) continue;
400
401
402 std::unique_ptr<xAOD::Vertex> bVertex (
fit(ctx, QuadletTracks, importedTrackCollection, importedGSFTrackCollection));
403 if(!bVertex) continue;
404 double bChi2DOF = bVertex->chiSquared()/bVertex->numberDoF();
407 if(!chi2CutPassed) {
ATH_MSG_DEBUG(
"Chi Cut failed!");
continue; }
408 xAOD::BPhysHelper bHelper(bVertex.get());
409 bHelper.setRefTrks();
411 if(!passesCuts) continue;
412
413
414 std::vector<const xAOD::Vertex*> theJpsiPreceding;
415 theJpsiPreceding.push_back(*jpsiItr);
416 bHelper.setPrecedingVertices(theJpsiPreceding, importedJpsiCollection);
418
419 }
420 }
421 }
423 return StatusCode::SUCCESS;
424
425 }
#define ATH_MSG_WARNING(x)
static bool oppositeCharges(const xAOD::TrackParticle *, const xAOD::TrackParticle *)
bool vertexCuts(xAOD::BPhysHelper &bHelper) const
std::unique_ptr< xAOD::Vertex > fit(const EventContext &ctx, const std::vector< const xAOD::TrackParticle * > &, const xAOD::TrackParticleContainer *, const xAOD::TrackParticleContainer *GSL) const
static double getInvariantMass(const xAOD::TrackParticle *trk1, double mass1, const xAOD::TrackParticle *trk2, double mass2)
static bool cutRangeOR(std::span< double const > values, double min, double max) noexcept
static bool isContainedIn(const xAOD::TrackParticle *, std::span< const xAOD::TrackParticle *const >) noexcept
static double getPt(std::span< const xAOD::TrackParticle *const > tracks)
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".