16 ISvcLocator *pSvcLocator)
53 return StatusCode::SUCCESS;
81 ATH_CHECK( decor_detectorElementID.isValid() );
103 std::vector< std::vector< const SiHit* > > siHitsCollections(
m_StripHelper->wafer_hash_max());
104 for (
const SiHit& siHit: *siHits) {
105 if ( not siHit.isSCT() ) {
107 return StatusCode::FAILURE;
111 siHit.getLayerDisk(),
112 siHit.getPhiModule(),
113 siHit.getEtaModule(),
120 return StatusCode::FAILURE;
122 siHitsCollections[wafer_hash].push_back(&siHit);
127 stripAccessor ( *measurements,
129 stripElements->
size());
133 for (
const auto& hashId : allIdHashes) {
136 ATH_MSG_FATAL(
"Invalid strip detector element for hash " << hashId);
137 return StatusCode::FAILURE;
141 const std::vector< const SiHit* >& siHitsWithCurrentHash = siHitsCollections.at(hashId);
143 for (
auto itr = startRange; itr != stopRange; ++itr) {
146 const std::vector< std::uint64_t > rdoIdentifierList = measurement->
rdoIdentifierList();
148 std::vector< Identifier > rdos( rdoIdentifierList.size() );
149 for (std::size_t i(0); i < rdoIdentifierList.size(); ++i) {
150 rdos[i].set_literal( rdoIdentifierList[i] );
156 auto [energyDeposit, meanTime, uniqueID, pdgid,
157 startPosX, startPosY, startPosZ,
161 decor_sdo_words(*measurement) = std::move(word);
162 decor_sdo_depositsBarcode(*measurement) = std::move(depositsUniqueID);
163 decor_sdo_depositsEnergy(*measurement) = std::move(depositsEnergy);
166 decor_sihit_energyDeposit(*measurement) = std::move(energyDeposit);
167 decor_sihit_meanTime(*measurement) = std::move(meanTime);
168 decor_sihit_barcode(*measurement) = std::move(uniqueID);
169 decor_sihit_pdgid(*measurement) = std::move(pdgid);
171 decor_sihit_startPosX(*measurement) = std::move(startPosX);
172 decor_sihit_startPosY(*measurement) = std::move(startPosY);
173 decor_sihit_startPosZ(*measurement) = std::move(startPosZ);
175 decor_sihit_endPosX(*measurement) = std::move(endPosX);
176 decor_sihit_endPosY(*measurement) = std::move(endPosY);
177 decor_sihit_endPosZ(*measurement) = std::move(endPosZ);
181 return StatusCode::SUCCESS;
187 const std::vector<const SiHit*>& siHits)
const
189 std::vector<SiHit> matchingHits {};
190 std::vector<const SiHit*> multiMatchingHits {};
192 for (
const SiHit* siHit: siHits) {
195 HepGeom::Point3D<double> averagePosition = 0.5 * (siHit->localStartPosition() + siHit->localEndPosition());
199 for (
const auto& hitIdentifier: rdos) {
203 multiMatchingHits.push_back(siHit);
210 std::vector<const SiHit* >::iterator siHitIter = multiMatchingHits.begin();
211 std::vector<const SiHit* >::iterator siHitIter2 = multiMatchingHits.begin();
212 for ( ; siHitIter != multiMatchingHits.end(); ++siHitIter) {
213 const SiHit* lowestXPos = *siHitIter;
214 const SiHit* highestXPos = *siHitIter;
217 std::vector<const SiHit* > ajoiningHits;
218 ajoiningHits.push_back( *siHitIter );
220 siHitIter2 = siHitIter + 1;
221 while ( siHitIter2 != multiMatchingHits.end() ) {
224 (*siHitIter2)->particleLink()) ) {
230 if (std::abs((highestXPos->
localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 &&
231 std::abs((highestXPos->
localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 &&
232 std::abs((highestXPos->
localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 ) {
233 highestXPos = *siHitIter2;
234 ajoiningHits.push_back( *siHitIter2 );
237 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
238 }
else if (std::abs((lowestXPos->
localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 &&
239 std::abs((lowestXPos->
localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 &&
240 std::abs((lowestXPos->
localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005) {
241 lowestXPos = *siHitIter2;
242 ajoiningHits.push_back( *siHitIter2 );
245 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
251 if ( ajoiningHits.empty() ) {
254 }
else if ( ajoiningHits.size() == 1 ) {
256 matchingHits.push_back( *ajoiningHits[0] );
260 ATH_MSG_DEBUG(
"Merging " << ajoiningHits.size() <<
" SiHits together." );
262 float energyDep {0.f};
264 for(
const auto& siHit : ajoiningHits ){
265 energyDep += siHit->energyLoss();
266 time += siHit->meanTime();
268 time /= ajoiningHits.size();
274 (*siHitIter)->particleLink(),
276 (*siHitIter)->getBarrelEndcap(),
277 (*siHitIter)->getLayerDisk(),
278 (*siHitIter)->getEtaModule(),
279 (*siHitIter)->getPhiModule(),
280 (*siHitIter)->getSide() );
282 ATH_MSG_DEBUG(
"Finished Merging " << ajoiningHits.size() <<
" SiHits together." );
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
AtlasHitsVector< SiHit > SiHitCollection
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_startPosY_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_pdgid_decor_key
std::vector< SiHit > findAllHitsCompatibleWithCluster(const std::vector< Identifier > &rdos, const InDetDD::SiDetectorElement &element, const std::vector< const SiHit * > &sihits) const
StripClusterSiHitDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_endPosX_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_meanTime_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sdo_depositsEnergy
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sdo_depositsBarcode
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_endPosY_decor_key
virtual StatusCode initialize() override
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_startPosX_decor_key
const SCT_ID * m_StripHelper
SG::ReadHandleKey< SiHitCollection > m_siHitsKey
SG::ReadDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurement_detectorElementID
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_energyDeposit_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sdo_words
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_startPosZ_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_endPosZ_decor_key
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputMeasurementsKey
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_barcode_decor_key
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_stripDetEleCollKey
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
Class implementing how to access a container.
const boost::container::small_vector< Range, inline_size > rangesForIdentifierDirect(const identifier_t &identifier) const
Function to return the list of ranges corresponding to a given identifier.
std::vector< identifier_t > allIdentifiers() const
Function to return all available identifier (i.e. keys in the map)
size_type size() const noexcept
Returns the number of elements in the collection.
This is a "hash" representation of an Identifier.
Identifier for the strip or pixel cell.
int phiIndex() const
Get phi index. Equivalent to strip().
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
Amg::Vector2D hitLocalToLocal(double xEta, double xPhi) const
Simulation/Hit local frame to reconstruction local frame.
const_pointer_type cptr()
Handle class for reading a decoration on an object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
Handle class for adding a decoration to an object.
HepGeom::Point3D< double > localStartPosition() const
HepGeom::Point3D< double > localEndPosition() const
const std::vector< uint64_t > & rdoIdentifierList() const
Returns the list of RDO identifiers.
std::tuple< std::vector< float >, std::vector< float >, std::vector< int >, std::vector< int >, std::vector< float >, std::vector< float >, std::vector< float >, std::vector< float >, std::vector< float >, std::vector< float > > getSiHitInformation(const InDetDD::SiDetectorElement &element, const std::vector< SiHit > &matchingHits)
std::tuple< std::vector< int >, std::vector< std::vector< int > >, std::vector< std::vector< float > > > getSDOInformation(const std::vector< Identifier > &rdoList, const InDetSimDataCollection &sdoCollection)
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Eigen::Matrix< double, 2, 1 > Vector2D
bool is_same_particle(const T1 &p1, const T2 &p2)
Method to establish if two particles in the GenEvent actually represent the same particle.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
TrackMeasurementValidationContainer_v1 TrackMeasurementValidationContainer
Definition of the current "TrackMeasurementValidation container version".