177 return StatusCode::SUCCESS;;
179 importedElectronCollection = ehandle.
cptr();
189 return StatusCode::SUCCESS;;
191 importedTrackCollection = thandle.
cptr();
195 typedef std::vector<const xAOD::TrackParticle*> TrackBag;
196 typedef std::vector<const xAOD::Electron*> ElectronBag;
200 TrackBag theIDTracksAfterSelection;
203 for (trkCItr=importedTrackCollection->
begin(); trkCItr!=importedTrackCollection->
end(); ++trkCItr) {
207 theIDTracksAfterSelection.push_back(TP);
209 if (theIDTracksAfterSelection.size() == 0)
return StatusCode::SUCCESS;;
210 ATH_MSG_DEBUG(
"Number of tracks after ID track selection: " << theIDTracksAfterSelection.size());
214 ElectronBag theElectronsAfterSelection;
217 for (elItr=importedElectronCollection->
begin(); elItr!=importedElectronCollection->
end(); ++elItr) {
218 if ( *elItr == NULL )
continue;
219 if (!(*elItr)->trackParticleLink().isValid())
continue;
225 if (!refittedTrackLink.
isValid())
continue;
226 elTrk = *refittedTrackLink;
228 if (!(*elItr)->trackParticleLink().isValid())
continue;
229 elTrk = (*elItr)->trackParticleLink().cachedElement();
232 if ( elTrk==NULL)
continue;
237 theElectronsAfterSelection.push_back(*elItr);
239 if (theElectronsAfterSelection.size() == 0)
return StatusCode::SUCCESS;;
240 ATH_MSG_DEBUG(
"Number of electrons after selection: " << theElectronsAfterSelection.size());
244 std::vector<JpsiEECandidate> jpsiCandidates;
245 if (
m_elel) jpsiCandidates =
getPairs(theElectronsAfterSelection);
249 ATH_MSG_DEBUG(
"Number of pairs with ee from a B decay: " << jpsiCandidates.size() );
252 std::vector<JpsiEECandidate>::iterator jpsiItr;
261 for (jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end(); ++jpsiItr) {
262 (*jpsiItr).collection1 = importedTrackCollection;
263 (*jpsiItr).collection2 = importedTrackCollection;
268 for (jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end(); ++jpsiItr) {
275 (*jpsiItr).trackParticle1 = *refittedTrackLink1;
276 (*jpsiItr).trackParticle2 = *refittedTrackLink2;
278 (*jpsiItr).trackParticle1 = (*jpsiItr).el1->trackParticleLink().cachedElement();
279 (*jpsiItr).trackParticle2 = (*jpsiItr).el2->trackParticleLink().cachedElement();
281 (*jpsiItr).collection1 = importedTrackCollection;
282 (*jpsiItr).collection2 = importedTrackCollection;
284 ATH_MSG_WARNING(
"Not setup for non-track electron measurements yet....");
293 std::vector<int> listToDelete;
294 std::vector<int>::reverse_iterator ii;
295 for(jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end();++jpsiItr,++
index) {
296 if( (fabs((*jpsiItr).trackParticle1->pt()) <
m_higherPt) && (fabs((*jpsiItr).trackParticle2->pt()) <
m_higherPt) ) listToDelete.push_back(
index);
298 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
299 jpsiCandidates.erase(jpsiCandidates.begin() + (*ii) );
301 ATH_MSG_DEBUG(
"Number of candidates after higherPt cut: " << jpsiCandidates.size() );
305 std::vector<JpsiEECandidate> sortedJpsiEECandidates;
309 ATH_MSG_DEBUG(
"Number of candidates after charge selection: " << sortedJpsiEECandidates.size() );
314 std::vector<int> listToDelete;
315 std::vector<int>::reverse_iterator ii;
316 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end();++jpsiItr,++
index) {
317 double deltatheta = fabs( (*jpsiItr).trackParticle1->theta() - (*jpsiItr).trackParticle2->theta() );
319 double deltaphi = std::abs(
xAOD::P4Helpers::deltaPhi((*jpsiItr).trackParticle1->phi0() , (*jpsiItr).trackParticle2->phi0()));
323 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
324 sortedJpsiEECandidates.erase(sortedJpsiEECandidates.begin() + (*ii) );
326 ATH_MSG_DEBUG(
"Number of collimated candidates: " << sortedJpsiEECandidates.size() );
330 std::vector<double> trkMasses;
335 std::vector<int> listToDelete;
336 std::vector<int>::reverse_iterator ii;
337 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end(); ++jpsiItr,++
index) {
341 listToDelete.push_back(
index);
344 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
345 sortedJpsiEECandidates.erase(sortedJpsiEECandidates.begin() + (*ii) );
347 ATH_MSG_DEBUG(
"Number of candidates passing invariant mass selection: " << sortedJpsiEECandidates.size() );
350 if (sortedJpsiEECandidates.size() == 0)
return StatusCode::SUCCESS;;
354 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end(); ++jpsiItr) {
356 std::vector<const xAOD::TrackParticle*> theTracks; theTracks.clear();
357 theTracks.push_back((*jpsiItr).trackParticle1);
358 theTracks.push_back((*jpsiItr).trackParticle2);
359 ATH_MSG_DEBUG(
"theTracks size (should be two!) " << theTracks.size() <<
" being vertexed with tracks " << importedTrackCollection);
360 std::unique_ptr<xAOD::Vertex> myVxCandidate{
fit(theTracks,importedTrackCollection)};
361 if (myVxCandidate != 0) {
363 double chi2 = myVxCandidate->chiSquared();
370 std::vector<const xAOD::Electron*> theStoredElectrons;
371 theStoredElectrons.push_back((*jpsiItr).el1);
372 if (
m_elel) theStoredElectrons.push_back((*jpsiItr).el2);
373 jpsiHelper.
setElectrons(theStoredElectrons,importedElectronCollection);
376 vxContainer.
push_back(std::move(myVxCandidate));
387 return StatusCode::SUCCESS;;
403 if(concreteVertexFitter == 0) {
404 ATH_MSG_FATAL(
"The vertex fitter passed is not a V0 Vertex Fitter");
409 const Trk::Perigee& aPerigee1 = inputTracks[0]->perigeeParameters();
410 const Trk::Perigee& aPerigee2 = inputTracks[1]->perigeeParameters();
414 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
416 xAOD::Vertex* myVxCandidate = concreteVertexFitter->
fit(inputTracks, startingPoint);
419 if(myVxCandidate != 0){
420 std::vector<ElementLink<DataVector<xAOD::TrackParticle> > > newLinkVector;
424 newLinkVector.push_back( mylink ); }
432 return myVxCandidate;
435 ATH_MSG_DEBUG(
"Initial fit was a success! " << myVxCandidate);
437 if(myVxCandidate != 0){
438 std::vector<ElementLink<DataVector<xAOD::TrackParticle> > > newLinkVector;
442 newLinkVector.push_back( mylink );
450 return myVxCandidate;
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.