16 ISvcLocator *pSvcLocator)
53 return StatusCode::SUCCESS;
82 ATH_CHECK( decor_detectorElementID.isValid() );
104 std::vector< std::vector< const SiHit* > > siHitsCollections(
m_PixelHelper->wafer_hash_max());
105 for (
const SiHit& siHit: *siHits) {
106 if (!siHit.isPixel()) {
108 return StatusCode::FAILURE;
112 siHit.getLayerDisk(),
113 siHit.getPhiModule(),
114 siHit.getEtaModule()));
120 return StatusCode::FAILURE;
122 siHitsCollections[wafer_hash].push_back(&siHit);
126 pixelAccessor ( *measurements,
128 pixElements->
size());
132 for (
const auto& hashId : allIdHashes) {
135 ATH_MSG_FATAL(
"Invalid pixel detector element for hash " << hashId);
136 return StatusCode::FAILURE;
140 const std::vector< const SiHit* >& siHitsWithCurrentHash = siHitsCollections.at(hashId);
142 for (
auto itr = startRange; itr != stopRange; ++itr) {
145 const std::vector< std::uint64_t > rdoIdentifierList = measurement->
rdoIdentifierList();
147 std::vector< Identifier > rdos( rdoIdentifierList.size() );
148 for (std::size_t i(0); i < rdoIdentifierList.size(); ++i) {
149 rdos[i].set_literal( rdoIdentifierList[i] );
155 auto [energyDeposit, meanTime, uniqueID, pdgid,
156 startPosX, startPosY, startPosZ,
160 decor_sdo_words(*measurement) = std::move(word);
161 decor_sdo_depositsBarcode(*measurement) = std::move(depositsUniqueID);
162 decor_sdo_depositsEnergy(*measurement) = std::move(depositsEnergy);
165 decor_sihit_energyDeposit(*measurement) = std::move(energyDeposit);
166 decor_sihit_meanTime(*measurement) = std::move(meanTime);
167 decor_sihit_barcode(*measurement) = std::move(uniqueID);
168 decor_sihit_pdgid(*measurement) = std::move(pdgid);
170 decor_sihit_startPosX(*measurement) = std::move(startPosX);
171 decor_sihit_startPosY(*measurement) = std::move(startPosY);
172 decor_sihit_startPosZ(*measurement) = std::move(startPosZ);
174 decor_sihit_endPosX(*measurement) = std::move(endPosX);
175 decor_sihit_endPosY(*measurement) = std::move(endPosY);
176 decor_sihit_endPosZ(*measurement) = std::move(endPosZ);
180 return StatusCode::SUCCESS;
186 const std::vector<const SiHit*>& sihits,
187 const std::vector< std::vector< int > >& sdoTracks)
const
189 std::vector<SiHit> matchingHits {};
190 std::vector<const SiHit*> multiMatchingHits {};
192 for (
const SiHit* siHit : sihits) {
196 HepGeom::Point3D<double> averagePosition = 0.5 * (siHit->localStartPosition() + siHit->localEndPosition());
200 for(
const Identifier& hitIdentifier : rdos ) {
203 if( std::abs(
static_cast<int>(diode.
etaIndex()) -
m_PixelHelper->eta_index( hitIdentifier ) ) <= 1 and
205 multiMatchingHits.push_back(siHit);
212 for (
const std::vector<int>& uniqueIDSDOColl : sdoTracks ) {
213 if (std::find(uniqueIDSDOColl.begin(), uniqueIDSDOColl.end(), siHitUniqueID) == uniqueIDSDOColl.end())
continue;
214 multiMatchingHits.push_back(siHit);
222 std::vector<const SiHit* >::iterator siHitIter = multiMatchingHits.begin();
223 std::vector<const SiHit* >::iterator siHitIter2 = multiMatchingHits.begin();
224 for ( ; siHitIter != multiMatchingHits.end(); ++siHitIter) {
225 const SiHit* lowestXPos = *siHitIter;
226 const SiHit* highestXPos = *siHitIter;
229 std::vector<const SiHit* > ajoiningHits;
230 ajoiningHits.push_back( *siHitIter );
232 siHitIter2 = siHitIter + 1;
233 while ( siHitIter2 != multiMatchingHits.end() ) {
236 (*siHitIter2)->particleLink()) ) {
242 if (std::abs((highestXPos->
localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 &&
243 std::abs((highestXPos->
localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 &&
244 std::abs((highestXPos->
localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 ) {
245 highestXPos = *siHitIter2;
246 ajoiningHits.push_back( *siHitIter2 );
249 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
250 }
else if (std::abs((lowestXPos->
localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 &&
251 std::abs((lowestXPos->
localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 &&
252 std::abs((lowestXPos->
localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005) {
253 lowestXPos = *siHitIter2;
254 ajoiningHits.push_back( *siHitIter2 );
257 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
263 if ( ajoiningHits.empty() ) {
266 }
else if ( ajoiningHits.size() == 1 ) {
268 matchingHits.push_back( *ajoiningHits[0] );
272 ATH_MSG_DEBUG(
"Merging " << ajoiningHits.size() <<
" SiHits together." );
274 float energyDep {0.f};
276 for(
const auto& siHit : ajoiningHits ){
277 energyDep += siHit->energyLoss();
278 time += siHit->meanTime();
280 time /= ajoiningHits.size();
286 (*siHitIter)->particleLink(),
288 (*siHitIter)->getBarrelEndcap(),
289 (*siHitIter)->getLayerDisk(),
290 (*siHitIter)->getEtaModule(),
291 (*siHitIter)->getPhiModule(),
292 (*siHitIter)->getSide() );
294 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_meanTime_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_barcode_decor_key
virtual StatusCode initialize() override
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_startPosY_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_endPosY_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_startPosZ_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_energyDeposit_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sdo_depositsEnergy
SG::ReadHandleKey< SiHitCollection > m_siHitsKey
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_pdgid_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_endPosX_decor_key
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer_key
SG::ReadDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurement_detectorElementID
PixelClusterSiHitDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< SiHit > findAllHitsCompatibleWithCluster(const std::vector< Identifier > &rdos, const InDetDD::SiDetectorElement &element, const std::vector< const SiHit * > &sihits, const std::vector< std::vector< int > > &sdoTracks) const
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_endPosZ_decor_key
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sdo_words
Gaudi::Property< bool > m_useSiHitsGeometryMatching
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_inputMeasurementsKey
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sihit_startPosX_decor_key
const PixelID * m_PixelHelper
virtual StatusCode execute(const EventContext &ctx) const override
SG::WriteDecorHandleKey< xAOD::TrackMeasurementValidationContainer > m_sdo_depositsBarcode
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().
int etaIndex() const
Get eta index.
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".