21#include "Gaudi/Property.h"
22#include "GaudiKernel/ThreadLocalContext.h"
34 const std::string& name,
35 ISvcLocator* pSvcLocator):
48 ATH_MSG_FATAL(
"No inner detector track selection strings provided!");
49 return StatusCode::FAILURE;
70 ATH_MSG_DEBUG(
"Initializing measurement ThinningHandleKeys.");
82 return StatusCode::SUCCESS;
90 ATH_MSG_INFO(
"Pixel state objects thinning, Total / Passed (Efficiency): "
97 ATH_MSG_INFO(
"SCT state objects thinning, Total / Passed (Efficiency): "
104 ATH_MSG_INFO(
"TRT state objects thinning, Total / Passed (Efficiency): "
113 return StatusCode::SUCCESS;
122 ATH_CHECK( importedTrackParticles.isValid() );
128 unsigned int size_measurements = importedMeasurements->size();
134 unsigned int size_measurements = importedMeasurements->size();
140 unsigned int size_measurements = importedMeasurements->size();
146 unsigned int nTracks = importedTrackParticles->size();
147 if (nTracks==0)
return StatusCode::SUCCESS;
150 std::vector<bool> mask;
151 mask.assign(nTracks,
false);
157 unsigned int nEntries =
entries.size();
159 if (nTracks != nEntries ) {
160 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
161 return StatusCode::FAILURE;
164 for (
unsigned int i=0; i<nTracks; ++i) {
175 *importedTrackParticles,
187 *importedTrackParticles,
199 *importedTrackParticles,
209 return StatusCode::SUCCESS;
215 const std::vector<bool>& inputMask,
218 std::atomic<unsigned int>& ntot_states,
219 std::atomic<unsigned int>& npass_states,
220 std::atomic<unsigned int>& npass_measurements,
221 const EventContext& ctx)
const
223 std::vector<bool> maskStates;
224 std::vector<bool> maskMeasurements;
227 maskStates, maskMeasurements);
229 auto count = [] (
const std::vector<bool>& m)
230 {
return std::count (m.begin(), m.end(),
true); };
231 npass_states +=
count (maskStates);
232 npass_measurements +=
count (maskMeasurements);
234 if (!statesKey.
empty()) {
237 unsigned int size_states = importedStates->size();
238 if (size_states == 0) {
242 ntot_states += size_states;
243 if (maskStates.size() > size_states) {
244 ATH_MSG_ERROR(
"States mask size mismatch: mask size (" << maskStates.size() <<
") > number of states (" << size_states <<
").");
245 return StatusCode::FAILURE;
247 maskStates.resize (size_states);
248 importedStates.
keep (maskStates);
252 if (!measurementsKey.
empty()) {
254 ATH_CHECK( importedMeasurements.isValid() );
255 unsigned int size_measurements = importedMeasurements->size();
256 if (size_measurements == 0) {
260 if (maskMeasurements.size() > size_measurements) {
261 ATH_MSG_ERROR(
"Measurements mask size mismatch: mask size (" << maskMeasurements.size() <<
") > number of measurements (" << size_measurements <<
").");
262 return StatusCode::FAILURE;
264 maskMeasurements.resize (size_measurements);
265 importedMeasurements.
keep (maskMeasurements);
269 return StatusCode::SUCCESS;
273 const std::vector<bool>& inputMask,
275 std::vector<bool>& outputStatesMask, std::vector<bool>& outputMeasurementsMask)
const
277 using StatesOnTrack = std::vector<ElementLink<xAOD::TrackStateValidationContainer>>;
284 if (not inputMask[trkIndex])
continue;
289 ATH_MSG_INFO(
"Cannot find TrackState link from xAOD::TrackParticle. Skipping track.");
292 const StatesOnTrack& measurementsOnTrack = trackStateAcc(*trkIt);
295 if (not trkState_el.isValid()) {
296 ATH_MSG_INFO(
"Cannot find a valid link to TrackStateValidation object for track index: " << trkIndex);
299 if ((*trkState_el)->detType() != detTypeToSelect) {
300 ATH_MSG_VERBOSE(
"Discarding TrackState as not of correct type " << detTypeToSelect);
303 if (trkState_el.index() >= outputStatesMask.size()) {
304 outputStatesMask.resize (trkState_el.index()+1);
306 outputStatesMask[trkState_el.index()] =
true;
310 if (not trkMeasurement_el.
isValid()) {
311 ATH_MSG_VERBOSE(
"Cannot find a valid link to TrackMeasurementValidation object from track state for track index: " << trkIndex
312 <<
", trackState index: " << trkState_el.index());
315 if (*trkMeasurement_el ==
nullptr) {
316 ATH_MSG_VERBOSE(
"Invalid pointer to TrackMeasurementValidation object from track state for track index: " << trkIndex
317 <<
", trackState index: " << trkState_el.index());
320 if (trkMeasurement_el.
index() >= outputMeasurementsMask.size()) {
321 outputMeasurementsMask.resize (trkMeasurement_el.
index()+1);
323 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)
Handle for requesting thinning for a data object.
An algorithm that can be simultaneously executed in multiple threads.
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.
StatusCode finalizeParser()
std::conditional< 1==1, std::unique_ptr< ExpressionParsing::ExpressionParser >, std::array< std::unique_ptr< ExpressionParsing::ExpressionParser >, 1 > >::type m_parser
ExpressionParserUser(Args &&...args)
StatusCode initializeParser(const ExpressionParsing::SelectionArg< 1 > &selection_string)
SG::ConstAccessor< T, ALLOC > ConstAccessor
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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.
MeasurementType
Track state types Subset of enum MeasurementType from Athena: Tracking/TrkEvent/TrkEventPrimitives/Tr...
StringProperty m_selectionString
Expressions for object thinning selections Default InDetTrackParticles (also accomplished through fla...
std::atomic< unsigned int > m_ntot_sct_states
std::atomic< unsigned int > m_npass_pix_states
std::atomic< unsigned int > m_npass_sct_measurements
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsPixSGKey
virtual StatusCode finalize() override
Athena algorithm's finalize hook.
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesSctSGKey
BooleanProperty m_thinPixelHitsOnTrack
Thinning logic.
BooleanProperty m_thinTRTHitsOnTrack
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesTrtSGKey
std::atomic< unsigned int > m_npass_trt_measurements
std::atomic< unsigned int > m_npass
ThinInDetClustersAlg(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
std::atomic< unsigned int > m_ntot_sct_measurements
std::atomic< unsigned int > m_ntot_pix_states
Counters and keys for xAOD::TrackStateValidation and xAOD::TrackMeasurementValidation containers.
SG::ThinningHandleKey< xAOD::TrackParticleContainer > m_inDetSGKey
SGKey for TrackParticleContainer.
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...
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsTrtSGKey
std::atomic< unsigned int > m_npass_sct_states
std::atomic< unsigned int > m_ntot_pix_measurements
virtual StatusCode initialize() override
Athena algorithm's initalize hook.
std::atomic< unsigned int > m_npass_pix_measurements
std::atomic< unsigned int > m_ntot_trt_states
std::atomic< unsigned int > m_npass_trt_states
SG::ThinningHandleKey< xAOD::TrackStateValidationContainer > m_statesPixSGKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey
For P->T converter of SCT_Clusters.
std::atomic< unsigned int > m_ntot_trt_measurements
StatusCode filterTrackHits(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 > &npass_states, std::atomic< unsigned int > &npass_measurements, const EventContext &ctx) const
StringProperty m_streamName
Stream for object thinning selections.
virtual StatusCode execute(const EventContext &ctx) const override
Athena algorithm's execute hook.
BooleanProperty m_thinSCTHitsOnTrack
std::atomic< unsigned int > m_ntot
Counters and keys for xAOD::TrackParticle container.
SG::ThinningHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementsSctSGKey
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".