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
66StatusCode JetHitAssociation::execute(const EventContext& ctx) {
67
68
69 // All jets
71 if ( !jetReadHandle.isValid() ) {
72 ATH_MSG_ERROR("Failed to retrieve jet container with key " << m_jetCollectionName.key() );
73 return StatusCode::FAILURE;
74 }
75
76 // Keep only jets above threashold
77 std::vector<const xAOD::Jet*> jets;
78 jets.reserve( jetReadHandle->size() );
79 for (const xAOD::Jet *jet : *jetReadHandle) {
80 if (jet->pt() > m_jetPtThreshold) jets.push_back(jet);
81 }
82
83// Create write handles
86
87
88 // Vertex collection
90 if ( !vertexReadHandle.isValid() ) {
91 ATH_MSG_ERROR("Failed to retrieve PrimaryVertices container" );
92 return StatusCode::FAILURE;
93 }
94
95 // Find primary vertex
96 const xAOD::Vertex *primVtx = nullptr;
97 for (const xAOD::Vertex *vertex : *vertexReadHandle) {
98 if (vertex->vertexType() == xAOD::VxType::PriVtx) {
99 primVtx = vertex;
100 break;
101 }
102 }
103
104 // Read pixel hits
106 if ( !pixHitReadHandle.isValid() ) {
107 ATH_MSG_ERROR("Failed to retrieve pixel hit container with key " << m_inputPixHitCollectionName);
108 return StatusCode::FAILURE;
109 }
110
111 // Read SCT hits
113 if ( !sctHitReadHandle.isValid() ) {
114 ATH_MSG_ERROR("Failed to retrieve SCT hit container with key " << m_inputSCTHitCollectionName);
115 return StatusCode::FAILURE;
116 }
117
118 // These subroutines check for viable jets and write out hits if any exist.
119 // A JetAssociatedPixelCluster or JetAssociatedSCTCluster container is created for each event regardless
120 ATH_CHECK( saveHits(jets, primVtx, pixHitReadHandle, outputPixHits, m_nStoredPixHits, m_nTotalPixHits) );
121 ATH_CHECK( saveHits(jets, primVtx, sctHitReadHandle, outputSCTHits, m_nStoredSCTHits, m_nTotalSCTHits) );
122
123 return StatusCode::SUCCESS;
124}
125
126
127StatusCode JetHitAssociation::saveHits(const std::vector<const xAOD::Jet*> &jets,
128 const xAOD::Vertex* const vertex,
131 unsigned long long int &nStoredHits,
132 unsigned long long int &nTotalHits) {
133
134 // Collection where output hits are stored
135 auto outputHitCollection = std::make_unique<xAOD::TrackMeasurementValidationContainer>();
136 auto outputHitCollectionAux = std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>();
137 outputHitCollection->setStore(outputHitCollectionAux.get());
138
139
140 // if there are no jets you need to skip this loop but you still need to write out the
141 // if the vertex is a null pointer (no primary vertex in the event) do the same
142 // JetAssociatedSCTClusters and JetAssociatedPixelClusters
143 if (!jets.empty() && vertex!=nullptr) {
144
145 // Get the x,y,z of the primary vertex
146 TVector3 PVposition(vertex->x(), vertex->y(), vertex->z());
147 ATH_MSG_DEBUG("JetHitAssociation: PrimaryVertex Z Position = " << PVposition.Z());
148
149 // Loop over hits
150 for (const xAOD::TrackMeasurementValidation *hit : *hits) {
151 // Get pixel globalX,Y,Z
152 float x = hit->globalX();
153 float y = hit->globalY();
154 float z = hit->globalZ();
155
156 // Put the x,y,z in a TVector3
157 TVector3 hitPosition(x,y,z);
158
159 // Correct for the PV position
160 hitPosition = hitPosition - PVposition;
161
162 // Loop over jets
163 for (const xAOD::Jet *jet : jets) {
164 // Calculate dR(hit,jet)
165 float dR = hitPosition.DeltaR(jet->p4().Vect());
166
167 // if the dR is smaller than the dR association threshold save the hit
168 if (dR < m_dRmatchHitToJet) {
169 outputHitCollection->push_back(std::make_unique<xAOD::TrackMeasurementValidation>(*hit));
170 *outputHitCollection->back() = *hit; //Without this line. entries are filled with zero instead of the correct values
171 ++nStoredHits;
172 break;
173 }
174 }
175 }
176 }
177 // count the total number of hits run
178 nTotalHits += hits->size();
179
180 // Write output container
181 if ( ! outputHits.put( std::move(outputHitCollection), std::move(outputHitCollectionAux) ) ) {
182 ATH_MSG_ERROR("Could not write output hit containers");
183 return StatusCode::FAILURE;
184 }
185
186 return StatusCode::SUCCESS;
187}
188
190
191 ATH_MSG_DEBUG("JetHitAssociation: Total number of Pix Hits tested = " << m_nTotalPixHits);
192 ATH_MSG_DEBUG("JetHitAssociation: Total number of Pix Hits Stored = " << m_nStoredPixHits);
193 ATH_MSG_DEBUG("JetHitAssociation: Total number of SCT Hits tested = " << m_nTotalSCTHits);
194 ATH_MSG_DEBUG("JetHitAssociation: Total number of SCT Hits Stored = " << m_nStoredSCTHits);
195
196 return StatusCode::SUCCESS;
197}
#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.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
unsigned long long int m_nTotalPixHits
SG::ReadHandleKey< xAOD::JetContainer > m_jetCollectionName
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexCollectionName
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_outputSCTHitCollectionName
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputSCTHitCollectionName
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.