89 int nTrackPairs_Init = 0;
90 int nTrackPairs_Selected = 0;
91 int nConv_VertexFit = 0;
92 int nConv_Selected = 0;
93 int nConv_Selected_DeltaM = 0;
95 std::vector<const xAOD::Vertex*> oniaVertices;
104 if(diMuonContainer->
size() == 0) {
116 bool passedHypothesis =
false;
121 if(pass) passedHypothesis =
true;
124 if(passedHypothesis) {
125 oniaVertices.push_back(
vertex);
135 conversionContainer->setStore(conversionAuxContainer.get());
139 const bool callConvFinder = !
m_requireDeltaM || oniaVertices.size() > 0;
150 std::vector<const xAOD::TrackParticle*> posTracks; posTracks.clear();
151 std::vector<const xAOD::TrackParticle*> negTracks; negTracks.clear();
166 if( nSCT + nPIX < 1 )
continue;
168 if(
track->charge() > 0.0) {
169 posTracks.push_back(
track);
171 negTracks.push_back(
track);
176 ATH_MSG_DEBUG(posTracks.size() + negTracks.size() <<
" tracks pass pre-selection");
178 std::vector<const xAOD::TrackParticle*>::const_iterator tpIt1;
179 std::vector<const xAOD::TrackParticle*>::const_iterator tpIt2;
182 for(tpIt1 = posTracks.begin(); tpIt1 != posTracks.end(); ++tpIt1) {
189 for(tpIt2 = negTracks.begin(); tpIt2 != negTracks.end(); ++tpIt2) {
191 if (*tpIt1 == *tpIt2)
continue;
202 const double deltaCotTheta = fabs(1./
tan(trackPerigee1.parameters()[
Trk::theta]) - 1./
tan(trackPerigee2.parameters()[
Trk::theta]));
207 bool gotDistance =
result.has_value();
217 std::map<std::string, float> vertexOutput;
219 if(errorcode != 0)
continue;
222 nTrackPairs_Selected++;
224 std::vector<const xAOD::TrackParticle*> trackPair;
226 trackPair.push_back(trackParticle1);
227 trackPair.push_back(trackParticle2);
230 std::unique_ptr<xAOD::Vertex> convVertexCandidate(
m_vertexFitter->fit(trackPair, startingPoint) );
233 if(convVertexCandidate != NULL) {
237 convVertexCandidate->clearTracks();
244 convVertexCandidate->addTrackAtVertex(newLink1);
245 convVertexCandidate->addTrackAtVertex(newLink2);
255 std::vector<Amg::Vector3D> positionList;
258 if( !
m_postSelector->selectConversionCandidate(convVertexCandidate.get(),0,positionList) ) {
259 convVertexCandidate.reset();
267 const xAOD::Vertex * constConvVertex = convVertexCandidate.get();
277 bool passDeltaM =
false;
280 std::vector<const xAOD::Vertex*> candidateOniaVertices;
281 candidateOniaVertices.clear();
283 for ( std::vector<const xAOD::Vertex*>::const_iterator vtxItr = oniaVertices.begin(); vtxItr != oniaVertices.end(); ++vtxItr ) {
290 std::vector<float> diMuon_Px = RefTrackPxAcc(*oniaVertex);
291 std::vector<float> diMuon_Py = RefTrackPyAcc(*oniaVertex);
292 std::vector<float> diMuon_Pz = RefTrackPzAcc(*oniaVertex);
294 TLorentzVector muon1, muon2;
295 muon1.SetXYZM(diMuon_Px.at(0),diMuon_Py.at(0),diMuon_Pz.at(0),105.658);
296 muon2.SetXYZM(diMuon_Px.at(1),diMuon_Py.at(1),diMuon_Pz.at(1),105.658);
298 TLorentzVector diMuon = muon1 + muon2;
300 const double deltaM = (diMuon+
photon).M() - diMuon.M();
302 ATH_MSG_DEBUG(
"Candidate DeltaM = " << deltaM <<
" MeV DiMuon " << oniaVertex->
index() <<
" ( Mass = " << diMuon.M() <<
" MeV )");
307 candidateOniaVertices.push_back(oniaVertex);
314 convVertexCandidate.reset();
322 nConv_Selected_DeltaM++;
325 std::vector< ElementLink<xAOD::VertexContainer> > diMuonLinks;
329 std::vector<float> fit_Psi1S_Px, fit_Psi1S_Py, fit_Psi1S_Pz, fit_Psi1S_M, fit_Psi1S_ChiSq;
330 std::vector<float> fit_Psi2S_Px, fit_Psi2S_Py, fit_Psi2S_Pz, fit_Psi2S_M, fit_Psi2S_ChiSq;
331 std::vector<float> fit_Upsi1S_Px, fit_Upsi1S_Py, fit_Upsi1S_Pz, fit_Upsi1S_M, fit_Upsi1S_ChiSq;
332 std::vector<float> fit_Upsi2S_Px, fit_Upsi2S_Py, fit_Upsi2S_Pz, fit_Upsi2S_M, fit_Upsi2S_ChiSq;
333 std::vector<float> fit_Upsi3S_Px, fit_Upsi3S_Py, fit_Upsi3S_Pz, fit_Upsi3S_M, fit_Upsi3S_ChiSq;
336 for(std::vector<const xAOD::Vertex*>::const_iterator vtxItr = candidateOniaVertices.begin(); vtxItr != candidateOniaVertices.end(); ++vtxItr ) {
350 diMuonLinks.push_back(myLink);
356 bool passed_Psi = passed_PsiAcc(**vtxItr);
357 bool passed_Upsi = passed_UpsiAcc(**vtxItr);
362 float fitChiSq_Psi1S = 99999;
363 TLorentzVector fitResult_Psi1S;
371 fit_Psi1S_Px.push_back(fitResult_Psi1S.Px());
372 fit_Psi1S_Py.push_back(fitResult_Psi1S.Py());
373 fit_Psi1S_Pz.push_back(fitResult_Psi1S.Pz());
374 fit_Psi1S_M.push_back(fitResult_Psi1S.M());
375 fit_Psi1S_ChiSq.push_back(fitChiSq_Psi1S);
380 float fitChiSq_Psi2S = 99999;
381 TLorentzVector fitResult_Psi2S;
389 fit_Psi2S_Px.push_back(fitResult_Psi2S.Px());
390 fit_Psi2S_Py.push_back(fitResult_Psi2S.Py());
391 fit_Psi2S_Pz.push_back(fitResult_Psi2S.Pz());
392 fit_Psi2S_M.push_back(fitResult_Psi2S.M());
393 fit_Psi2S_ChiSq.push_back(fitChiSq_Psi2S);
398 float fitChiSq_Upsi1S = 99999;
399 TLorentzVector fitResult_Upsi1S;
407 fit_Upsi1S_Px.push_back(fitResult_Upsi1S.Px());
408 fit_Upsi1S_Py.push_back(fitResult_Upsi1S.Py());
409 fit_Upsi1S_Pz.push_back(fitResult_Upsi1S.Pz());
410 fit_Upsi1S_M.push_back(fitResult_Upsi1S.M());
411 fit_Upsi1S_ChiSq.push_back(fitChiSq_Upsi1S);
416 float fitChiSq_Upsi2S = 99999;
417 TLorentzVector fitResult_Upsi2S;
425 fit_Upsi2S_Px.push_back(fitResult_Upsi2S.Px());
426 fit_Upsi2S_Py.push_back(fitResult_Upsi2S.Py());
427 fit_Upsi2S_Pz.push_back(fitResult_Upsi2S.Pz());
428 fit_Upsi2S_M.push_back(fitResult_Upsi2S.M());
429 fit_Upsi2S_ChiSq.push_back(fitChiSq_Upsi2S);
434 float fitChiSq_Upsi3S = 99999;
435 TLorentzVector fitResult_Upsi3S;
443 fit_Upsi3S_Px.push_back(fitResult_Upsi3S.Px());
444 fit_Upsi3S_Py.push_back(fitResult_Upsi3S.Py());
445 fit_Upsi3S_Pz.push_back(fitResult_Upsi3S.Pz());
446 fit_Upsi3S_M.push_back(fitResult_Upsi3S.M());
447 fit_Upsi3S_ChiSq.push_back(fitChiSq_Upsi3S);
457 DiMuonLinksAcc(*convVertexCandidate) = diMuonLinks;
464 CascadeFit_Psi1S_PxAcc(*convVertexCandidate) = fit_Psi1S_Px;
465 CascadeFit_Psi1S_PyAcc(*convVertexCandidate) = fit_Psi1S_Py;
466 CascadeFit_Psi1S_PzAcc(*convVertexCandidate) = fit_Psi1S_Pz;
467 CascadeFit_Psi1S_MAcc(*convVertexCandidate) = fit_Psi1S_M;
468 CascadeFit_Psi1S_ChiSqAcc(*convVertexCandidate) = fit_Psi1S_ChiSq;
475 CascadeFit_Psi2S_PxAcc(*convVertexCandidate) = fit_Psi2S_Px;
476 CascadeFit_Psi2S_PyAcc(*convVertexCandidate) = fit_Psi2S_Py;
477 CascadeFit_Psi2S_PzAcc(*convVertexCandidate) = fit_Psi2S_Pz;
478 CascadeFit_Psi2S_MAcc(*convVertexCandidate) = fit_Psi2S_M;
479 CascadeFit_Psi2S_ChiSqAcc(*convVertexCandidate) = fit_Psi2S_ChiSq;
486 CascadeFit_Upsi1S_PxAcc(*convVertexCandidate) = fit_Upsi1S_Px;
487 CascadeFit_Upsi1S_PyAcc(*convVertexCandidate) = fit_Upsi1S_Py;
488 CascadeFit_Upsi1S_PzAcc(*convVertexCandidate) = fit_Upsi1S_Pz;
489 CascadeFit_Upsi1S_MAcc(*convVertexCandidate) = fit_Upsi1S_M;
490 CascadeFit_Upsi1S_ChiSqAcc(*convVertexCandidate) = fit_Upsi1S_ChiSq;
497 CascadeFit_Upsi2S_PxAcc(*convVertexCandidate) = fit_Upsi2S_Px;
498 CascadeFit_Upsi2S_PyAcc(*convVertexCandidate) = fit_Upsi2S_Py;
499 CascadeFit_Upsi2S_PzAcc(*convVertexCandidate) = fit_Upsi2S_Pz;
500 CascadeFit_Upsi2S_MAcc(*convVertexCandidate) = fit_Upsi2S_M;
501 CascadeFit_Upsi2S_ChiSqAcc(*convVertexCandidate) = fit_Upsi2S_ChiSq;
508 CascadeFit_Upsi3S_PxAcc(*convVertexCandidate) = fit_Upsi3S_Px;
509 CascadeFit_Upsi3S_PyAcc(*convVertexCandidate) = fit_Upsi3S_Py;
510 CascadeFit_Upsi3S_PzAcc(*convVertexCandidate) = fit_Upsi3S_Pz;
511 CascadeFit_Upsi3S_MAcc(*convVertexCandidate) = fit_Upsi3S_M;
512 CascadeFit_Upsi3S_ChiSqAcc(*convVertexCandidate) = fit_Upsi3S_ChiSq;
517 pxAcc(*convVertexCandidate) =
momentum.x();
518 pyAcc(*convVertexCandidate) =
momentum.y();
519 pzAcc(*convVertexCandidate) =
momentum.z();
523 deltaCotThetaTrkAcc(*convVertexCandidate) = deltaCotTheta;
524 minimumDistanceTrkAcc(*convVertexCandidate) =
distance;
528 deltaPhiTracksAcc(*convVertexCandidate) = vertexOutput[
"deltaPhiTracks"];
529 DR1R2Acc(*convVertexCandidate) = vertexOutput[
"DR1R2"];
532 passedAcc(*convVertexCandidate) =
true;
534 conversionContainer->push_back(convVertexCandidate.release());
551 ATH_MSG_DEBUG(
"Number of track pairs: " << nTrackPairs_Init);
552 ATH_MSG_DEBUG(
"Number of track pairs selected: " << nTrackPairs_Selected);
553 ATH_MSG_DEBUG(
"Number of successful vertex fits: " << nConv_VertexFit);
554 ATH_MSG_DEBUG(
"Number of selected vertices: " << nConv_Selected);
555 ATH_MSG_DEBUG(
"Number of selected vertices (after DeltaM req.): " << nConv_Selected_DeltaM);
557 return StatusCode::SUCCESS;