ATLAS Offline Software
FourMuonTool.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // ****************************************************************************
6 // ----------------------------------------------------------------------------
7 // FourMuonTool header file
8 //
9 // James Catmore <James.Catmore@cern.ch>
10 
11 // ----------------------------------------------------------------------------
12 // ****************************************************************************
13 #ifndef BPHY4TOOL_H
14 #define BPHY4TOOL_H
16 #include "GaudiKernel/ToolHandle.h"
19 #include "xAODMuon/Muon.h"
20 #include "xAODMuon/MuonContainer.h"
21 
22 #include <vector>
23 #include <string>
25 
26 namespace Trk {
27  class IVertexFitter;
28  class TrkV0VertexFitter;
29  class ITrackSelectorTool;
30 }
31 
32 namespace DerivationFramework {
33 
34  static const InterfaceID IID_FourMuonTool("FourMuonTool", 1, 0);
35 
36  // Struct and enum to associate muon pairs with track pairs
37  // and make the program flow more straightforward
38  struct Combination
39  {
40  std::vector<const xAOD::Muon*> muons;
41  std::vector<unsigned int> quadIndices;
42  std::pair<unsigned int, unsigned int> pairIndices;
43 
44  std::string combinationCharges() {
45  std::string chargeStr = "";
46  if (muons.at(0)->charge() > 0) {chargeStr += "+";}
47  else {chargeStr += "-";}
48  if (muons.at(1)->charge() > 0) {chargeStr += "+";}
49  else {chargeStr += "-";}
50  if (muons.size()==4) {
51  if (muons.at(2)->charge() > 0) {chargeStr += "+";}
52  else {chargeStr += "-";}
53  if (muons.at(3)->charge() > 0) {chargeStr += "+";}
54  else {chargeStr += "-";}
55  }
56  return chargeStr;
57  }
58 
59  std::string combinationIndices() {
60  std::string indexStr = "";
61  std::stringstream ss;
62  if (muons.size()==2) {
63  ss.str(""); ss.clear();
64  ss << pairIndices.first;
65  indexStr+=ss.str();
66  ss.str(""); ss.clear();
67  ss << pairIndices.second;
68  indexStr+=ss.str();
69  }
70  if (muons.size()==4) {
71  for (unsigned int i=0; i<4; ++i) {
72  ss.str(""); ss.clear();
73  ss << quadIndices[i];
74  indexStr+=ss.str();
75  }
76  }
77  return indexStr;
78  }
79 
81  auto& link = mu->inDetTrackParticleLink();
82  return link.isValid() ? *link : nullptr;
83  }
84 
85  std::vector<const xAOD::TrackParticle*> trackParticles(const std::string& specify) {
86  std::vector<const xAOD::TrackParticle*> theTracks;
87  bool oppCh(false);
88  if (muons.at(0)->charge()*muons.at(1)->charge() < 0) oppCh=true;
89  if (specify=="pair1") {
90  theTracks.push_back(GetMuonTrack(muons.at(0)));
91  theTracks.push_back(GetMuonTrack(muons.at(1)));
92  }
93  if (specify=="pair2") {
94  theTracks.push_back(GetMuonTrack(muons.at(2)));
95  theTracks.push_back(GetMuonTrack(muons.at(3)));
96  }
97  if (specify=="DC") {
98  if (oppCh) {
99  theTracks.push_back(GetMuonTrack(muons.at(0)));
100  theTracks.push_back(GetMuonTrack(muons.at(1)));
101  theTracks.push_back(GetMuonTrack(muons.at(2)));
102  theTracks.push_back(GetMuonTrack(muons.at(3)));
103  } else {
104  theTracks.push_back(GetMuonTrack(muons.at(0)));
105  theTracks.push_back(GetMuonTrack(muons.at(2)));
106  theTracks.push_back(GetMuonTrack(muons.at(1)));
107  theTracks.push_back(GetMuonTrack(muons.at(3)));
108  }
109  }
110  if (specify=="AC") {
111  theTracks.push_back(GetMuonTrack(muons.at(0)));
112  theTracks.push_back(GetMuonTrack(muons.at(3)));
113  theTracks.push_back(GetMuonTrack(muons.at(1)));
114  theTracks.push_back(GetMuonTrack(muons.at(2)));
115  }
116  if (specify=="SS") {
117  if (oppCh) {
118  theTracks.push_back(GetMuonTrack(muons.at(0)));
119  theTracks.push_back(GetMuonTrack(muons.at(2)));
120  theTracks.push_back(GetMuonTrack(muons.at(1)));
121  theTracks.push_back(GetMuonTrack(muons.at(3)));
122  } else {
123  theTracks.push_back(GetMuonTrack(muons.at(0)));
124  theTracks.push_back(GetMuonTrack(muons.at(1)));
125  theTracks.push_back(GetMuonTrack(muons.at(2)));
126  theTracks.push_back(GetMuonTrack(muons.at(3)));
127  }
128  }
129  return theTracks;
130  }
131 
132  };
133 
134  class FourMuonTool: virtual public AthAlgTool
135  {
136  public:
137  FourMuonTool(const std::string& t, const std::string& n, const IInterface* p);
138  ~FourMuonTool();
140 
141  static const InterfaceID& interfaceID() { return IID_FourMuonTool;}
142 
143  //-------------------------------------------------------------------------------------
144  //Doing Calculation and inline functions
145  StatusCode performSearch(xAOD::VertexContainer*& pairVxContainer, xAOD::VertexAuxContainer*& pairVxAuxContainer,
146  xAOD::VertexContainer*& quadVxContainer, xAOD::VertexAuxContainer*& quadVxAuxContainer, bool &acceptEvent) const;
147  xAOD::Vertex* fit(const std::vector<const xAOD::TrackParticle*>& ,const xAOD::TrackParticleContainer* importedTrackCollection, const Amg::Vector3D &beamSpot) const;
148  static std::vector<std::vector<unsigned int> > getQuadIndices(unsigned int length);
149  static std::vector<std::pair<unsigned int, unsigned int> > getPairIndices(unsigned int length);
150  static std::vector<std::vector<unsigned int> > mFromN(unsigned int m, unsigned int n);
151  static void combinatorics(unsigned int offset,
152  unsigned int k,
153  std::vector<unsigned int> &combination,
154  std::vector<unsigned int> &mainList,
155  std::vector<std::vector<unsigned int> > &allCombinations);
156  static void buildCombinations(const std::vector<const xAOD::Muon*> &muonsIn,
157  std::vector<Combination> &pairs,
158  std::vector<Combination> &quadruplets,
159  unsigned int nSelectedMuons);
160  static bool passesQuadSelection(const std::vector<const xAOD::Muon*> &muonsIn);
161  //-------------------------------------------------------------------------------------
162 
163  private:
164  double m_ptCut;
165  double m_etaCut;
169  ToolHandle < Trk::IVertexFitter > m_iVertexFitter;
170  ToolHandle < Trk::IVertexFitter > m_iV0VertexFitter;
171  ToolHandle < Trk::ITrackSelectorTool > m_trkSelector;
172  SG::ReadHandleKey<xAOD::EventInfo> m_eventInfo_key{this, "EventInfo", "EventInfo", "Input event information"};
173  SG::WriteDecorHandleKey<xAOD::MuonContainer> m_muonIndex{this, "muonIndexDec", "Muons.BPHY4MuonIndex"};
174 
175  };
176 } // end of namespace
177 #endif
SG::WriteDecorHandleKey
Property holding a SG store/key/clid/attr name from which a WriteDecorHandle is made.
Definition: StoreGate/StoreGate/WriteDecorHandleKey.h:89
xAOD::VertexAuxContainer_v1
Temporary container used until we have I/O for AuxStoreInternal.
Definition: VertexAuxContainer_v1.h:32
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
DerivationFramework::FourMuonTool::m_ptCut
double m_ptCut
Definition: FourMuonTool.h:164
DerivationFramework::FourMuonTool::FourMuonTool
FourMuonTool(const std::string &t, const std::string &n, const IInterface *p)
Definition: FourMuonTool.cxx:65
DerivationFramework::FourMuonTool::m_muonCollectionKey
SG::ReadHandleKey< xAOD::MuonContainer > m_muonCollectionKey
Definition: FourMuonTool.h:167
Muon.h
DerivationFramework::FourMuonTool::m_useV0Fitter
bool m_useV0Fitter
Definition: FourMuonTool.h:166
DerivationFramework::FourMuonTool::m_iV0VertexFitter
ToolHandle< Trk::IVertexFitter > m_iV0VertexFitter
Definition: FourMuonTool.h:170
DerivationFramework::FourMuonTool::combinatorics
static void combinatorics(unsigned int offset, unsigned int k, std::vector< unsigned int > &combination, std::vector< unsigned int > &mainList, std::vector< std::vector< unsigned int > > &allCombinations)
Definition: FourMuonTool.cxx:315
DerivationFramework::FourMuonTool::passesQuadSelection
static bool passesQuadSelection(const std::vector< const xAOD::Muon * > &muonsIn)
Definition: FourMuonTool.cxx:399
DerivationFramework::FourMuonTool::mFromN
static std::vector< std::vector< unsigned int > > mFromN(unsigned int m, unsigned int n)
Definition: FourMuonTool.cxx:305
DerivationFramework::Combination::combinationIndices
std::string combinationIndices()
Definition: FourMuonTool.h:59
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
DerivationFramework::FourMuonTool::fit
xAOD::Vertex * fit(const std::vector< const xAOD::TrackParticle * > &, const xAOD::TrackParticleContainer *importedTrackCollection, const Amg::Vector3D &beamSpot) const
Definition: FourMuonTool.cxx:259
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
python.CreateTierZeroArgdict.pairs
pairs
Definition: CreateTierZeroArgdict.py:201
DerivationFramework::FourMuonTool::m_iVertexFitter
ToolHandle< Trk::IVertexFitter > m_iVertexFitter
Definition: FourMuonTool.h:169
DerivationFramework::FourMuonTool::m_muonIndex
SG::WriteDecorHandleKey< xAOD::MuonContainer > m_muonIndex
Definition: FourMuonTool.h:173
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
DerivationFramework::FourMuonTool::performSearch
StatusCode performSearch(xAOD::VertexContainer *&pairVxContainer, xAOD::VertexAuxContainer *&pairVxAuxContainer, xAOD::VertexContainer *&quadVxContainer, xAOD::VertexAuxContainer *&quadVxAuxContainer, bool &acceptEvent) const
Definition: FourMuonTool.cxx:91
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
DerivationFramework::Combination::quadIndices
std::vector< unsigned int > quadIndices
Definition: FourMuonTool.h:41
AthAlgTool.h
DerivationFramework::FourMuonTool::m_eventInfo_key
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
Definition: FourMuonTool.h:172
DerivationFramework
THE reconstruction tool.
Definition: ParticleSortingAlg.h:24
DerivationFramework::FourMuonTool::~FourMuonTool
~FourMuonTool()
Definition: FourMuonTool.cxx:86
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
DerivationFramework::FourMuonTool::m_trkSelector
ToolHandle< Trk::ITrackSelectorTool > m_trkSelector
Definition: FourMuonTool.h:171
DerivationFramework::FourMuonTool::m_etaCut
double m_etaCut
Definition: FourMuonTool.h:165
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
DerivationFramework::Combination::pairIndices
std::pair< unsigned int, unsigned int > pairIndices
Definition: FourMuonTool.h:42
DerivationFramework::FourMuonTool::buildCombinations
static void buildCombinations(const std::vector< const xAOD::Muon * > &muonsIn, std::vector< Combination > &pairs, std::vector< Combination > &quadruplets, unsigned int nSelectedMuons)
Definition: FourMuonTool.cxx:357
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
EventInfo.h
MuonContainer.h
DerivationFramework::FourMuonTool::interfaceID
static const InterfaceID & interfaceID()
Definition: FourMuonTool.h:141
DerivationFramework::FourMuonTool::m_TrkParticleCollection
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_TrkParticleCollection
Definition: FourMuonTool.h:168
DerivationFramework::Combination::muons
std::vector< const xAOD::Muon * > muons
Definition: FourMuonTool.h:40
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
DerivationFramework::Combination::GetMuonTrack
const xAOD::TrackParticle * GetMuonTrack(const xAOD::Muon *mu) const
Definition: FourMuonTool.h:80
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
DerivationFramework::FourMuonTool::getQuadIndices
static std::vector< std::vector< unsigned int > > getQuadIndices(unsigned int length)
Definition: FourMuonTool.cxx:293
InDetConversionFinderTools.h
python.BuildSignatureFlags.beamSpot
AthConfigFlags beamSpot(AthConfigFlags flags, str instanceName, str recoMode)
Definition: BuildSignatureFlags.py:402
DerivationFramework::Combination
Definition: FourMuonTool.h:39
DerivationFramework::FourMuonTool::initialize
StatusCode initialize()
Definition: FourMuonTool.cxx:32
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
DerivationFramework::Combination::combinationCharges
std::string combinationCharges()
Definition: FourMuonTool.h:44
AthAlgTool
Definition: AthAlgTool.h:26
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
DerivationFramework::FourMuonTool::getPairIndices
static std::vector< std::pair< unsigned int, unsigned int > > getPairIndices(unsigned int length)
Definition: FourMuonTool.cxx:337
DerivationFramework::Combination::trackParticles
std::vector< const xAOD::TrackParticle * > trackParticles(const std::string &specify)
Definition: FourMuonTool.h:85
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
fitman.k
k
Definition: fitman.py:528
DerivationFramework::FourMuonTool
Definition: FourMuonTool.h:135