19#include "AthLinks/ElementLink.h"
50 return StatusCode::SUCCESS;
71 ATH_MSG_DEBUG(
"Muon container size "<<importedMuonCollection->size());
76 ATH_MSG_DEBUG(
"ID TrackParticle container size "<< importedTrackCollection->size());
79 std::vector<const xAOD::Muon*> theMuonsAfterSelection;
81 unsigned int nCombMuons = 0;
82 unsigned int nSegmentTaggedMuons = 0;
84 for (
const auto * muon : *importedMuonCollection) {
85 if ( !muon )
continue;
86 muonDecorator(*muon) = -1;
87 if ( (muon->muonType() != xAOD::Muon::MuonType::Combined ) && (muon->muonType() != xAOD::Muon::MuonType::SegmentTagged ) )
continue;
88 const xAOD::TrackParticle* muonTrk = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
89 if ( !muonTrk )
continue;
92 if ( fabs(muonTrk->
pt())<
m_ptCut )
continue;
94 if ( muon->muonType() == xAOD::Muon::MuonType::Combined ) ++nCombMuons;
95 if ( muon->muonType() == xAOD::Muon::MuonType::SegmentTagged ) ++nSegmentTaggedMuons;
96 theMuonsAfterSelection.push_back(muon);
98 unsigned int nSelectedMuons = theMuonsAfterSelection.size();
99 ATH_MSG_DEBUG(
"Number of muons after selection: " << nSelectedMuons);
101 ATH_MSG_DEBUG(
"and " << nSegmentTaggedMuons <<
" are segment tagged");
102 if ( (nSelectedMuons < 4) || (nCombMuons < 1) ) {
104 return StatusCode::SUCCESS;
114 return b->pt() < a->pt();
118 unsigned int muonIndex(0);
119 for (
auto selMuon : theMuonsAfterSelection) {
120 muonDecorator(*selMuon) = muonIndex;
125 std::vector<Combination> quadruplets;
126 std::vector<Combination> pairs;
128 if (quadruplets.size()==0) {
130 return StatusCode::SUCCESS;
136 const Amg::Vector3D beamSpot(evt->beamPosX(), evt->beamPosY(), evt->beamPosZ());
140 const std::string pairStr{
"pair1"};
141 for (std::vector<Combination>::iterator pairItr = pairs.begin(); pairItr!=pairs.end(); ++pairItr) {
142 std::vector<const xAOD::TrackParticle*> theTracks = (*pairItr).trackParticles(pairStr);
143 std::unique_ptr<xAOD::Vertex> pairVxCandidate =
fit(ctx,theTracks,importedTrackCollection.
get(),beamSpot);
144 if (pairVxCandidate) {
146 indexDecorator(*pairVxCandidate) = (*pairItr).combinationIndices();
147 chargeDecorator(*pairVxCandidate) = (*pairItr).combinationCharges();
151 std::vector<const xAOD::Muon*> theStoredMuons;
152 theStoredMuons = (*pairItr).muons;
153 helper.setMuons(theStoredMuons,importedMuonCollection.
get());
154 ATH_MSG_DEBUG(
"..... indices: " << (*pairItr).combinationIndices() <<
155 " charges: " << (*pairItr).combinationCharges() <<
156 " chi2: " << pairVxCandidate->chiSquared());
158 pairVxContainer->
push_back(std::move(pairVxCandidate));
167 const std::string dcStr{
"DC"};
168 for (std::vector<Combination>::iterator quadItr = quadruplets.begin(); quadItr!=quadruplets.end(); ++quadItr) {
169 std::vector<const xAOD::TrackParticle*> theDCTracks; theDCTracks.clear();
170 theDCTracks = (*quadItr).trackParticles(dcStr);
171 std::unique_ptr<xAOD::Vertex> dcVxCandidate =
fit(ctx,theDCTracks,importedTrackCollection.
get(), beamSpot);
172 if (dcVxCandidate != 0) {
174 indexDecorator(*dcVxCandidate) = (*quadItr).combinationIndices();
175 chargeDecorator(*dcVxCandidate) = (*quadItr).combinationCharges();
177 double dcChi2 = dcVxCandidate->chiSquared();
181 const std::vector<const xAOD::Muon*> &theStoredMuons = (*quadItr).muons;
182 helper.setMuons(theStoredMuons,importedMuonCollection.
get());
184 quadVxContainer->
push_back(std::move(dcVxCandidate));
185 ATH_MSG_DEBUG(
"..... indices: " << (*quadItr).combinationIndices() <<
186 " charges: " << (*quadItr).combinationCharges() <<
187 " chi2(DC): " << dcChi2);
193 if(quadVxContainer->
size() > 500){
194 ATH_MSG_WARNING(
"Event Run: " << evt->runNumber() <<
" Event: " << evt->eventNumber() <<
" quadruplet container size " << quadVxContainer->
size());
197 return StatusCode::SUCCESS;;
207 const std::vector<const xAOD::TrackParticle*> &inputTracks,
212 std::unique_ptr<xAOD::Vertex> myVxCandidate =
m_iVertexFitter->fit(ctx, inputTracks, beamSpot );
216 return myVxCandidate;
229 std::vector<std::vector<unsigned int> > quadIndices =
mFromN(4,
length);
241 std::vector<std::vector<unsigned int> > allCombinations;
242 std::vector<unsigned int> mainList;
243 std::vector<unsigned int> combination;
244 for (
unsigned int i=0; i<N; ++i) mainList.push_back(i);
246 return allCombinations;
251 std::vector<unsigned int> &combination,
252 std::vector<unsigned int> &mainList,
253 std::vector<std::vector<unsigned int> > &allCombinations) {
255 allCombinations.push_back(combination);
259 for (
unsigned int i=offset; i<=mainList.size()-k; ++i) {
260 combination.push_back(mainList[i]);
262 combination.pop_back();
273 std::vector<std::pair<unsigned int, unsigned int> > uniquePairs;
274 std::vector<std::vector<unsigned int> > doublets =
mFromN(2,
length);
275 for (std::vector<std::vector<unsigned int> >
::iterator it=doublets.begin(); it!=doublets.end(); ++it) {
276 std::pair<unsigned int, unsigned int> tmpPair = std::make_pair((*it).at(0),(*it).at(1));
277 uniquePairs.push_back(tmpPair);
292 std::vector<Combination> &pairs,
293 std::vector<Combination> &quadruplets,
294 unsigned int nSelectedMuons) {
296 std::vector<std::vector<unsigned int> > quadrupletIndices =
getQuadIndices(nSelectedMuons);
297 std::vector<std::pair<unsigned int, unsigned int> > pairIndices =
getPairIndices(nSelectedMuons);
300 std::vector<std::vector<unsigned int> >
::iterator quadItr;
301 for (quadItr=quadrupletIndices.begin(); quadItr!=quadrupletIndices.end(); ++quadItr) {
302 const std::vector<unsigned int> &quad = (*quadItr);
303 std::vector<const xAOD::Muon*> theMuons = {muonsIn[quad[0]],muonsIn[quad[1]],muonsIn[quad[2]],muonsIn[quad[3]]};
306 tmpQuad.
muons = std::move(theMuons);
308 quadruplets.emplace_back(std::move(tmpQuad));
310 if (quadruplets.size() == 0)
return;
313 std::vector<std::pair<unsigned int, unsigned int> >
::iterator pairItr;
314 for (pairItr=pairIndices.begin(); pairItr!=pairIndices.end(); ++pairItr) {
315 std::pair<unsigned int, unsigned int>
pair = (*pairItr);
317 std::vector<const xAOD::Muon*> theMuons = {muonsIn[
pair.first],muonsIn[
pair.second]};
318 tmpPair.
muons = std::move(theMuons);
320 pairs.emplace_back(std::move(tmpPair));
337 if (( muons.at(0)->muonType() == xAOD::Muon::MuonType::Combined ) ||
338 ( muons.at(1)->muonType() == xAOD::Muon::MuonType::Combined ) ||
339 ( muons.at(2)->muonType() == xAOD::Muon::MuonType::Combined ) ||
340 ( muons.at(3)->muonType() == xAOD::Muon::MuonType::Combined )
342 if (charges && quality) accept =
true;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
: B-physics xAOD helpers.
Handle class for adding a decoration to an object.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
Handle class for adding a decoration to an object.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Eigen::Matrix< double, 3, 1 > Vector3D
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
std::vector< const xAOD::Muon * > muons
std::vector< unsigned int > quadIndices
std::pair< unsigned int, unsigned int > pairIndices