16#include "GaudiKernel/ThreadLocalContext.h"
25 const IInterface* p ) :
57 ATH_MSG_FATAL(
"No inner detector track selection string provided!");
58 return StatusCode::FAILURE;
87 return StatusCode::SUCCESS;
95 ATH_MSG_INFO(
"Pixel state objects thinning, Total / Passed (Efficiency): "
98 ATH_MSG_INFO(
"Pixel measurements objects thinning, Total / Passed (Efficiency): "
101 ATH_MSG_INFO(
"SCT state objects thinning, Total / Passed (Efficiency): "
104 ATH_MSG_INFO(
"SCT measurements objects thinning, Total / Passed (Efficiency): "
107 ATH_MSG_INFO(
"TRT state objects thinning, Total / Passed (Efficiency): "
110 ATH_MSG_INFO(
"TRT measurements objects thinning, Total / Passed (Efficiency): "
115 return StatusCode::SUCCESS;
121 const EventContext& ctx = Gaudi::Hive::currentContext();
128 unsigned int nTracks = importedTrackParticles->size();
129 if (nTracks==0)
return StatusCode::SUCCESS;
132 std::vector<bool> mask;
133 mask.assign(nTracks,
false);
138 std::vector<int>
entries = m_parser->evaluateAsVector();
139 unsigned int nEntries =
entries.size();
141 if (nTracks != nEntries ) {
142 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
143 return StatusCode::FAILURE;
146 for (
unsigned int i=0; i<nTracks; ++i)
if (
entries[i]==1) mask[i]=
true;
150 m_npass += std::count (mask.begin(), mask.end(),
true);
153 importedTrackParticles.
keep (mask);
159 *importedTrackParticles,
169 *importedTrackParticles,
179 *importedTrackParticles,
189 return StatusCode::SUCCESS;
194 (
const EventContext& ctx,
197 const std::vector<bool>& inputMask,
200 std::atomic<unsigned int>& ntot_states,
201 std::atomic<unsigned int>& ntot_measurements,
202 std::atomic<unsigned int>& npass_states,
203 std::atomic<unsigned int>& npass_measurements)
const
205 std::vector<bool> maskStates;
206 std::vector<bool> maskMeasurements;
209 maskStates, maskMeasurements);
211 auto count = [] (
const std::vector<bool>& m)
212 {
return std::count (m.begin(), m.end(),
true); };
213 npass_states +=
count (maskStates);
214 npass_measurements +=
count (maskMeasurements);
216 if (!statesKey.
empty()) {
219 unsigned int size_states = importedStates->size();
220 if (size_states == 0) {
224 ntot_states += size_states;
225 if (maskStates.size() > size_states) {
226 ATH_MSG_ERROR(
"States mask size mismatch " << maskStates.size() <<
227 " > " << size_states);
229 maskStates.resize (size_states);
230 importedStates.
keep (maskStates);
234 if (!measurementsKey.
empty()) {
236 (measurementsKey, ctx);
237 unsigned int size_measurements = importedMeasurements->size();
238 if (size_measurements == 0) {
242 ntot_measurements += size_measurements;
243 if (maskMeasurements.size() > size_measurements) {
244 ATH_MSG_ERROR(
"Measurements mask size mismatch " << maskMeasurements.size() <<
245 " > " << size_measurements);
247 maskMeasurements.resize (size_measurements);
248 importedMeasurements.
keep (maskMeasurements);
255 const std::vector<bool>& inputMask,
257 std::vector<bool>& outputStatesMask, std::vector<bool>& outputMeasurementsMask)
const
263 if (not inputMask[trkIndex])
continue;
266 using StatesOnTrack = std::vector<ElementLink<xAOD::TrackStateValidationContainer>>;
269 ATH_MSG_DEBUG(
"Cannot find TrackState link from xAOD::TrackParticle. Skipping track.");
272 const StatesOnTrack& measurementsOnTrack = msosLinkAcc(*trkIt);
274 if (not trkState_el.isValid()) {
275 ATH_MSG_DEBUG(
"Cannot find a valid link to TrackStateValidation object for track index: " << trkIndex);
278 if ((*trkState_el)->detType() != detTypeToSelect) {
279 ATH_MSG_VERBOSE(
"Discarding TrackState as not of correct type " << detTypeToSelect);
282 if (trkState_el.index() >= outputStatesMask.size()) {
283 outputStatesMask.resize (trkState_el.index()+1);
285 outputStatesMask[trkState_el.index()] =
true;
289 if (not trkMeasurement_el.
isValid()) {
290 ATH_MSG_VERBOSE(
"Cannot find a valid link to TrackMeasurementValidation object from track state for track index: " << trkIndex
291 <<
", trackState index: " << trkState_el.index());
294 if (*trkMeasurement_el ==
nullptr) {
295 ATH_MSG_VERBOSE(
"Invalid pointer to TrackMeasurementValidation object from track state for track index: " << trkIndex
296 <<
", trackState index: " << trkState_el.index());
299 if (trkMeasurement_el.
index() >= outputMeasurementsMask.size()) {
300 outputMeasurementsMask.resize (trkMeasurement_el.
index()+1);
302 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.
std::atomic< unsigned int > m_npass_sct_measurements
std::atomic< unsigned int > m_npass_trt_states
std::atomic< unsigned int > m_npass_pix_measurements
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsTrtSGKey
std::atomic< unsigned int > m_ntot_sct_states
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
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsPixSGKey
std::atomic< unsigned int > m_ntot_trt_measurements
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesTrtSGKey
std::atomic< unsigned int > m_npass_sct_states
StringProperty m_streamName
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesPixSGKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
virtual StatusCode finalize() override
SG::ThinningHandleKey< xAOD::TrackParticleContainer > m_inDetSGKey
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesSctSGKey
std::atomic< unsigned int > m_npass_trt_measurements
virtual StatusCode initialize() override
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsSctSGKey
std::atomic< unsigned int > m_npass_pix_states
std::atomic< unsigned int > m_ntot_pix_states
std::string m_selectionString
virtual StatusCode doThinning() const override
std::atomic< unsigned int > m_ntot_sct_measurements
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 ~TrackParticleThinning()
std::atomic< unsigned int > m_ntot
std::atomic< unsigned int > m_ntot_pix_measurements
std::atomic< unsigned int > m_npass
TrackParticleThinning(const std::string &t, const std::string &n, const IInterface *p)
std::atomic< unsigned int > m_ntot_trt_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".