73 ATH_MSG_DEBUG(
"Muon container size "<<importedMuonCollection->size());
78 ATH_MSG_DEBUG(
"ID TrackParticle container size "<< importedTrackCollection->size());
81 std::vector<const xAOD::Muon*> theMuonsAfterSelection;
83 unsigned int nCombMuons = 0;
84 unsigned int nSegmentTaggedMuons = 0;
86 for (
const auto * muon : *importedMuonCollection) {
87 if ( !muon )
continue;
88 muonDecorator(*muon) = -1;
89 if ( (muon->muonType() != xAOD::Muon::MuonType::Combined ) && (muon->muonType() != xAOD::Muon::MuonType::SegmentTagged ) )
continue;
90 const xAOD::TrackParticle* muonTrk = muon->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
91 if ( !muonTrk )
continue;
94 if ( fabs(muonTrk->
pt())<
m_ptCut )
continue;
96 if ( muon->muonType() == xAOD::Muon::MuonType::Combined ) ++nCombMuons;
97 if ( muon->muonType() == xAOD::Muon::MuonType::SegmentTagged ) ++nSegmentTaggedMuons;
98 theMuonsAfterSelection.push_back(muon);
100 unsigned int nSelectedMuons = theMuonsAfterSelection.size();
101 ATH_MSG_DEBUG(
"Number of muons after selection: " << nSelectedMuons);
103 ATH_MSG_DEBUG(
"and " << nSegmentTaggedMuons <<
" are segment tagged");
104 if ( (nSelectedMuons < 4) || (nCombMuons < 1) ) {
106 return StatusCode::SUCCESS;
111 SG::AuxElement::Decorator< std::string > indexDecorator(
"CombinationCode");
112 SG::AuxElement::Decorator< std::string > chargeDecorator(
"ChargeCode");
116 return b->pt() < a->pt();
120 unsigned int muonIndex(0);
121 for (
auto selMuon : theMuonsAfterSelection) {
122 muonDecorator(*selMuon) = muonIndex;
127 std::vector<Combination> quadruplets;
128 std::vector<Combination> pairs;
130 if (quadruplets.size()==0) {
132 return StatusCode::SUCCESS;
138 const Amg::Vector3D beamSpot(evt->beamPosX(), evt->beamPosY(), evt->beamPosZ());
142 for (std::vector<Combination>::iterator pairItr = pairs.begin(); pairItr!=pairs.end(); ++pairItr) {
143 std::vector<const xAOD::TrackParticle*> theTracks = (*pairItr).trackParticles(
"pair1");
144 std::unique_ptr<xAOD::Vertex> pairVxCandidate =
fit(ctx,theTracks,importedTrackCollection.
get(),beamSpot);
145 if (pairVxCandidate) {
147 indexDecorator(*pairVxCandidate) = (*pairItr).combinationIndices();
148 chargeDecorator(*pairVxCandidate) = (*pairItr).combinationCharges();
152 std::vector<const xAOD::Muon*> theStoredMuons;
153 theStoredMuons = (*pairItr).muons;
154 helper.setMuons(theStoredMuons,importedMuonCollection.
get());
155 ATH_MSG_DEBUG(
"..... indices: " << (*pairItr).combinationIndices() <<
156 " charges: " << (*pairItr).combinationCharges() <<
157 " chi2: " << pairVxCandidate->chiSquared());
159 pairVxContainer->
push_back(std::move(pairVxCandidate));
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(
"DC");
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);
194 return StatusCode::SUCCESS;;
204 const std::vector<const xAOD::TrackParticle*> &inputTracks,
212 if(concreteVertexFitter == 0) {
213 ATH_MSG_FATAL(
"The vertex fitter passed is not a V0 Vertex Fitter");
218 std::unique_ptr<xAOD::Vertex> myVxCandidate;
220 myVxCandidate = concreteVertexFitter->
fit(ctx, inputTracks, beamSpot );
227 return myVxCandidate;
262 std::vector<unsigned int> &combination,
263 std::vector<unsigned int> &mainList,
264 std::vector<std::vector<unsigned int> > &allCombinations) {
266 allCombinations.push_back(combination);
270 for (
unsigned int i=offset; i<=mainList.size()-k; ++i) {
271 combination.push_back(mainList[i]);
273 combination.pop_back();
284 std::vector<std::pair<unsigned int, unsigned int> > uniquePairs;
285 std::vector<std::vector<unsigned int> > doublets =
mFromN(2,
length);
286 for (std::vector<std::vector<unsigned int> >
::iterator it=doublets.begin(); it!=doublets.end(); ++it) {
287 std::pair<unsigned int, unsigned int> tmpPair = std::make_pair((*it).at(0),(*it).at(1));
288 uniquePairs.push_back(tmpPair);
303 std::vector<Combination> &pairs,
304 std::vector<Combination> &quadruplets,
305 unsigned int nSelectedMuons) {
307 std::vector<std::vector<unsigned int> > quadrupletIndices =
getQuadIndices(nSelectedMuons);
308 std::vector<std::pair<unsigned int, unsigned int> > pairIndices =
getPairIndices(nSelectedMuons);
311 std::vector<std::vector<unsigned int> >
::iterator quadItr;
312 for (quadItr=quadrupletIndices.begin(); quadItr!=quadrupletIndices.end(); ++quadItr) {
313 const std::vector<unsigned int> &quad = (*quadItr);
314 std::vector<const xAOD::Muon*> theMuons = {muonsIn[quad[0]],muonsIn[quad[1]],muonsIn[quad[2]],muonsIn[quad[3]]};
317 tmpQuad.
muons = std::move(theMuons);
319 quadruplets.emplace_back(std::move(tmpQuad));
321 if (quadruplets.size() == 0)
return;
324 std::vector<std::pair<unsigned int, unsigned int> >
::iterator pairItr;
325 for (pairItr=pairIndices.begin(); pairItr!=pairIndices.end(); ++pairItr) {
326 std::pair<unsigned int, unsigned int>
pair = (*pairItr);
328 std::vector<const xAOD::Muon*> theMuons = {muonsIn[
pair.first],muonsIn[
pair.second]};
329 tmpPair.
muons = std::move(theMuons);
331 pairs.emplace_back(std::move(tmpPair));
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.