ATLAS Offline Software
Loading...
Searching...
No Matches
JetHitAssociation.cxx
Go to the documentation of this file.
1/*
2Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7//Include some helpful ROOT objects here.
8#include <TVector3.h>
9
10// Constructor
11JetHitAssociation::JetHitAssociation(const std::string& name, ISvcLocator* svcloc)
12 : AthAlgorithm(name, svcloc),
17
18 declareProperty("jetCollectionName", m_jetCollectionName = "AntiKt4EMPFlowJets",
19 "Jet collection that will be used for matching the Hits");
20 declareProperty("vertexCollectionName", m_vertexCollectionName = "PrimaryVertices",
21 "Name of PV collection. Default is PrimaryVertices");
22 declareProperty("outputPixHitCollectionName", m_outputPixHitCollectionName = "JetAssociatedPixelClusters",
23 "Name of output pixel hit collection. JetAssociatedPixelClusters is default.");
24 declareProperty("outputSCTHitCollectionName", m_outputSCTHitCollectionName = "JetAssociatedSCTClusters",
25 "Name of output SCT hit collection. JetAssociatedSCTClusters is default.");
26 declareProperty("inputPixHitCollectionName", m_inputPixHitCollectionName = "PixelClusters",
27 "Name of input pixel hit collection. PixelClusters is default");
28 declareProperty("inputSCTHitCollectionName", m_inputSCTHitCollectionName = "SCT_Clusters",
29 "Name of input SCT hit collection. SCT_Clusters is default");
30 declareProperty("jetPtThreshold", m_jetPtThreshold = 250000.0,
31 "Hits are saved only if they match to jets with pT > jetPtThreshold [in MeV]");
32 declareProperty("dRmatchHitToJet", m_dRmatchHitToJet = 0.4,
33 "The radius used for matching hits to jets");
34
37}
38
40
41 ATH_CHECK( AthAlgorithm::initialize() );
42
43 ATH_MSG_DEBUG("jetCollectionName = " << m_jetCollectionName);
44 ATH_MSG_DEBUG("vertexCollectionName = " << m_vertexCollectionName);
45 ATH_MSG_DEBUG("inputPixHitCollectionName = " << m_inputPixHitCollectionName);
46 ATH_MSG_DEBUG("inputSCTHitCollectionName = " << m_inputSCTHitCollectionName);
47 ATH_MSG_DEBUG("outputPixHitCollectionName = " << m_outputPixHitCollectionName);
48 ATH_MSG_DEBUG("outputSCTHitCollectionName = " << m_outputSCTHitCollectionName);
49 ATH_MSG_DEBUG("jetPtThreshold [MeV] = " << m_jetPtThreshold);
50 ATH_MSG_DEBUG("dRmatchHitToJet = " << m_dRmatchHitToJet);
51
54 ATH_CHECK(m_jetCollectionName.initialize());
58
59 ATH_MSG_DEBUG("JetHitAssociation: Initialized");
60
61 return StatusCode::SUCCESS;
62}
63
64
65// Function for saving hits matched to jets
67
68 const EventContext& ctx = Gaudi::Hive::currentContext();
69
70 // All jets
72 if ( !jetReadHandle.isValid() ) {
73 ATH_MSG_ERROR("Failed to retrieve jet container with key " << m_jetCollectionName.key() );
74 return StatusCode::FAILURE;
75 }
76
77 // Keep only jets above threashold
78 std::vector<const xAOD::Jet*> jets;
79 jets.reserve( jetReadHandle->size() );
80 for (const xAOD::Jet *jet : *jetReadHandle) {
81 if (jet->pt() > m_jetPtThreshold) jets.push_back(jet);
82 }
83
84// Create write handles
87
88
89 // Vertex collection
91 if ( !vertexReadHandle.isValid() ) {
92 ATH_MSG_ERROR("Failed to retrieve PrimaryVertices container" );
93 return StatusCode::FAILURE;
94 }
95
96 // Find primary vertex
97 const xAOD::Vertex *primVtx = nullptr;
98 for (const xAOD::Vertex *vertex : *vertexReadHandle) {
99 if (vertex->vertexType() == xAOD::VxType::PriVtx) {
100 primVtx = vertex;
101 break;
102 }
103 }
104
105 // Read pixel hits
107 if ( !pixHitReadHandle.isValid() ) {
108 ATH_MSG_ERROR("Failed to retrieve pixel hit container with key " << m_inputPixHitCollectionName);
109 return StatusCode::FAILURE;
110 }
111
112 // Read SCT hits
114 if ( !sctHitReadHandle.isValid() ) {
115 ATH_MSG_ERROR("Failed to retrieve SCT hit container with key " << m_inputSCTHitCollectionName);
116 return StatusCode::FAILURE;
117 }
118
119 // These subroutines check for viable jets and write out hits if any exist.
120 // A JetAssociatedPixelCluster or JetAssociatedSCTCluster container is created for each event regardless
121 ATH_CHECK( saveHits(jets, primVtx, pixHitReadHandle, outputPixHits, m_nStoredPixHits, m_nTotalPixHits) );
122 ATH_CHECK( saveHits(jets, primVtx, sctHitReadHandle, outputSCTHits, m_nStoredSCTHits, m_nTotalSCTHits) );
123
124 return StatusCode::SUCCESS;
125}
126
127
128StatusCode JetHitAssociation::saveHits(const std::vector<const xAOD::Jet*> &jets,
129 const xAOD::Vertex* const vertex,
132 unsigned long long int &nStoredHits,
133 unsigned long long int &nTotalHits) {
134
135 // Collection where output hits are stored
136 auto outputHitCollection = std::make_unique<xAOD::TrackMeasurementValidationContainer>();
137 auto outputHitCollectionAux = std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>();
138 outputHitCollection->setStore(outputHitCollectionAux.get());
139
140
141 // if there are no jets you need to skip this loop but you still need to write out the
142 // if the vertex is a null pointer (no primary vertex in the event) do the same
143 // JetAssociatedSCTClusters and JetAssociatedPixelClusters
144 if (!jets.empty() && vertex!=nullptr) {
145
146 // Get the x,y,z of the primary vertex
147 TVector3 PVposition(vertex->x(), vertex->y(), vertex->z());
148 ATH_MSG_DEBUG("JetHitAssociation: PrimaryVertex Z Position = " << PVposition.Z());
149
150 // Loop over hits
151 for (const xAOD::TrackMeasurementValidation *hit : *hits) {
152 // Get pixel globalX,Y,Z
153 float x = hit->globalX();
154 float y = hit->globalY();
155 float z = hit->globalZ();
156
157 // Put the x,y,z in a TVector3
158 TVector3 hitPosition(x,y,z);
159
160 // Correct for the PV position
161 hitPosition = hitPosition - PVposition;
162
163 // Loop over jets
164 for (const xAOD::Jet *jet : jets) {
165 // Calculate dR(hit,jet)
166 float dR = hitPosition.DeltaR(jet->p4().Vect());
167
168 // if the dR is smaller than the dR association threshold save the hit
169 if (dR < m_dRmatchHitToJet) {
170 outputHitCollection->push_back(std::make_unique<xAOD::TrackMeasurementValidation>(*hit));
171 *outputHitCollection->back() = *hit; //Without this line. entries are filled with zero instead of the correct values
172 ++nStoredHits;
173 break;
174 }
175 }
176 }
177 }
178 // count the total number of hits run
179 nTotalHits += hits->size();
180
181 // Write output container
182 if ( ! outputHits.put( std::move(outputHitCollection), std::move(outputHitCollectionAux) ) ) {
183 ATH_MSG_ERROR("Could not write output hit containers");
184 return StatusCode::FAILURE;
185 }
186
187 return StatusCode::SUCCESS;
188}
189
191
192 ATH_MSG_DEBUG("JetHitAssociation: Total number of Pix Hits tested = " << m_nTotalPixHits);
193 ATH_MSG_DEBUG("JetHitAssociation: Total number of Pix Hits Stored = " << m_nStoredPixHits);
194 ATH_MSG_DEBUG("JetHitAssociation: Total number of SCT Hits tested = " << m_nTotalSCTHits);
195 ATH_MSG_DEBUG("JetHitAssociation: Total number of SCT Hits Stored = " << m_nStoredSCTHits);
196
197 return StatusCode::SUCCESS;
198}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
#define y
#define x
#define z
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
unsigned long long int m_nTotalPixHits
SG::ReadHandleKey< xAOD::JetContainer > m_jetCollectionName
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexCollectionName
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_outputSCTHitCollectionName
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputSCTHitCollectionName
virtual StatusCode execute() override
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputPixHitCollectionName
unsigned long long int m_nTotalSCTHits
StatusCode saveHits(const std::vector< const xAOD::Jet * > &jets, const xAOD::Vertex *const vertex, SG::ReadHandle< xAOD::TrackMeasurementValidationContainer > &hits, const SG::WriteHandle< xAOD::TrackMeasurementValidationContainer > &writeHandle, unsigned long long int &nStoredHits, unsigned long long int &nTotalHits)
virtual StatusCode initialize() override
JetHitAssociation(const std::string &name, ISvcLocator *svcloc)
Constructor with parameters:
virtual StatusCode finalize() override
unsigned long long int m_nStoredPixHits
unsigned long long int m_nStoredSCTHits
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_outputPixHitCollectionName
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type put(std::unique_ptr< T > data, bool returnExisting=false) const
Record an object to the store.
@ PriVtx
Primary vertex.
Jet_v1 Jet
Definition of the current "jet version".
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.