167 return StatusCode::SUCCESS;;
169 importedElectronCollection = ehandle.
cptr();
179 return StatusCode::SUCCESS;;
181 importedTrackCollection = thandle.
cptr();
185 typedef std::vector<const xAOD::TrackParticle*> TrackBag;
186 typedef std::vector<const xAOD::Electron*> ElectronBag;
190 TrackBag theIDTracksAfterSelection;
193 for (trkCItr=importedTrackCollection->
begin(); trkCItr!=importedTrackCollection->
end(); ++trkCItr) {
197 theIDTracksAfterSelection.push_back(TP);
199 if (theIDTracksAfterSelection.size() == 0)
return StatusCode::SUCCESS;;
200 ATH_MSG_DEBUG(
"Number of tracks after ID track selection: " << theIDTracksAfterSelection.size());
204 ElectronBag theElectronsAfterSelection;
207 for (elItr=importedElectronCollection->
begin(); elItr!=importedElectronCollection->
end(); ++elItr) {
208 if ( *elItr == NULL )
continue;
209 if (!(*elItr)->trackParticleLink().isValid())
continue;
215 if (!refittedTrackLink.
isValid())
continue;
216 elTrk = *refittedTrackLink;
218 if (!(*elItr)->trackParticleLink().isValid())
continue;
219 elTrk = (*elItr)->trackParticleLink().cachedElement();
222 if ( elTrk==NULL)
continue;
227 theElectronsAfterSelection.push_back(*elItr);
229 if (theElectronsAfterSelection.size() == 0)
return StatusCode::SUCCESS;;
230 ATH_MSG_DEBUG(
"Number of electrons after selection: " << theElectronsAfterSelection.size());
234 std::vector<JpsiEECandidate> jpsiCandidates;
235 if (
m_elel) jpsiCandidates =
getPairs(theElectronsAfterSelection);
239 ATH_MSG_DEBUG(
"Number of pairs with ee from a B decay: " << jpsiCandidates.size() );
242 std::vector<JpsiEECandidate>::iterator jpsiItr;
251 for (jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end(); ++jpsiItr) {
252 (*jpsiItr).collection1 = importedTrackCollection;
253 (*jpsiItr).collection2 = importedTrackCollection;
258 for (jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end(); ++jpsiItr) {
265 (*jpsiItr).trackParticle1 = *refittedTrackLink1;
266 (*jpsiItr).trackParticle2 = *refittedTrackLink2;
268 (*jpsiItr).trackParticle1 = (*jpsiItr).el1->trackParticleLink().cachedElement();
269 (*jpsiItr).trackParticle2 = (*jpsiItr).el2->trackParticleLink().cachedElement();
271 (*jpsiItr).collection1 = importedTrackCollection;
272 (*jpsiItr).collection2 = importedTrackCollection;
274 ATH_MSG_WARNING(
"Not setup for non-track electron measurements yet....");
283 std::vector<int> listToDelete;
284 std::vector<int>::reverse_iterator ii;
285 for(jpsiItr=jpsiCandidates.begin(); jpsiItr!=jpsiCandidates.end();++jpsiItr,++
index) {
286 if( (fabs((*jpsiItr).trackParticle1->pt()) <
m_higherPt) && (fabs((*jpsiItr).trackParticle2->pt()) <
m_higherPt) ) listToDelete.push_back(
index);
288 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
289 jpsiCandidates.erase(jpsiCandidates.begin() + (*ii) );
291 ATH_MSG_DEBUG(
"Number of candidates after higherPt cut: " << jpsiCandidates.size() );
295 std::vector<JpsiEECandidate> sortedJpsiEECandidates;
299 ATH_MSG_DEBUG(
"Number of candidates after charge selection: " << sortedJpsiEECandidates.size() );
304 std::vector<int> listToDelete;
305 std::vector<int>::reverse_iterator ii;
306 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end();++jpsiItr,++
index) {
307 double deltatheta = fabs( (*jpsiItr).trackParticle1->theta() - (*jpsiItr).trackParticle2->theta() );
309 double deltaphi = std::abs(
xAOD::P4Helpers::deltaPhi((*jpsiItr).trackParticle1->phi0() , (*jpsiItr).trackParticle2->phi0()));
313 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
314 sortedJpsiEECandidates.erase(sortedJpsiEECandidates.begin() + (*ii) );
316 ATH_MSG_DEBUG(
"Number of collimated candidates: " << sortedJpsiEECandidates.size() );
320 std::vector<double> trkMasses;
325 std::vector<int> listToDelete;
326 std::vector<int>::reverse_iterator ii;
327 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end(); ++jpsiItr,++
index) {
331 listToDelete.push_back(
index);
334 for (ii=listToDelete.rbegin(); ii!=listToDelete.rend(); ++ii) {
335 sortedJpsiEECandidates.erase(sortedJpsiEECandidates.begin() + (*ii) );
337 ATH_MSG_DEBUG(
"Number of candidates passing invariant mass selection: " << sortedJpsiEECandidates.size() );
340 if (sortedJpsiEECandidates.size() == 0)
return StatusCode::SUCCESS;;
344 for(jpsiItr=sortedJpsiEECandidates.begin(); jpsiItr!=sortedJpsiEECandidates.end(); ++jpsiItr) {
346 std::vector<const xAOD::TrackParticle*> theTracks; theTracks.clear();
347 theTracks.push_back((*jpsiItr).trackParticle1);
348 theTracks.push_back((*jpsiItr).trackParticle2);
349 ATH_MSG_DEBUG(
"theTracks size (should be two!) " << theTracks.size() <<
" being vertexed with tracks " << importedTrackCollection);
350 std::unique_ptr<xAOD::Vertex> myVxCandidate{
fit(ctx, theTracks,importedTrackCollection)};
351 if (myVxCandidate != 0) {
353 double chi2 = myVxCandidate->chiSquared();
360 std::vector<const xAOD::Electron*> theStoredElectrons;
361 theStoredElectrons.push_back((*jpsiItr).el1);
362 if (
m_elel) theStoredElectrons.push_back((*jpsiItr).el2);
363 jpsiHelper.
setElectrons(theStoredElectrons,importedElectronCollection);
366 vxContainer.
push_back(std::move(myVxCandidate));
377 return StatusCode::SUCCESS;;
389 const Trk::Perigee& aPerigee1 = inputTracks[0]->perigeeParameters();
390 const Trk::Perigee& aPerigee2 = inputTracks[1]->perigeeParameters();
394 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
396 auto myVxCandidate =
m_iVertexFitter->fit(ctx, inputTracks, startingPoint);
397 ATH_MSG_DEBUG(
"Initial fit was a success! " << myVxCandidate);
399 if(myVxCandidate != 0){
400 std::vector<ElementLink<DataVector<xAOD::TrackParticle> > > newLinkVector;
401 for(
unsigned int i=0; i< myVxCandidate->trackParticleLinks().
size(); i++){
404 newLinkVector.push_back( mylink );
407 myVxCandidate->clearTracks();
408 myVxCandidate->setTrackParticleLinks( newLinkVector );
412 return myVxCandidate;
A number of constexpr particle constants to avoid hardcoding them directly in various places.
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.