24 const IInterface* p ) :
56 ATH_MSG_FATAL(
"No inner detector track selection string provided!");
57 return StatusCode::FAILURE;
86 return StatusCode::SUCCESS;
94 ATH_MSG_INFO(
"Pixel state objects thinning, Total / Passed (Efficiency): "
97 ATH_MSG_INFO(
"Pixel measurements objects thinning, Total / Passed (Efficiency): "
100 ATH_MSG_INFO(
"SCT state objects thinning, Total / Passed (Efficiency): "
103 ATH_MSG_INFO(
"SCT measurements objects thinning, Total / Passed (Efficiency): "
106 ATH_MSG_INFO(
"TRT state objects thinning, Total / Passed (Efficiency): "
109 ATH_MSG_INFO(
"TRT measurements objects thinning, Total / Passed (Efficiency): "
114 return StatusCode::SUCCESS;
126 unsigned int nTracks = importedTrackParticles->size();
127 if (nTracks==0)
return StatusCode::SUCCESS;
130 std::vector<bool> mask;
131 mask.assign(nTracks,
false);
136 std::vector<int>
entries = m_parser->evaluateAsVector();
137 unsigned int nEntries =
entries.size();
139 if (nTracks != nEntries ) {
140 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
141 return StatusCode::FAILURE;
144 for (
unsigned int i=0; i<nTracks; ++i)
if (
entries[i]==1) mask[i]=
true;
148 m_npass += std::count (mask.begin(), mask.end(),
true);
151 importedTrackParticles.
keep (mask);
157 *importedTrackParticles,
167 *importedTrackParticles,
177 *importedTrackParticles,
187 return StatusCode::SUCCESS;
192 (
const EventContext& ctx,
195 const std::vector<bool>& inputMask,
198 std::atomic<unsigned int>& ntot_states,
199 std::atomic<unsigned int>& ntot_measurements,
200 std::atomic<unsigned int>& npass_states,
201 std::atomic<unsigned int>& npass_measurements)
const
203 std::vector<bool> maskStates;
204 std::vector<bool> maskMeasurements;
207 maskStates, maskMeasurements);
209 auto count = [] (
const std::vector<bool>& m)
210 {
return std::count (m.begin(), m.end(),
true); };
211 npass_states +=
count (maskStates);
212 npass_measurements +=
count (maskMeasurements);
214 if (!statesKey.
empty()) {
217 unsigned int size_states = importedStates->size();
218 if (size_states == 0) {
222 ntot_states += size_states;
223 if (maskStates.size() > size_states) {
224 ATH_MSG_ERROR(
"States mask size mismatch " << maskStates.size() <<
225 " > " << size_states);
227 maskStates.resize (size_states);
228 importedStates.
keep (maskStates);
232 if (!measurementsKey.
empty()) {
234 (measurementsKey, ctx);
235 unsigned int size_measurements = importedMeasurements->size();
236 if (size_measurements == 0) {
240 ntot_measurements += size_measurements;
241 if (maskMeasurements.size() > size_measurements) {
242 ATH_MSG_ERROR(
"Measurements mask size mismatch " << maskMeasurements.size() <<
243 " > " << size_measurements);
245 maskMeasurements.resize (size_measurements);
246 importedMeasurements.
keep (maskMeasurements);
253 const std::vector<bool>& inputMask,
255 std::vector<bool>& outputStatesMask, std::vector<bool>& outputMeasurementsMask)
const
261 if (not inputMask[trkIndex])
continue;
264 using StatesOnTrack = std::vector<ElementLink<xAOD::TrackStateValidationContainer>>;
267 ATH_MSG_DEBUG(
"Cannot find TrackState link from xAOD::TrackParticle. Skipping track.");
270 const StatesOnTrack& measurementsOnTrack = msosLinkAcc(*trkIt);
272 if (not trkState_el.isValid()) {
273 ATH_MSG_DEBUG(
"Cannot find a valid link to TrackStateValidation object for track index: " << trkIndex);
276 if ((*trkState_el)->detType() != detTypeToSelect) {
277 ATH_MSG_VERBOSE(
"Discarding TrackState as not of correct type " << detTypeToSelect);
280 if (trkState_el.index() >= outputStatesMask.size()) {
281 outputStatesMask.resize (trkState_el.index()+1);
283 outputStatesMask[trkState_el.index()] =
true;
287 if (not trkMeasurement_el.
isValid()) {
288 ATH_MSG_VERBOSE(
"Cannot find a valid link to TrackMeasurementValidation object from track state for track index: " << trkIndex
289 <<
", trackState index: " << trkState_el.index());
292 if (*trkMeasurement_el ==
nullptr) {
293 ATH_MSG_VERBOSE(
"Invalid pointer to TrackMeasurementValidation object from track state for track index: " << trkIndex
294 <<
", trackState index: " << trkState_el.index());
297 if (trkMeasurement_el.
index() >= outputMeasurementsMask.size()) {
298 outputMeasurementsMask.resize (trkMeasurement_el.
index()+1);
300 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
virtual StatusCode doThinning(const EventContext &ctx) const override
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
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
Check if the element can be found.
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".