diff --git a/Event/xAOD/xAODTracking/xAODTracking/selection.xml b/Event/xAOD/xAODTracking/xAODTracking/selection.xml index 4619fabaf1f36f9b2246800ea605d62176a28531..3010b2d4d6b744eb2ec14052bb91be3f4cdd5446 100644 --- a/Event/xAOD/xAODTracking/xAODTracking/selection.xml +++ b/Event/xAOD/xAODTracking/xAODTracking/selection.xml @@ -107,6 +107,7 @@ + prdmtCollHandle(m_multiTruth_key); + if (prdmtCollHandle.isValid()) { + prdmtColl = &*prdmtCollHandle; + } + } + + const InDetSimDataCollection* sdoCollection(nullptr); + if (m_writeSDOs) { + SG::ReadHandle sdoCollectionHandle(m_SDOcontainer_key); + if (sdoCollectionHandle.isValid()) { + sdoCollection = &*sdoCollectionHandle; + } else if (m_firstEventWarnings) { + ATH_MSG_WARNING("SDO information requested, but SDO collection not available!"); + } + } + + std::vector> siHits(m_PixelHelper->wafer_hash_max()); + if (m_need_sihits) { + SG::ReadHandle siHitCollectionHandle(m_sihitContainer_key); + if (siHitCollectionHandle.isValid()) { + for (const SiHit& siHit: *siHitCollectionHandle) { + // Check if it is a Pixel hit + if (!siHit.isPixel()) continue; + + Identifier wafer_id(m_PixelHelper->wafer_id(siHit.getBarrelEndcap(), + siHit.getLayerDisk(), + siHit.getPhiModule(), + siHit.getEtaModule())); + IdentifierHash wafer_hash(m_PixelHelper->wafer_hash(wafer_id)); + if (wafer_hash>=m_PixelHelper->wafer_hash_max()) continue; + siHits[wafer_hash].push_back(&siHit); + } + } else if (m_firstEventWarnings) { + ATH_MSG_WARNING("SiHit information requested, but SiHit collection not available!"); + } + } // Create the xAOD container and its auxiliary store: SG::WriteHandle xaod(m_write_xaod); ATH_CHECK(xaod.record(std::make_unique(), - std::make_unique())); + std::make_unique())); SG::WriteHandle> offsets(m_write_offsets); ATH_CHECK(offsets.record(std::make_unique>(m_PixelHelper->wafer_hash_max(), 0))); @@ -252,12 +291,11 @@ StatusCode PixelPrepDataToxAOD::execute() AUXDATA(xprd,uint64_t,detectorElementID) = detElementId; // Use the MultiTruth Collection to get a list of all true particle contributing to the cluster - if (m_useTruthInfo) { - SG::ReadHandle prdmtColl(m_multiTruth_key); + if (prdmtColl) { std::vector barcodes; auto range = prdmtColl->equal_range(clusterId); for (auto i = range.first; i != range.second; ++i) { - barcodes.push_back( i->second.barcode() ); + barcodes.push_back( i->second.barcode() ); } AUXDATA(xprd,std::vector, truth_barcode) = barcodes; } @@ -265,41 +303,26 @@ StatusCode PixelPrepDataToxAOD::execute() std::vector< std::vector< int > > sdo_tracks; // Use the SDO Collection to get a list of all true particle contributing to the cluster per readout element // Also get the energy deposited by each true particle per readout element - if(m_writeSDOs) { - SG::ReadHandle sdoCollection(m_SDOcontainer_key); - if ( sdoCollection.isValid() ) - { - sdo_tracks = addSDOInformation(xprd, prd, *sdoCollection); - } - else if ( m_firstEventWarnings ) - { - ATH_MSG_WARNING("SDO information requested, but SDO collection not available!"); - } + if (sdoCollection) { + sdo_tracks = addSDOInformation(xprd, prd, *sdoCollection); } // Now Get the most detailed truth from the SiHits // Note that this could get really slow if there are a lot of hits and clusters if (m_need_sihits) { - SG::ReadHandle sihitCollection(m_sihitContainer_key); - if ( sihitCollection.isValid() ) - { - const std::vector matched_hits = findAllHitsCompatibleWithCluster(prd, *sihitCollection, sdo_tracks); - - if (m_writeSiHits) { - if (!m_writeSDOs) - ATH_MSG_WARNING("Si hit truth information requested, but SDO collection not available!"); - addSiHitInformation(xprd, prd, matched_hits); - } + const std::vector matched_hits = findAllHitsCompatibleWithCluster(prd, &siHits[prd->detectorElement()->identifyHash()], sdo_tracks); + if (m_writeSiHits) { + if (!m_writeSDOs) { + ATH_MSG_WARNING("Si hit truth information requested, but SDO collection not available!"); + } + addSiHitInformation(xprd, prd, matched_hits); + } - if (m_writeNNinformation) { - if (!m_writeSDOs) - ATH_MSG_WARNING("Si hit truth information requested, but SDO collection not available!"); - addNNTruthInfo(xprd, prd, matched_hits); - } - } - else if ( m_firstEventWarnings ) - { - ATH_MSG_WARNING("SiHit information requested, but SiHit collection not available!"); + if (m_writeNNinformation) { + if (!m_writeSDOs) { + ATH_MSG_WARNING("Si hit truth information requested, but SDO collection not available!"); + } + addNNTruthInfo(xprd, prd, matched_hits); } } } @@ -467,10 +490,10 @@ void PixelPrepDataToxAOD::addSiHitInformation( xAOD::TrackMeasurementValidation std::vector PixelPrepDataToxAOD::findAllHitsCompatibleWithCluster( const InDet::PixelCluster* prd, - const SiHitCollection& collection, + const std::vector* sihits, std::vector< std::vector< int > > & trkBCs ) const { - ATH_MSG_VERBOSE( "Got " << collection.size() << " SiHits to look through" ); + ATH_MSG_VERBOSE( "Got " << sihits->size() << " SiHits to look through" ); std::vector matchingHits; // Check if we have detector element -- needed to find the local position of the SiHits @@ -480,27 +503,13 @@ std::vector PixelPrepDataToxAOD::findAllHitsCompatibleWithCluster( const std::vector multiMatchingHits; - for ( const auto& siHit : collection) { - // Check if it is a Pixel hit - if( !siHit.isPixel() ) - continue; - - //Check if it is on the correct module - Identifier clusterId = prd->identify(); - - if( m_PixelHelper->barrel_ec(clusterId) != siHit.getBarrelEndcap() || - m_PixelHelper->layer_disk(clusterId)!= siHit.getLayerDisk() || - m_PixelHelper->phi_module(clusterId)!= siHit.getPhiModule() || - m_PixelHelper->eta_module(clusterId)!= siHit.getEtaModule() ) - continue; - + for ( const SiHit* siHit : *sihits) { // Now we have all hits in the module that match lets check to see if they match the cluster // Must be within +/- 1 hits of any hit in the cluster to be included - ATH_MSG_DEBUG("Hit is on the same module"); if ( m_useSiHitsGeometryMatching ) { - HepGeom::Point3D averagePosition = siHit.localStartPosition() + siHit.localEndPosition(); + HepGeom::Point3D averagePosition = siHit->localStartPosition() + siHit->localEndPosition(); averagePosition *= 0.5; Amg::Vector2D pos = de->hitLocalToLocal( averagePosition.z(), averagePosition.y() ); InDetDD::SiCellId diode = de->cellIdOfPosition(pos); @@ -511,7 +520,7 @@ std::vector PixelPrepDataToxAOD::findAllHitsCompatibleWithCluster( const if( abs( int(diode.etaIndex()) - m_PixelHelper->eta_index( hitIdentifier ) ) <=1 && abs( int(diode.phiIndex()) - m_PixelHelper->phi_index( hitIdentifier ) ) <=1 ) { - multiMatchingHits.push_back(&siHit); + multiMatchingHits.push_back(siHit); break; } } @@ -523,9 +532,9 @@ std::vector PixelPrepDataToxAOD::findAllHitsCompatibleWithCluster( const { for ( const auto barcode : barcodeSDOColl ) { - if ( siHit.particleLink().barcode() == barcode ) + if ( siHit->particleLink().barcode() == barcode ) { - multiMatchingHits.push_back(&siHit); + multiMatchingHits.push_back(siHit); foundHit = true; break; } @@ -1017,7 +1026,7 @@ void PixelPrepDataToxAOD::addNNTruthInfo( xAOD::TrackMeasurementValidation* xp int readoutside = design->readoutSide(); phi[hitNumber] = atan(tan(bowphi)-readoutside*tanlorentz); - if(siHit.particleLink().isValid()){ + if (siHit.particleLink().isValid()){ barcode[hitNumber] = siHit.particleLink().barcode(); auto particle = siHit.particleLink(); diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.h index 6cb62f5e76483040f60589a62a4c81f090b75913..626e8af46bb4f6e165fb2fe9235196cd8eb3aa94 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.h @@ -68,7 +68,7 @@ private: const std::vector & matchingHits ) const; std::vector findAllHitsCompatibleWithCluster(const InDet::PixelCluster* prd, - const SiHitCollection& collection, + const std::vector* sihits, std::vector< std::vector< int > > & trkBCs) const; diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index 994925b909f9cdf4d64ed0afee333d781089910a..97dc81d6f99386f0d8f0d96b85e3fe7c23defe97 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx @@ -9,21 +9,18 @@ #include "SCT_PrepDataToxAOD.h" -#include "xAODTracking/TrackMeasurementValidationAuxContainer.h" - #include "Identifier/Identifier.h" #include "InDetIdentifier/SCT_ID.h" - #include "InDetRawData/SCT_RDO_Collection.h" +#include "InDetSimEvent/SiHit.h" +#include "StoreGate/ReadHandle.h" +#include "StoreGate/WriteHandle.h" +#include "xAODTracking/TrackMeasurementValidationAuxContainer.h" #include "HepMC/GenParticle.h" -#include "InDetSimEvent/SiHit.h" #include "CLHEP/Geometry/Point3D.h" -#include "StoreGate/ReadHandle.h" -#include "StoreGate/WriteHandle.h" - #define AUXDATA(OBJ, TYP, NAME) \ static const SG::AuxElement::Accessor acc_##NAME (#NAME); acc_##NAME(*(OBJ)) @@ -32,10 +29,8 @@ // Constructor with parameters: // ///////////////////////////////////////////////////////////////////// -SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator) : - AthReentrantAlgorithm(name,pSvcLocator), - m_SCTHelper{nullptr}, - m_firstEventWarnings{true} +SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string& name, ISvcLocator* pSvcLocator) : + AthReentrantAlgorithm(name, pSvcLocator) { } @@ -46,23 +41,23 @@ SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSv ///////////////////////////////////////////////////////////////////// StatusCode SCT_PrepDataToxAOD::initialize() { - CHECK ( detStore()->retrieve(m_SCTHelper, "SCT_ID") ); + ATH_CHECK(detStore()->retrieve(m_SCTHelper, "SCT_ID")); //make sure we don't write what we don't have - if (not m_useTruthInfo.value()) { + if (not m_useTruthInfo) { m_writeSDOs.set(false); m_writeSiHits.set(false); } - ATH_CHECK( m_clustercontainer.initialize() ); - ATH_CHECK( m_SDOcontainer.initialize(m_writeSDOs.value()) ); - ATH_CHECK( m_sihitContainer.initialize(m_writeSiHits.value()) ); - ATH_CHECK( m_multiTruth.initialize(m_useTruthInfo.value()) ); - ATH_CHECK( m_rdoContainer.initialize(m_writeRDOinformation.value()) ); - ATH_CHECK( m_xAodContainer.initialize() ); - ATH_CHECK( m_xAodOffset.initialize() ); + ATH_CHECK(m_clustercontainer.initialize()); + ATH_CHECK(m_SDOcontainer.initialize(m_writeSDOs)); + ATH_CHECK(m_sihitContainer.initialize(m_writeSiHits)); + ATH_CHECK(m_multiTruth.initialize(m_useTruthInfo)); + ATH_CHECK(m_rdoContainer.initialize(m_writeRDOinformation)); + ATH_CHECK(m_xAodContainer.initialize()); + ATH_CHECK(m_xAodOffset.initialize()); - ATH_CHECK( m_SCTDetEleCollKey.initialize() ); + ATH_CHECK(m_SCTDetEleCollKey.initialize()); return StatusCode::SUCCESS; } @@ -75,426 +70,421 @@ StatusCode SCT_PrepDataToxAOD::initialize() StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const { // the cluster ambiguity map - std::map< Identifier, const SCT_RDORawData* > idToRAWDataMap; - if (m_writeRDOinformation.value()) { - SG::ReadHandle rdoContainer(m_rdoContainer, ctx); + std::map idToRAWDataMap; + if (m_writeRDOinformation) { + SG::ReadHandle rdoContainer{m_rdoContainer, ctx}; if (rdoContainer.isValid()) { // get all the RIO_Collections in the container for (const auto& collection: *rdoContainer) { - //get all the RDOs in the collection for (const auto& rdo : *collection) { - if (rdo==nullptr) { - ATH_MSG_WARNING( "Null SCT RDO. Skipping it"); + ATH_MSG_WARNING("Null SCT RDO. Skipping it"); continue; } - - Identifier rdoId = rdo->identify(); - idToRAWDataMap.insert( std::pair< Identifier, const SCT_RDORawData*>( rdoId, rdo ) ); + Identifier rdoId{rdo->identify()}; + idToRAWDataMap.insert(std::pair{rdoId, rdo}); } // collection } // Have container; - } else if ( m_firstEventWarnings ) { - ATH_MSG_WARNING( "Failed to retrieve SCT RDO container" ); + } else if (m_firstEventWarnings) { + ATH_MSG_WARNING("Failed to retrieve SCT RDO container"); + } + } + ATH_MSG_DEBUG("Size of RDO map is " << idToRAWDataMap.size()); + + const PRD_MultiTruthCollection* prdmtColl{nullptr}; + if (m_useTruthInfo) { + SG::ReadHandle prdmtCollHandle{m_multiTruth, ctx}; + if (prdmtCollHandle.isValid()) { + prdmtColl = &*prdmtCollHandle; + } + } + + const InDetSimDataCollection* sdoCollection{nullptr}; + if (m_writeSDOs) { + SG::ReadHandle sdoCollectionHandle{m_SDOcontainer, ctx}; + if (sdoCollectionHandle.isValid()) { + sdoCollection = &*sdoCollectionHandle; } } - ATH_MSG_DEBUG("Size of RDO map is "<> siHits(m_SCTHelper->wafer_hash_max()); + if (m_writeSiHits) { + SG::ReadHandle sihitCollection{m_sihitContainer, ctx}; + if (sihitCollection.isValid()) { + for (const SiHit& siHit: *sihitCollection) { + // Check if it is an SCT hit + if (not siHit.isSCT()) continue; + + Identifier wafer_id{m_SCTHelper->wafer_id(siHit.getBarrelEndcap(), + siHit.getLayerDisk(), + siHit.getPhiModule(), + siHit.getEtaModule(), + siHit.getSide())}; + IdentifierHash wafer_hash{m_SCTHelper->wafer_hash(wafer_id)}; + siHits[wafer_hash].push_back(&siHit); + } + } + } + // Mandatory. This is needed and required if this algorithm is scheduled. - SG::ReadHandle sctClusterContainer(m_clustercontainer, ctx); + SG::ReadHandle sctClusterContainer{m_clustercontainer, ctx}; if (not sctClusterContainer.isValid()) { ATH_MSG_FATAL("Cannot retrieve SCT PrepDataContainer " << m_clustercontainer.key()); return StatusCode::FAILURE; } // Create the xAOD container and its auxiliary store: - SG::WriteHandle xaod(m_xAodContainer, ctx); - ATH_CHECK( xaod.record(std::make_unique(), - std::make_unique()) ); + SG::WriteHandle xaod{m_xAodContainer, ctx}; + ATH_CHECK(xaod.record(std::make_unique(), + std::make_unique())); - SG::WriteHandle > offsets(m_xAodOffset, ctx); - ATH_CHECK( offsets.record(std::make_unique >( m_SCTHelper->wafer_hash_max(), 0 )) ); - - // Loop over the container - unsigned int counter(0); - for (const auto& clusterCollection : *sctClusterContainer) { + SG::WriteHandle> offsets{m_xAodOffset, ctx}; + ATH_CHECK(offsets.record(std::make_unique>(m_SCTHelper->wafer_hash_max(), 0))); + // Loop over the container + unsigned int counter{0}; + for (const auto& clusterCollection: *sctClusterContainer) { //Fill Offset container (*offsets)[clusterCollection->identifyHash()] = counter; // skip empty collections if (clusterCollection->empty()) continue; - + + xaod->resize(counter + clusterCollection->size()); // loop over collection and convert to xAOD - for (const InDet::SCT_Cluster* prd : *clusterCollection) { - ++counter; - - Identifier clusterId = prd->identify(); + for (const InDet::SCT_Cluster* prd: *clusterCollection) { + Identifier clusterId{prd->identify()}; if (not clusterId.is_valid()) { ATH_MSG_WARNING("SCT cluster identifier is not valid!"); } - + // create and add xAOD object - xAOD::TrackMeasurementValidation* xprd = new xAOD::TrackMeasurementValidation(); - xaod->push_back(xprd); - + xAOD::TrackMeasurementValidation* xprd{new xAOD::TrackMeasurementValidation()}; + xaod->at(counter) = xprd; + ++counter; + //Set Identifier - xprd->setIdentifier( clusterId.get_compact() ); + xprd->setIdentifier(clusterId.get_compact()); //Set Global Position - Amg::Vector3D gpos = prd->globalPosition(); - xprd->setGlobalPosition(gpos.x(),gpos.y(),gpos.z()); + Amg::Vector3D gpos{prd->globalPosition()}; + xprd->setGlobalPosition(gpos.x(), gpos.y(), gpos.z()); //Set Local Position - const Amg::Vector2D& locpos = prd->localPosition(); - float locY(0.); - float locX = locpos.x(); - if (not (std::isinf(locpos.y()) or std::isnan(locpos.y()))) { - if (locpos.y()>=1e-07) locY=locpos.y(); + const Amg::Vector2D& locpos{prd->localPosition()}; + float locY{0.}; + float locX{static_cast(locpos.x())}; + if ((not std::isinf(locpos.y()) or std::isnan(locpos.y()))) { + if (locpos.y()>=1e-07) locY = locpos.y(); } else { locY = -9999.; } // Set local error matrix - xprd->setLocalPosition(locX,locY); + xprd->setLocalPosition(locX, locY); - const Amg::MatrixX& localCov = prd->localCovariance(); + const Amg::MatrixX& localCov{prd->localCovariance()}; if (localCov.size() == 1) { - xprd->setLocalPositionError( localCov(0,0), 0., 0. ); + xprd->setLocalPositionError(localCov(0, 0), 0., 0.); } else if (localCov.size() == 4) { - xprd->setLocalPositionError( localCov(0,0), localCov(1,1), localCov(0,1) ); + xprd->setLocalPositionError(localCov(0, 0), localCov(1, 1), localCov(0, 1)); } else { - xprd->setLocalPositionError(0.,0.,0.); + xprd->setLocalPositionError(0., 0., 0.); } // Set vector of hit identifiers - std::vector< uint64_t > rdoIdentifierList; - for (const auto &hitIdentifier : prd->rdoList()) { - rdoIdentifierList.push_back( hitIdentifier.get_compact() ); + std::vector rdoIdentifierList; + rdoIdentifierList.reserve(prd->rdoList().size()); + for (const auto& hitIdentifier: prd->rdoList()) { + rdoIdentifierList.push_back(hitIdentifier.get_compact()); } xprd->setRdoIdentifierList(rdoIdentifierList); //Add SCT specific information - const InDet::SiWidth cw = prd->width(); - AUXDATA(xprd, int, SiWidth) = (int)cw.colRow()[0]; - AUXDATA(xprd, int, hitsInThirdTimeBin) = (int)(prd->hitsInThirdTimeBin()); - - AUXDATA(xprd, int, bec) = m_SCTHelper->barrel_ec(clusterId) ; - AUXDATA(xprd, int, layer) = m_SCTHelper->layer_disk(clusterId) ; - AUXDATA(xprd, int, phi_module) = m_SCTHelper->phi_module(clusterId) ; - AUXDATA(xprd, int, eta_module) = m_SCTHelper->eta_module(clusterId) ; - AUXDATA(xprd, int, side) = m_SCTHelper->side(clusterId) ; + const InDet::SiWidth cw{prd->width()}; + AUXDATA(xprd, int, SiWidth) = static_cast(cw.colRow()[0]); + AUXDATA(xprd, int, hitsInThirdTimeBin) = static_cast(prd->hitsInThirdTimeBin()); + + AUXDATA(xprd, int, bec) = m_SCTHelper->barrel_ec(clusterId); + AUXDATA(xprd, int, layer) = m_SCTHelper->layer_disk(clusterId); + AUXDATA(xprd, int, phi_module) = m_SCTHelper->phi_module(clusterId); + AUXDATA(xprd, int, eta_module) = m_SCTHelper->eta_module(clusterId); + AUXDATA(xprd, int, side) = m_SCTHelper->side(clusterId); // Add the Detector element ID -- not sure if needed as we have the informations above - const InDetDD::SiDetectorElement* de = prd->detectorElement(); - uint64_t detElementId(0); + const InDetDD::SiDetectorElement* de{prd->detectorElement()}; + uint64_t detElementId{0}; if (de) { - Identifier detId = de->identify(); - if ( detId.is_valid() ) { + Identifier detId{de->identify()}; + if (detId.is_valid()) { detElementId = detId.get_compact(); } } AUXDATA(xprd, uint64_t, detectorElementID) = detElementId; //Add details about the individual hits - if (m_writeRDOinformation.value()) { + if (m_writeRDOinformation) { addRDOInformation(xprd, prd, idToRAWDataMap); } // Use the MultiTruth Collection to get a list of all true particle contributing to the cluster - if (m_useTruthInfo.value()) { - SG::ReadHandle prdmtColl(m_multiTruth, ctx); - if (prdmtColl.isValid()) { + if (m_useTruthInfo) { + if (prdmtColl) { std::vector barcodes; - //std::pair; - auto range = prdmtColl->equal_range(clusterId); - for (auto i = range.first; i != range.second; ++i) { - barcodes.push_back( i->second.barcode() ); + auto range{prdmtColl->equal_range(clusterId)}; + for (auto& i{range.first}; i!=range.second; ++i) { + barcodes.push_back(i->second.barcode()); } - AUXDATA(xprd, std::vector , truth_barcode) = barcodes; + AUXDATA(xprd, std::vector, truth_barcode) = barcodes; } } // Use the SDO Collection to get a list of all true particle contributing to the cluster per readout element // Also get the energy deposited by each true particle per readout element - if (m_writeSDOs.value()) { - SG::ReadHandle sdoCollection(m_SDOcontainer, ctx); - if (sdoCollection.isValid()) { - addSDOInformation( xprd, prd, &*sdoCollection); + if (m_writeSDOs) { + if (sdoCollection) { + addSDOInformation(xprd, prd, sdoCollection); } } // Now Get the most detailed truth from the SiHits // Note that this could get really slow if there are a lot of hits and clusters - if (m_writeSiHits.value()) { - SG::ReadHandle sihitCollection(m_sihitContainer, ctx); - if (sihitCollection.isValid()) { - addSiHitInformation( xprd, prd, &*sihitCollection); - } + if (m_writeSiHits) { + addSiHitInformation(xprd, prd, &siHits[prd->detectorElement()->identifyHash()]); } } } - ATH_MSG_DEBUG( " recorded SCT_PrepData objects: size " << xaod->size() ); + ATH_MSG_DEBUG(" recorded SCT_PrepData objects: size " << xaod->size()); m_firstEventWarnings = false; //disable one-time warnings return StatusCode::SUCCESS; } - -void SCT_PrepDataToxAOD::addSDOInformation( xAOD::TrackMeasurementValidation* xprd, - const InDet::SCT_Cluster* prd, - const InDetSimDataCollection* sdoCollection ) const +void SCT_PrepDataToxAOD::addSDOInformation(xAOD::TrackMeasurementValidation* xprd, + const InDet::SCT_Cluster* prd, + const InDetSimDataCollection* sdoCollection) const { std::vector sdo_word; - std::vector< std::vector< int > > sdo_depositsBarcode; - std::vector< std::vector< float > > sdo_depositsEnergy; + std::vector> sdo_depositsBarcode; + std::vector> sdo_depositsEnergy; // find hit - for (const auto &hitIdentifier : prd->rdoList()) { - auto pos = sdoCollection->find(hitIdentifier); + for (const auto& hitIdentifier: prd->rdoList()) { + auto pos{sdoCollection->find(hitIdentifier)}; if (pos != sdoCollection->end()) { - sdo_word.push_back( pos->second.word() ) ; - - std::vector< int > sdoDepBC; - std::vector< float > sdoDepEnergy; - for (auto deposit : pos->second.getdeposits()) { - if (deposit.first) { - sdoDepBC.push_back( deposit.first->barcode()); - } else { - sdoDepBC.push_back( -1 ); - } - sdoDepEnergy.push_back( deposit.second ); - ATH_MSG_DEBUG(" SDO Energy Deposit " << deposit.second ) ; + sdo_word.push_back(pos->second.word()); + std::vector sdoDepBC(pos->second.getdeposits().size(), -1); + std::vector sdoDepEnergy(pos->second.getdeposits().size()); + unsigned int nDepos{0}; + for (auto& deposit: pos->second.getdeposits()) { + if (deposit.first) sdoDepBC[nDepos] = deposit.first->barcode(); + ATH_MSG_DEBUG(" SDO Energy Deposit " << deposit.second); + sdoDepEnergy[nDepos] = deposit.second; + nDepos++; } - sdo_depositsBarcode.push_back( sdoDepBC ); - sdo_depositsEnergy.push_back( sdoDepEnergy ); + sdo_depositsBarcode.push_back(sdoDepBC); + sdo_depositsEnergy.push_back(sdoDepEnergy); } } - AUXDATA(xprd, std::vector , sdo_words) = sdo_word; - AUXDATA(xprd, std::vector< std::vector > , sdo_depositsBarcode) = sdo_depositsBarcode; - AUXDATA(xprd, std::vector< std::vector > , sdo_depositsEnergy) = sdo_depositsEnergy; + AUXDATA(xprd, std::vector, sdo_words) = sdo_word; + AUXDATA(xprd, std::vector>, sdo_depositsBarcode) = sdo_depositsBarcode; + AUXDATA(xprd, std::vector>, sdo_depositsEnergy) = sdo_depositsEnergy; } -void SCT_PrepDataToxAOD::addSiHitInformation( xAOD::TrackMeasurementValidation* xprd, - const InDet::SCT_Cluster* prd, - const SiHitCollection* sihitCollection) const +void SCT_PrepDataToxAOD::addSiHitInformation(xAOD::TrackMeasurementValidation* xprd, + const InDet::SCT_Cluster* prd, + const std::vector* siHits) const { - std::vector matchingHits = findAllHitsCompatibleWithCluster( prd, sihitCollection ); + std::vector matchingHits{findAllHitsCompatibleWithCluster(prd, siHits)}; - int numHits = matchingHits.size(); + long unsigned int numHits{matchingHits.size()}; - std::vector sihit_energyDeposit(numHits,0); - std::vector sihit_meanTime(numHits,0); - std::vector sihit_barcode(numHits,0); + std::vector sihit_energyDeposit(numHits, 0.); + std::vector sihit_meanTime(numHits, 0.); + std::vector sihit_barcode(numHits, 0); - std::vector sihit_startPosX(numHits,0); - std::vector sihit_startPosY(numHits,0); - std::vector sihit_startPosZ(numHits,0); + std::vector sihit_startPosX(numHits, 0.); + std::vector sihit_startPosY(numHits, 0.); + std::vector sihit_startPosZ(numHits, 0.); - std::vector sihit_endPosX(numHits,0); - std::vector sihit_endPosY(numHits,0); - std::vector sihit_endPosZ(numHits,0); + std::vector sihit_endPosX(numHits, 0); + std::vector sihit_endPosY(numHits, 0); + std::vector sihit_endPosZ(numHits, 0); - int hitNumber(0); - const InDetDD::SiDetectorElement* de = prd->detectorElement(); + int hitNumber{0}; + const InDetDD::SiDetectorElement* de{prd->detectorElement()}; if (de) { - for (auto sihit : matchingHits) { - sihit_energyDeposit[hitNumber] = sihit.energyLoss() ; - sihit_meanTime[hitNumber] = sihit.meanTime() ; - sihit_barcode[hitNumber] = sihit.particleLink().barcode() ; + for (auto& sihit: matchingHits) { + sihit_energyDeposit[hitNumber] = sihit->energyLoss(); + sihit_meanTime[hitNumber] = sihit->meanTime(); + sihit_barcode[hitNumber] = sihit->particleLink().barcode(); // Convert Simulation frame into reco frame - const HepGeom::Point3D& startPos=sihit.localStartPosition(); - - Amg::Vector2D pos= de->hitLocalToLocal( startPos.z(), startPos.y() ); - sihit_startPosX[hitNumber] = pos[0]; - sihit_startPosY[hitNumber] = pos[1]; - sihit_startPosZ[hitNumber] = startPos.x(); - - - const HepGeom::Point3D& endPos=sihit.localEndPosition(); - pos= de->hitLocalToLocal( endPos.z(), endPos.y() ); - sihit_endPosX[hitNumber] = pos[0]; - sihit_endPosY[hitNumber] = pos[1]; - sihit_endPosZ[hitNumber] = endPos.x(); + const HepGeom::Point3D& startPos{sihit->localStartPosition()}; + + Amg::Vector2D pos{de->hitLocalToLocal(startPos.z(), startPos.y())}; + sihit_startPosX[hitNumber] = pos[0]; + sihit_startPosY[hitNumber] = pos[1]; + sihit_startPosZ[hitNumber] = startPos.x(); + + const HepGeom::Point3D& endPos{sihit->localEndPosition()}; + pos= de->hitLocalToLocal(endPos.z(), endPos.y()); + sihit_endPosX[hitNumber] = pos[0]; + sihit_endPosY[hitNumber] = pos[1]; + sihit_endPosZ[hitNumber] = endPos.x(); ++hitNumber; + delete sihit; + sihit = nullptr; } } - AUXDATA(xprd, std::vector , sihit_energyDeposit) = sihit_energyDeposit; - AUXDATA(xprd, std::vector , sihit_meanTime) = sihit_meanTime; - AUXDATA(xprd, std::vector , sihit_barcode) = sihit_barcode; + AUXDATA(xprd, std::vector, sihit_energyDeposit) = sihit_energyDeposit; + AUXDATA(xprd, std::vector, sihit_meanTime) = sihit_meanTime; + AUXDATA(xprd, std::vector, sihit_barcode) = sihit_barcode; - AUXDATA(xprd, std::vector , sihit_startPosX) = sihit_startPosX; - AUXDATA(xprd, std::vector , sihit_startPosY) = sihit_startPosY; - AUXDATA(xprd, std::vector , sihit_startPosZ) = sihit_startPosZ; - - AUXDATA(xprd, std::vector , sihit_endPosX) = sihit_endPosX; - AUXDATA(xprd, std::vector , sihit_endPosY) = sihit_endPosY; - AUXDATA(xprd, std::vector , sihit_endPosZ) = sihit_endPosZ; + AUXDATA(xprd, std::vector, sihit_startPosX) = sihit_startPosX; + AUXDATA(xprd, std::vector, sihit_startPosY) = sihit_startPosY; + AUXDATA(xprd, std::vector, sihit_startPosZ) = sihit_startPosZ; + AUXDATA(xprd, std::vector, sihit_endPosX) = sihit_endPosX; + AUXDATA(xprd, std::vector, sihit_endPosY) = sihit_endPosY; + AUXDATA(xprd, std::vector, sihit_endPosZ) = sihit_endPosZ; } -std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster( const InDet::SCT_Cluster* prd, - const SiHitCollection* collection) const +std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, + const std::vector* siHits) const { - ATH_MSG_VERBOSE( "Got " << collection->size() << " SiHits to look through" ); - std::vector matchingHits; - + ATH_MSG_VERBOSE("Got " << siHits->size() << " SiHits to look through"); + std::vector matchingHits; + // Check if we have detector element -- needed to find the local position of the SiHits - const InDetDD::SiDetectorElement* de = prd->detectorElement(); + const InDetDD::SiDetectorElement* de{prd->detectorElement()}; if (de==nullptr) return matchingHits; - std::vector multiMatchingHits; - - for ( const auto& siHit : *collection) { - // Check if it is a SCT hit - if (not siHit.isSCT()) continue; - - //Check if it is on the correct module - Identifier clusterId = prd->identify(); - - if (m_SCTHelper->barrel_ec(clusterId) != siHit.getBarrelEndcap() or - m_SCTHelper->layer_disk(clusterId)!= siHit.getLayerDisk() or - m_SCTHelper->phi_module(clusterId)!= siHit.getPhiModule() or - m_SCTHelper->eta_module(clusterId)!= siHit.getEtaModule() or - m_SCTHelper->side(clusterId) != siHit.getSide() ) { - continue; - } + std::vector multiMatchingHits; + for (const SiHit* siHit: *siHits) { // Now we have all hits in the module that match lets check to see if they match the cluster // Must be within +/- 1 hits of any hit in the cluster to be included - ATH_MSG_DEBUG("Hit is on the same module"); - HepGeom::Point3D averagePosition = siHit.localStartPosition() + siHit.localEndPosition(); + HepGeom::Point3D averagePosition{siHit->localStartPosition() + siHit->localEndPosition()}; averagePosition *= 0.5; - Amg::Vector2D pos = de->hitLocalToLocal( averagePosition.z(), averagePosition.y() ); - InDetDD::SiCellId diode = de->cellIdOfPosition(pos); - - for (const auto &hitIdentifier : prd->rdoList()) { - //if ( abs( int(diode.etaIndex()) - m_SCTHelper->eta_index( hitIdentifier ) ) <=1 ) - //if ( abs( int(diode.phiIndex() - m_SCTHelper->phi_index( hitIdentifier ) ) <=1 ) - ATH_MSG_DEBUG("Truth Strip " << diode.phiIndex() << " Cluster Strip " << m_SCTHelper->strip( hitIdentifier ) ); + Amg::Vector2D pos{de->hitLocalToLocal(averagePosition.z(), averagePosition.y())}; + InDetDD::SiCellId diode{de->cellIdOfPosition(pos)}; + + for (const auto& hitIdentifier: prd->rdoList()) { + ATH_MSG_DEBUG("Truth Strip " << diode.phiIndex() << " Cluster Strip " << m_SCTHelper->strip(hitIdentifier)); - if ( abs( int(diode.phiIndex()) - m_SCTHelper->strip( hitIdentifier ) ) <=1) { - multiMatchingHits.push_back(&siHit); + if (abs(static_cast(diode.phiIndex()) - m_SCTHelper->strip(hitIdentifier))<=1) { + multiMatchingHits.push_back(siHit); break; - } + } } } - - + + matchingHits.reserve(multiMatchingHits.size()); //Now we will now make 1 SiHit for each true particle if the SiHits "touch" other - std::vector::iterator siHitIter = multiMatchingHits.begin(); - std::vector::iterator siHitIter2 = multiMatchingHits.begin(); - ATH_MSG_DEBUG( "Found " << multiMatchingHits.size() << " SiHit " ); - for ( ; siHitIter != multiMatchingHits.end(); siHitIter++) { - const SiHit* lowestXPos = *siHitIter; - const SiHit* highestXPos = *siHitIter; + std::vector::iterator siHitIter{multiMatchingHits.begin()}; + std::vector::iterator siHitIter2{multiMatchingHits.begin()}; + ATH_MSG_DEBUG("Found " << multiMatchingHits.size() << " SiHit "); + for (; siHitIter != multiMatchingHits.end(); siHitIter++) { + const SiHit* lowestXPos{*siHitIter}; + const SiHit* highestXPos{*siHitIter}; // We will merge these hits - std::vector ajoiningHits; - ajoiningHits.push_back( *siHitIter ); + std::vector ajoiningHits; + ajoiningHits.push_back(*siHitIter); siHitIter2 = siHitIter+1; - while ( siHitIter2 != multiMatchingHits.end() ) { + while (siHitIter2 != multiMatchingHits.end()) { // Need to come from the same truth particle - if ((*siHitIter)->particleLink().barcode() != (*siHitIter2)->particleLink().barcode() ) { + if ((*siHitIter)->particleLink().barcode() != (*siHitIter2)->particleLink().barcode()) { ++siHitIter2; continue; } - + + const double maxDiff{0.00005}; // Check to see if the SiHits are compatible with each other. - if (fabs((highestXPos->localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 and - fabs((highestXPos->localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 and - fabs((highestXPos->localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 ) { + if (fabs((highestXPos->localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 and - fabs((lowestXPos->localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 and - fabs((lowestXPos->localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005) { + siHitIter2 = multiMatchingHits.erase(siHitIter2); + } else if (fabs((lowestXPos->localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))energyLoss(); time += siHit->meanTime(); } - time /= (float)ajoiningHits.size(); - - matchingHits.push_back( SiHit(lowestXPos->localStartPosition(), - highestXPos->localEndPosition(), - energyDep, - time, - (*siHitIter)->particleLink().barcode(), - 1, // 0 for pixel 1 for SCT - (*siHitIter)->getBarrelEndcap(), - (*siHitIter)->getLayerDisk(), - (*siHitIter)->getEtaModule(), - (*siHitIter)->getPhiModule(), - (*siHitIter)->getSide() ) ); + time /= static_cast(ajoiningHits.size()); + matchingHits.push_back(new SiHit{lowestXPos->localStartPosition(), + highestXPos->localEndPosition(), + energyDep, + time, + (*siHitIter)->particleLink().barcode(), + 1, // 0 for pixel 1 for SCT + (*siHitIter)->getBarrelEndcap(), + (*siHitIter)->getLayerDisk(), + (*siHitIter)->getEtaModule(), + (*siHitIter)->getPhiModule(), + (*siHitIter)->getSide()}); } - } - + } return matchingHits; - } void SCT_PrepDataToxAOD::addRDOInformation(xAOD::TrackMeasurementValidation* xprd, const InDet::SCT_Cluster* prd, const std::map& idToRAWDataMap) const { - std::vector strip; - std::vector timebin; - std::vector groupsize; - - for (const auto &hitIdentifier : prd->rdoList()) { - auto result = idToRAWDataMap.find(hitIdentifier); - if (result != idToRAWDataMap.end() ) { - const SCT_RDORawData *sctRdo = result->second; - const SCT3_RawData* rdo3 = dynamic_cast(sctRdo); - int tbin(-1); - int gs(-1); - if (rdo3!=0) { - tbin = rdo3->getTimeBin(); - gs = rdo3->getGroupSize(); + std::vector strip(prd->rdoList().size(), -1); + std::vector timebin(prd->rdoList().size(), -1); + std::vector groupsize(prd->rdoList().size(), -1); + + unsigned int nRDOs{0}; + for (const auto& hitIdentifier: prd->rdoList()) { + auto result{idToRAWDataMap.find(hitIdentifier)}; + if (result != idToRAWDataMap.end()) { + const SCT_RDORawData* sctRdo{result->second}; + strip[nRDOs] = m_SCTHelper->strip(sctRdo->identify()); + const SCT3_RawData* rdo3{dynamic_cast(sctRdo)}; + if (rdo3) { + timebin[nRDOs] = rdo3->getTimeBin(); + groupsize[nRDOs] = rdo3->getGroupSize(); } - timebin.push_back( tbin); - groupsize.push_back( gs); - strip.push_back(m_SCTHelper->strip(sctRdo->identify())); - } else { - timebin.push_back( -1 ); - strip.push_back( -1 ); - groupsize.push_back( -1 ); } + nRDOs++; } - AUXDATA(xprd, std::vector , rdo_strip) = strip; - AUXDATA(xprd, std::vector , rdo_timebin) = timebin; - AUXDATA(xprd, std::vector , rdo_groupsize) = groupsize; + AUXDATA(xprd, std::vector, rdo_strip) = strip; + AUXDATA(xprd, std::vector, rdo_timebin) = timebin; + AUXDATA(xprd, std::vector, rdo_groupsize) = groupsize; } ///////////////////////////////////////////////////////////////////// diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h index c742b150dfec5cb0cf128dc39462e5fb91c5638a..e3430a4b7ea7499eecca10b3ea7b98d0240d11c0 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h @@ -15,37 +15,35 @@ #include "AthenaBaseComps/AthReentrantAlgorithm.h" #include "InDetPrepRawData/SCT_ClusterContainer.h" +#include "InDetRawData/SCT_RDO_Container.h" #include "InDetReadoutGeometry/SiDetectorElementCollection.h" #include "InDetSimData/InDetSimDataCollection.h" #include "InDetSimEvent/SiHitCollection.h" -#include "TrkTruthData/PRD_MultiTruthCollection.h" -#include "InDetRawData/SCT_RDO_Container.h" -#include "xAODTracking/TrackMeasurementValidation.h" -#include "xAODTracking/TrackMeasurementValidationContainer.h" - #include "StoreGate/ReadCondHandleKey.h" #include "StoreGate/ReadHandleKey.h" #include "StoreGate/WriteHandleKey.h" +#include "TrkTruthData/PRD_MultiTruthCollection.h" +#include "xAODTracking/TrackMeasurementValidation.h" +#include "xAODTracking/TrackMeasurementValidationContainer.h" #include #include +class Identifier; class SCT_ID; -class SiHit; class SCT_RDORawData; -class Identifier; +class SiHit; namespace InDet { class SCT_Cluster; } - class SCT_PrepDataToxAOD : public AthReentrantAlgorithm { -public: + public: // Constructor with parameters: - SCT_PrepDataToxAOD(const std::string &name,ISvcLocator *pSvcLocator); + SCT_PrepDataToxAOD(const std::string& name, ISvcLocator* pSvcLocator); // Basic algorithm methods: virtual StatusCode initialize(); @@ -54,33 +52,33 @@ public: /** Make this algorithm clonable. */ virtual bool isClonable() const override { return true; }; -private: - + private: - void addSDOInformation( xAOD::TrackMeasurementValidation* xprd, - const InDet::SCT_Cluster* prd, - const InDetSimDataCollection* sdoCollection ) const; + void addSDOInformation(xAOD::TrackMeasurementValidation* xprd, + const InDet::SCT_Cluster* prd, + const InDetSimDataCollection* sdoCollection) const; - void addSiHitInformation( xAOD::TrackMeasurementValidation* xprd, - const InDet::SCT_Cluster* prd, - const SiHitCollection* collection) const; + void addSiHitInformation(xAOD::TrackMeasurementValidation* xprd, + const InDet::SCT_Cluster* prd, + const std::vector* siHits) const; - std::vector findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, - const SiHitCollection* collection) const; + std::vector findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, + const std::vector* siHits) const; - void addRDOInformation(xAOD::TrackMeasurementValidation*, const InDet::SCT_Cluster*, - const std::map& idToRAWDataMap) const; + void addRDOInformation(xAOD::TrackMeasurementValidation*, + const InDet::SCT_Cluster*, + const std::map& idToRAWDataMap) const; - - const SCT_ID *m_SCTHelper; - SG::ReadHandleKey m_clustercontainer{this, "SiClusterContainer", "SCT_Clusters"}; - SG::ReadHandleKey m_SDOcontainer{this, "MC_SDOs", "SCT_SDO_Map"}; - SG::ReadHandleKey m_sihitContainer{this, "MC_Hits", "SCT_Hits"}; - SG::ReadHandleKey m_multiTruth{this, "PRD_MultiTruth", "PRD_MultiTruthSCT"}; - SG::ReadHandleKey m_rdoContainer{this, "SctRdoContainer", "SCT_RDOs"}; - SG::WriteHandleKey m_xAodContainer{this, "SctxAodContainer", "SCT_Clusters"}; - SG::WriteHandleKey > m_xAodOffset{this, "SctxAodOffset", "SCT_ClustersOffsets"}; + const SCT_ID* m_SCTHelper{nullptr}; + SG::ReadHandleKey m_clustercontainer{this, "SiClusterContainer", "SCT_Clusters"}; + SG::ReadHandleKey m_SDOcontainer{this, "MC_SDOs", "SCT_SDO_Map"}; + SG::ReadHandleKey m_sihitContainer{this, "MC_Hits", "SCT_Hits"}; + SG::ReadHandleKey m_multiTruth{this, "PRD_MultiTruth", "PRD_MultiTruthSCT"}; + SG::ReadHandleKey m_rdoContainer{this, "SctRdoContainer", "SCT_RDOs"}; + SG::WriteHandleKey m_xAodContainer{this, "SctxAodContainer", "SCT_Clusters"}; + SG::WriteHandleKey> m_xAodOffset{this, "SctxAodOffset", "SCT_ClustersOffsets"}; // For P->T converter of SCT_Clusters SG::ReadCondHandleKey m_SCTDetEleCollKey{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"}; @@ -91,8 +89,7 @@ private: BooleanProperty m_writeSiHits{this, "WriteSiHits", true}; // --- private members - mutable std::atomic_bool m_firstEventWarnings; - + mutable std::atomic_bool m_firstEventWarnings{false}; }; #endif // SCT_PREPDATATOXAOD_H diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx index 345d2abbc209349563b700d7bb3b488a00806f6b..9b4ab862a8d026107f59768f2996b131dc9c495a 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx @@ -15,10 +15,9 @@ // xAOD container type #include "xAODTracking/SCTRawHitValidationAuxContainer.h" -SCT_RawDataToxAOD::SCT_RawDataToxAOD(const std::string &name, - ISvcLocator *pSvcLocator) - : AthReentrantAlgorithm(name, pSvcLocator), - m_SCTHelper{nullptr} +SCT_RawDataToxAOD::SCT_RawDataToxAOD(const std::string& name, + ISvcLocator* pSvcLocator) + : AthReentrantAlgorithm(name, pSvcLocator) { } @@ -30,21 +29,27 @@ StatusCode SCT_RawDataToxAOD::initialize() { } StatusCode SCT_RawDataToxAOD::execute(const EventContext& ctx) const { - SG::ReadHandle rdoContainer(m_rdoContainerName, ctx); + SG::ReadHandle rdoContainer{m_rdoContainerName, ctx}; + if (not rdoContainer.isValid()) return StatusCode::SUCCESS; + unsigned nRDOs{0}; + for (const SCT_RDO_Collection* collection: *rdoContainer) { + nRDOs += collection->size(); + } // Create the output xAOD container and its auxiliary store: - SG::WriteHandle xaod(m_xAodRawHitContainerName, ctx); + SG::WriteHandle xaod{m_xAodRawHitContainerName, ctx}; ATH_CHECK(xaod.record(std::make_unique(), std::make_unique())); + xaod->reserve(nRDOs); /// loop over input RDOs - for (const SCT_RDO_Collection* collection : *rdoContainer) { - for (const SCT_RDORawData* rdo : *collection) { + for (const SCT_RDO_Collection* collection: *rdoContainer) { + for (const SCT_RDORawData* rdo: *collection) { // create and add xAOD object - xAOD::SCTRawHitValidation* xrdo = new xAOD::SCTRawHitValidation(); + xAOD::SCTRawHitValidation* xrdo{new xAOD::SCTRawHitValidation()}; xaod->push_back(xrdo); /// copy xrdo properties from input rdo - const Identifier& id = rdo->identify(); + const Identifier id{rdo->identify()}; xrdo->setIdentifier(id.get_compact()); xrdo->setWord(rdo->getWord()); // setting additional decorations based on identifier diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.h index 427c5ad28f0540e5407ceba9bca44cecd344b83c..713678b0766268b739d6fb0eed3e247258b6b0d2 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.h @@ -9,11 +9,11 @@ #include "AthenaBaseComps/AthReentrantAlgorithm.h" +// SCT ntuple container type +#include "InDetRawData/SCT_RDO_Container.h" // StoreGate Data Handle Key #include "StoreGate/ReadHandleKey.h" #include "StoreGate/WriteHandleKey.h" -// SCT ntuple container type -#include "InDetRawData/SCT_RDO_Container.h" // xAOD container type #include "xAODTracking/SCTRawHitValidationContainer.h" @@ -35,7 +35,7 @@ public: virtual bool isClonable() const override { return true; }; private: - const SCT_ID* m_SCTHelper; + const SCT_ID* m_SCTHelper{nullptr}; SG::ReadHandleKey m_rdoContainerName{this, "SctRdoContainer", "SCT_RDOs"}; SG::WriteHandleKey m_xAodRawHitContainerName{this, "SctxAodRawHitContainer", "SCT_RawHits"};