13#include "GaudiKernel/ThreadLocalContext.h"
44 return StatusCode::SUCCESS;
52 ATH_MSG_INFO(
"Pixel state objects thinning, Total / Passed (Efficiency): "
55 ATH_MSG_INFO(
"Pixel measurements objects thinning, Total / Passed (Efficiency): "
58 ATH_MSG_INFO(
"SCT state objects thinning, Total / Passed (Efficiency): "
61 ATH_MSG_INFO(
"SCT measurements objects thinning, Total / Passed (Efficiency): "
64 ATH_MSG_INFO(
"TRT state objects thinning, Total / Passed (Efficiency): "
67 ATH_MSG_INFO(
"TRT measurements objects thinning, Total / Passed (Efficiency): "
71 return StatusCode::SUCCESS;
76 return std::vector<int>(trackParticles->
size(), 0);
82 const EventContext& ctx = Gaudi::Hive::currentContext();
89 unsigned int nTracks = importedTrackParticles->size();
90 if (nTracks==0)
return StatusCode::SUCCESS;
93 std::vector<bool> mask;
94 mask.assign(nTracks,
false);
99 unsigned int nEntries =
entries.size();
101 if (nTracks != nEntries ) {
102 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
103 return StatusCode::FAILURE;
106 for (
unsigned int i=0; i<nTracks; ++i)
if (
entries[i]==1) mask[i]=
true;
109 m_npass += std::count (mask.begin(), mask.end(),
true);
112 importedTrackParticles.
keep (mask);
118 *importedTrackParticles,
128 *importedTrackParticles,
138 *importedTrackParticles,
148 return StatusCode::SUCCESS;
153(
const EventContext& ctx,
156 const std::vector<bool>& inputMask,
159 std::atomic<unsigned int>& ntot_states,
160 std::atomic<unsigned int>& ntot_measurements,
161 std::atomic<unsigned int>& npass_states,
162 std::atomic<unsigned int>& npass_measurements)
const
164 std::vector<bool> maskStates;
165 std::vector<bool> maskMeasurements;
168 maskStates, maskMeasurements);
170 auto count = [] (
const std::vector<bool>& m)
171 {
return std::count (m.begin(), m.end(),
true); };
172 npass_states +=
count (maskStates);
173 npass_measurements +=
count (maskMeasurements);
175 if (!statesKey.
empty()) {
178 unsigned int size_states = importedStates->size();
179 if (size_states == 0) {
183 ntot_states += size_states;
184 if (maskStates.size() > size_states) {
185 ATH_MSG_ERROR(
"States mask size mismatch " << maskStates.size() <<
186 " > " << size_states);
188 maskStates.resize (size_states);
189 importedStates.
keep (maskStates);
193 if (!measurementsKey.
empty()) {
195 (measurementsKey, ctx);
196 unsigned int size_measurements = importedMeasurements->size();
197 if (size_measurements == 0) {
201 ntot_measurements += size_measurements;
202 if (maskMeasurements.size() > size_measurements) {
203 ATH_MSG_ERROR(
"Measurements mask size mismatch " << maskMeasurements.size() <<
204 " > " << size_measurements);
206 maskMeasurements.resize (size_measurements);
207 importedMeasurements.
keep (maskMeasurements);
214 const std::vector<bool>& inputMask,
216 std::vector<bool>& outputStatesMask, std::vector<bool>& outputMeasurementsMask)
const
222 if (not inputMask[trkIndex])
continue;
225 using StatesOnTrack = std::vector<ElementLink<xAOD::TrackStateValidationContainer>>;
228 ATH_MSG_DEBUG(
"Cannot find TrackState link from xAOD::TrackParticle. Skipping track.");
231 const StatesOnTrack& measurementsOnTrack = msosLinkAcc(*trkIt);
233 if (not trkState_el.isValid()) {
234 ATH_MSG_DEBUG(
"Cannot find a valid link to TrackStateValidation object for track index: " << trkIndex);
237 if ((*trkState_el)->detType() != detTypeToSelect) {
238 ATH_MSG_VERBOSE(
"Discarding TrackState as not of correct type " << detTypeToSelect);
241 if (trkState_el.index() >= outputStatesMask.size()) {
242 outputStatesMask.resize (trkState_el.index()+1);
244 outputStatesMask[trkState_el.index()] =
true;
248 if (not trkMeasurement_el.
isValid()) {
249 ATH_MSG_VERBOSE(
"Cannot find a valid link to TrackMeasurementValidation object from track state for track index: " << trkIndex
250 <<
", trackState index: " << trkState_el.index());
253 if (*trkMeasurement_el ==
nullptr) {
254 ATH_MSG_VERBOSE(
"Invalid pointer to TrackMeasurementValidation object from track state for track index: " << trkIndex
255 <<
", trackState index: " << trkState_el.index());
258 if (trkMeasurement_el.
index() >= outputMeasurementsMask.size()) {
259 outputMeasurementsMask.resize (trkMeasurement_el.
index()+1);
261 outputMeasurementsMask[trkMeasurement_el.
index()] =
true;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Helper class to provide constant type-safe access to aux data.
Handle for requesting thinning for a data object.
size_type size() const noexcept
Returns the number of elements in the collection.
std::atomic< unsigned int > m_ntot_pix_measurements
std::atomic< unsigned int > m_ntot_pix_states
std::atomic< unsigned int > m_ntot_trt_measurements
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesPixSGKey
std::atomic< unsigned int > m_npass_trt_measurements
virtual StatusCode initialize() override
std::atomic< unsigned int > m_npass_pix_states
std::atomic< unsigned int > m_ntot_sct_states
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesTrtSGKey
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesSctSGKey
std::atomic< unsigned int > m_npass_sct_measurements
virtual StatusCode doThinning() const override final
std::atomic< unsigned int > m_npass_pix_measurements
SG::ThinningHandleKey< xAOD::TrackParticleContainer > m_inDetSGKey
void selectTrackHits(const xAOD::TrackParticleContainer &inputTrackParticles, const std::vector< bool > &inputMask, MeasurementType detTypeToSelect, std::vector< bool > &outputStatesMask, std::vector< bool > &outputMeasurementsMask) const
Select TrackStateValidation and TrackMeasurementValidation objects that are used in the (thinned) tra...
virtual StatusCode finalize() override final
Gaudi::Property< bool > m_thinHitsOnTrack
virtual std::vector< int > updateMask(const xAOD::TrackParticleContainer *) const
std::atomic< unsigned int > m_npass
std::atomic< unsigned int > m_ntot
void filterTrackHits(const EventContext &ctx, MeasurementType detTypeToSelect, const xAOD::TrackParticleContainer &inputTrackParticles, const std::vector< bool > &inputMask, const SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > &statesKey, const SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > &measurementsKey, std::atomic< unsigned int > &ntot_states, std::atomic< unsigned int > &ntot_measurements, std::atomic< unsigned int > &npass_states, std::atomic< unsigned int > &npass_measurements) const
std::atomic< unsigned int > m_npass_trt_states
std::atomic< unsigned int > m_ntot_sct_measurements
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
StringProperty m_streamName
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsSctSGKey
std::atomic< unsigned int > m_ntot_trt_states
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsPixSGKey
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsTrtSGKey
std::atomic< unsigned int > m_npass_sct_states
ElementLink implementation for ROOT usage.
index_type index() const
Get the index of the element inside of its container.
bool isValid() const
Test to see if the link can be dereferenced.
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
void keep(size_t ndx)
Mark that index ndx in the container should be kept (not thinned away).
HandleKey object for adding thinning to an object.
Handle for requesting thinning for a data object.
const std::string & key() const
Return the StoreGate ID for the referenced object.
bool empty() const
Test if the key is blank.
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".