170 return StatusCode::SUCCESS;;
172 importedElectronCollection = ehandle.
cptr();
182 return StatusCode::SUCCESS;;
184 importedTrackCollection = thandle.
cptr();
188 typedef std::vector<const xAOD::TrackParticle*> TrackBag;
189 typedef std::vector<const xAOD::Electron*> ElectronBag;
193 TrackBag theIDTracksAfterSelection;
196 for (trkCItr=importedTrackCollection->
begin(); trkCItr!=importedTrackCollection->
end(); ++trkCItr) {
200 theIDTracksAfterSelection.push_back(TP);
202 if (theIDTracksAfterSelection.size() == 0)
return StatusCode::SUCCESS;;
203 ATH_MSG_DEBUG(
"Number of tracks after ID track selection: " << theIDTracksAfterSelection.size());
207 ElectronBag theElectronsAfterSelection;
210 for (elItr=importedElectronCollection->
begin(); elItr!=importedElectronCollection->
end(); ++elItr) {
211 if ( *elItr == NULL )
continue;
212 if (!(*elItr)->trackParticleLink().isValid())
continue;
218 if (!refittedTrackLink.
isValid())
continue;
219 elTrk = *refittedTrackLink;
221 if (!(*elItr)->trackParticleLink().isValid())
continue;
222 elTrk = (*elItr)->trackParticleLink().cachedElement();
225 if ( elTrk==NULL)
continue;
230 theElectronsAfterSelection.push_back(*elItr);
232 if (theElectronsAfterSelection.size() == 0)
return StatusCode::SUCCESS;;
233 ATH_MSG_DEBUG(
"Number of electrons after selection: " << theElectronsAfterSelection.size());
237 std::vector<JpsiEECandidate> jpsiCandidates;
238 if (
m_elel) jpsiCandidates =
getPairs(theElectronsAfterSelection);
242 ATH_MSG_DEBUG(
"Number of pairs with ee from a B decay: " << jpsiCandidates.size() );
245 std::vector<JpsiEECandidate>::iterator jpsiItr;
254 for (jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end(); ++jpsiItr) {
255 (*jpsiItr).collection1 = importedTrackCollection;
256 (*jpsiItr).collection2 = importedTrackCollection;
261 for (jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end(); ++jpsiItr) {
268 (*jpsiItr).trackParticle1 = *refittedTrackLink1;
269 (*jpsiItr).trackParticle2 = *refittedTrackLink2;
271 (*jpsiItr).trackParticle1 = (*jpsiItr).el1->trackParticleLink().cachedElement();
272 (*jpsiItr).trackParticle2 = (*jpsiItr).el2->trackParticleLink().cachedElement();
274 (*jpsiItr).collection1 = importedTrackCollection;
275 (*jpsiItr).collection2 = importedTrackCollection;
277 ATH_MSG_WARNING(
"Not setup for non-track electron measurements yet....");
286 std::vector<int> listToDelete;
287 std::vector<int>::reverse_iterator ii;
288 for(jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end();++jpsiItr,++
index) {
289 if( (fabs((*jpsiItr).trackParticle1->pt()) <
m_higherPt) && (fabs((*jpsiItr).trackParticle2->pt()) <
m_higherPt) ) listToDelete.push_back(
index);
291 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
292 jpsiCandidates.erase(jpsiCandidates.begin() + (*ii) );
294 ATH_MSG_DEBUG(
"Number of candidates after higherPt cut: " << jpsiCandidates.size() );
298 std::vector<JpsiEECandidate> sortedJpsiEECandidates;
302 ATH_MSG_DEBUG(
"Number of candidates after charge selection: " << sortedJpsiEECandidates.size() );
307 std::vector<int> listToDelete;
308 std::vector<int>::reverse_iterator ii;
309 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end();++jpsiItr,++
index) {
310 double deltatheta = fabs( (*jpsiItr).trackParticle1->theta() - (*jpsiItr).trackParticle2->theta() );
312 double deltaphi = std::abs(
xAOD::P4Helpers::deltaPhi((*jpsiItr).trackParticle1->phi0() , (*jpsiItr).trackParticle2->phi0()));
316 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
317 sortedJpsiEECandidates.erase(sortedJpsiEECandidates.begin() + (*ii) );
319 ATH_MSG_DEBUG(
"Number of collimated candidates: " << sortedJpsiEECandidates.size() );
323 std::vector<double> trkMasses;
328 std::vector<int> listToDelete;
329 std::vector<int>::reverse_iterator ii;
330 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end(); ++jpsiItr,++
index) {
334 listToDelete.push_back(
index);
337 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
338 sortedJpsiEECandidates.erase(sortedJpsiEECandidates.begin() + (*ii) );
340 ATH_MSG_DEBUG(
"Number of candidates passing invariant mass selection: " << sortedJpsiEECandidates.size() );
343 if (sortedJpsiEECandidates.size() == 0)
return StatusCode::SUCCESS;;
347 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end(); ++jpsiItr) {
349 std::vector<const xAOD::TrackParticle*> theTracks; theTracks.clear();
350 theTracks.push_back((*jpsiItr).trackParticle1);
351 theTracks.push_back((*jpsiItr).trackParticle2);
352 ATH_MSG_DEBUG(
"theTracks size (should be two!) " << theTracks.size() <<
" being vertexed with tracks " << importedTrackCollection);
353 std::unique_ptr<xAOD::Vertex> myVxCandidate{
fit(ctx, theTracks,importedTrackCollection)};
354 if (myVxCandidate != 0) {
356 double chi2 = myVxCandidate->chiSquared();
363 std::vector<const xAOD::Electron*> theStoredElectrons;
364 theStoredElectrons.push_back((*jpsiItr).el1);
365 if (
m_elel) theStoredElectrons.push_back((*jpsiItr).el2);
366 jpsiHelper.
setElectrons(theStoredElectrons,importedElectronCollection);
369 vxContainer.
push_back(std::move(myVxCandidate));
380 return StatusCode::SUCCESS;;
392 const Trk::Perigee& aPerigee1 = inputTracks[0]->perigeeParameters();
393 const Trk::Perigee& aPerigee2 = inputTracks[1]->perigeeParameters();
397 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
399 auto myVxCandidate =
m_iVertexFitter->fit(ctx, inputTracks, startingPoint);
400 ATH_MSG_DEBUG(
"Initial fit was a success! " << myVxCandidate);
402 if(myVxCandidate != 0){
403 std::vector<ElementLink<DataVector<xAOD::TrackParticle> > > newLinkVector;
404 for(
unsigned int i=0; i< myVxCandidate->trackParticleLinks().
size(); i++){
407 newLinkVector.push_back( mylink );
410 myVxCandidate->clearTracks();
411 myVxCandidate->setTrackParticleLinks( newLinkVector );
415 return myVxCandidate;
virtual double pt() const override final
The transverse momentum ( ) of the particle.
GenVecFourMom_t genvecP4() const
The full 4-momentum of the particle : GenVector form.