ATLAS Offline Software
JetHitAssociation.cxx
Go to the documentation of this file.
1 /*
2 Copyright (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
11 JetHitAssociation::JetHitAssociation(const std::string& name, ISvcLocator* svcloc)
12  : AthAlgorithm(name, svcloc),
13  m_nStoredPixHits(0),
14  m_nStoredSCTHits(0),
15  m_nTotalPixHits(0),
16  m_nTotalSCTHits(0) {
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 
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());
55  ATH_CHECK(m_vertexCollectionName.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 
128 StatusCode 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 }
JetHitAssociation::m_dRmatchHitToJet
float m_dRmatchHitToJet
Definition: JetHitAssociation.h:56
TRTCalib_Extractor.hits
hits
Definition: TRTCalib_Extractor.py:35
JetHitAssociation.h
JetHitAssociation::initialize
virtual StatusCode initialize() override
Definition: JetHitAssociation.cxx:39
JetHitAssociation::JetHitAssociation
JetHitAssociation(const std::string &name, ISvcLocator *svcloc)
Constructor with parameters:
Definition: JetHitAssociation.cxx:11
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
initialize
void initialize()
Definition: run_EoverP.cxx:894
JetHitAssociation::m_jetPtThreshold
float m_jetPtThreshold
Definition: JetHitAssociation.h:55
JetHitAssociation::m_jetCollectionName
SG::ReadHandleKey< xAOD::JetContainer > m_jetCollectionName
Definition: JetHitAssociation.h:47
JetHitAssociation::m_inputSCTHitCollectionName
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputSCTHitCollectionName
Definition: JetHitAssociation.h:50
JetHitAssociation::saveHits
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)
Definition: JetHitAssociation.cxx:128
x
#define x
JetHitAssociation::m_outputPixHitCollectionName
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_outputPixHitCollectionName
Definition: JetHitAssociation.h:51
xAOD::TrackMeasurementValidation_v1
Class describing a TrackMeasurementValidation.
Definition: TrackMeasurementValidation_v1.h:27
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
JetHitAssociation::m_nStoredSCTHits
unsigned long long int m_nStoredSCTHits
Definition: JetHitAssociation.h:58
z
#define z
JetHitAssociation::m_nTotalPixHits
unsigned long long int m_nTotalPixHits
Definition: JetHitAssociation.h:59
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
JetHitAssociation::m_nTotalSCTHits
unsigned long long int m_nTotalSCTHits
Definition: JetHitAssociation.h:60
AthAlgorithm
Definition: AthAlgorithm.h:47
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
JetHitAssociation::m_vertexCollectionName
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexCollectionName
Definition: JetHitAssociation.h:48
y
#define y
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
JetHitAssociation::execute
virtual StatusCode execute() override
Definition: JetHitAssociation.cxx:66
JetHitAssociation::m_nStoredPixHits
unsigned long long int m_nStoredPixHits
Definition: JetHitAssociation.h:57
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
SG::WriteHandle::put
const_pointer_type put(std::unique_ptr< T > data, bool returnExisting=false) const
Record an object to the store.
JetHitAssociation::finalize
virtual StatusCode finalize() override
Definition: JetHitAssociation.cxx:190
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
JetHitAssociation::m_outputSCTHitCollectionName
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_outputSCTHitCollectionName
Definition: JetHitAssociation.h:52
JetHitAssociation::m_inputPixHitCollectionName
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputPixHitCollectionName
Definition: JetHitAssociation.h:49