From 6166a1253cf7c5909c95fa516a222709354ae49f Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Fri, 29 Mar 2019 19:06:10 +0100 Subject: [PATCH 01/10] Style unification --- .../src/SCT_PrepDataToxAOD.cxx | 469 +++++++++--------- 1 file changed, 223 insertions(+), 246 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index 994925b909f..e560fbf802b 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,8 +29,8 @@ // Constructor with parameters: // ///////////////////////////////////////////////////////////////////// -SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator) : - AthReentrantAlgorithm(name,pSvcLocator), +SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string& name, ISvcLocator* pSvcLocator) : + AthReentrantAlgorithm(name, pSvcLocator), m_SCTHelper{nullptr}, m_firstEventWarnings{true} { @@ -46,23 +43,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,291 +72,283 @@ 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 "< 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 )) ); + 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) { - + 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; + 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 (m_useTruthInfo) { + SG::ReadHandle prdmtColl{m_multiTruth, ctx}; if (prdmtColl.isValid()) { 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 (m_writeSDOs) { + SG::ReadHandle sdoCollection{m_SDOcontainer, ctx}; if (sdoCollection.isValid()) { - addSDOInformation( xprd, prd, &*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 (m_writeSiHits) { + SG::ReadHandle sihitCollection{m_sihitContainer, ctx}; if (sihitCollection.isValid()) { - addSiHitInformation( xprd, prd, &*sihitCollection); + addSiHitInformation(xprd, prd, &*sihitCollection); } } } } - 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_word(prd->rdoList().size()); + std::vector> sdo_depositsBarcode(prd->rdoList().size()); + std::vector> sdo_depositsEnergy(prd->rdoList().size()); // 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() ) ; + sdo_word.push_back(pos->second.word()) ; - std::vector< int > sdoDepBC; - std::vector< float > sdoDepEnergy; - for (auto deposit : pos->second.getdeposits()) { + std::vector sdoDepBC(pos->second.getdeposits().size()); + std::vector sdoDepEnergy(pos->second.getdeposits().size()); + for (auto deposit: pos->second.getdeposits()) { if (deposit.first) { - sdoDepBC.push_back( deposit.first->barcode()); + sdoDepBC.push_back(deposit.first->barcode()); } else { - sdoDepBC.push_back( -1 ); + sdoDepBC.push_back(-1); } - sdoDepEnergy.push_back( deposit.second ); - ATH_MSG_DEBUG(" SDO Energy Deposit " << deposit.second ) ; + sdoDepEnergy.push_back(deposit.second); + ATH_MSG_DEBUG(" SDO Energy Deposit " << deposit.second); } - 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 SiHitCollection* sihitCollection) const { - std::vector matchingHits = findAllHitsCompatibleWithCluster( prd, sihitCollection ); + std::vector matchingHits{findAllHitsCompatibleWithCluster(prd, sihitCollection)}; - 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; } } - 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 SiHitCollection* collection) const { - ATH_MSG_VERBOSE( "Got " << collection->size() << " SiHits to look through" ); - std::vector matchingHits; - + ATH_MSG_VERBOSE("Got " << collection->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) { + 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() ) { + Identifier clusterId{prd->identify()}; + if (m_SCTHelper->phi_module(clusterId) != siHit.getPhiModule() or + m_SCTHelper->eta_module(clusterId) != siHit.getEtaModule() or + m_SCTHelper->layer_disk(clusterId) != siHit.getLayerDisk() or + m_SCTHelper->barrel_ec(clusterId) != siHit.getBarrelEndcap() or + m_SCTHelper->side(clusterId) != siHit.getSide()) { continue; } @@ -367,40 +356,38 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster( const I // 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) { + 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; } @@ -408,57 +395,53 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster( const I // 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 ) { + fabs((highestXPos->localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005) { highestXPos = *siHitIter2; - ajoiningHits.push_back( *siHitIter2 ); + ajoiningHits.push_back(*siHitIter2); // Dont use hit more than once - siHitIter2 = multiMatchingHits.erase( siHitIter2 ); + siHitIter2 = multiMatchingHits.erase(siHitIter2); } else if (fabs((lowestXPos->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) { lowestXPos = *siHitIter2; - ajoiningHits.push_back( *siHitIter2 ); + ajoiningHits.push_back(*siHitIter2); // Dont use hit more than once - siHitIter2 = multiMatchingHits.erase( siHitIter2 ); + siHitIter2 = multiMatchingHits.erase(siHitIter2); } else { ++siHitIter2; } } - if (ajoiningHits.size() == 0) { - ATH_MSG_WARNING("This should really never happen"); + if (ajoiningHits.size()==0) { + ATH_MSG_ERROR("This should really never happen"); continue; - } else if (ajoiningHits.size() == 1) { + } else if (ajoiningHits.size()==1) { // Copy Si Hit ready to return - matchingHits.push_back( *ajoiningHits[0] ); + matchingHits.push_back(*ajoiningHits[0]); continue; } else { // Build new SiHit and merge information together. - ATH_MSG_DEBUG("Merging " << ajoiningHits.size() << " SiHits together." ); - - - float energyDep(0.); - float time(0.); - for (auto& siHit : ajoiningHits) { + ATH_MSG_DEBUG("Merging " << ajoiningHits.size() << " SiHits together."); + float energyDep{0.}; + float time{0.}; + for (auto& siHit: ajoiningHits) { energyDep += siHit->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(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; @@ -467,34 +450,28 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster( const I 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; } ///////////////////////////////////////////////////////////////////// -- GitLab From d55f2d4ce414d04513373581b9c444254690aad9 Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Fri, 29 Mar 2019 19:17:11 +0100 Subject: [PATCH 02/10] Pass pointers instead of objects. --- .../src/SCT_PrepDataToxAOD.cxx | 31 ++++++++++--------- .../src/SCT_PrepDataToxAOD.h | 5 ++- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index e560fbf802b..a46b037fc85 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx @@ -46,7 +46,7 @@ StatusCode SCT_PrepDataToxAOD::initialize() ATH_CHECK(detStore()->retrieve(m_SCTHelper, "SCT_ID")); //make sure we don't write what we don't have - if (not m_useTruthInfo) { + if (not m_useTruthInfo) { m_writeSDOs.set(false); m_writeSiHits.set(false); } @@ -272,7 +272,7 @@ void SCT_PrepDataToxAOD::addSiHitInformation(xAOD::TrackMeasurementValidation* x const InDet::SCT_Cluster* prd, const SiHitCollection* sihitCollection) const { - std::vector matchingHits{findAllHitsCompatibleWithCluster(prd, sihitCollection)}; + std::vector matchingHits{findAllHitsCompatibleWithCluster(prd, sihitCollection)}; long unsigned int numHits{matchingHits.size()}; @@ -291,25 +291,27 @@ void SCT_PrepDataToxAOD::addSiHitInformation(xAOD::TrackMeasurementValidation* x 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()}; + 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()}; + 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; } } @@ -326,11 +328,11 @@ void SCT_PrepDataToxAOD::addSiHitInformation(xAOD::TrackMeasurementValidation* x AUXDATA(xprd, std::vector, sihit_endPosZ) = sihit_endPosZ; } -std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, +std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, const SiHitCollection* collection) const { ATH_MSG_VERBOSE("Got " << collection->size() << " SiHits to look through"); - std::vector matchingHits; + std::vector matchingHits; // Check if we have detector element -- needed to find the local position of the SiHits const InDetDD::SiDetectorElement* de{prd->detectorElement()}; @@ -341,7 +343,7 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const In 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->phi_module(clusterId) != siHit.getPhiModule() or @@ -417,7 +419,7 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const In continue; } else if (ajoiningHits.size()==1) { // Copy Si Hit ready to return - matchingHits.push_back(*ajoiningHits[0]); + matchingHits.push_back(new SiHit(*ajoiningHits[0])); continue; } else { // Build new SiHit and merge information together. @@ -429,7 +431,7 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const In time += siHit->meanTime(); } time /= static_cast(ajoiningHits.size()); - matchingHits.push_back(SiHit{lowestXPos->localStartPosition(), + matchingHits.push_back(new SiHit{lowestXPos->localStartPosition(), highestXPos->localEndPosition(), energyDep, time, @@ -441,10 +443,9 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const In (*siHitIter)->getPhiModule(), (*siHitIter)->getSide()}); } - } + } return matchingHits; - } void SCT_PrepDataToxAOD::addRDOInformation(xAOD::TrackMeasurementValidation* xprd, diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h index 9502572c981..832eb8ecae5 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h @@ -62,14 +62,13 @@ private: const InDet::SCT_Cluster* prd, const SiHitCollection* collection) const; - std::vector findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, + std::vector findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, const SiHitCollection* collection) const; void addRDOInformation(xAOD::TrackMeasurementValidation*, const InDet::SCT_Cluster*, const std::map& idToRAWDataMap) const; - - const SCT_ID *m_SCTHelper; + 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"}; -- GitLab From a595ecb107175596b30c2e58342ad9d5dd85ac8f Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Fri, 29 Mar 2019 19:27:45 +0100 Subject: [PATCH 03/10] Further cleanup --- .../src/SCT_PrepDataToxAOD.cxx | 27 +++++----- .../src/SCT_PrepDataToxAOD.h | 54 +++++++++---------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index a46b037fc85..428ba74e300 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx @@ -129,8 +129,8 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const // create and add xAOD object xAOD::TrackMeasurementValidation* xprd{new xAOD::TrackMeasurementValidation()}; xaod->at(counter) = xprd; - ++counter; - + ++counter; + //Set Identifier xprd->setIdentifier(clusterId.get_compact()); @@ -201,7 +201,7 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const std::vector barcodes; //std::pair; auto range{prdmtColl->equal_range(clusterId)}; - for (auto i{range.first}; i!=range.second; ++i) { + for (auto& i{range.first}; i!=range.second; ++i) { barcodes.push_back(i->second.barcode()); } AUXDATA(xprd, std::vector, truth_barcode) = barcodes; @@ -242,14 +242,14 @@ void SCT_PrepDataToxAOD::addSDOInformation(xAOD::TrackMeasurementValidation* xpr std::vector> sdo_depositsBarcode(prd->rdoList().size()); std::vector> sdo_depositsEnergy(prd->rdoList().size()); // find hit - for (const auto &hitIdentifier: prd->rdoList()) { + for (const auto& hitIdentifier: prd->rdoList()) { auto pos{sdoCollection->find(hitIdentifier)}; if (pos != sdoCollection->end()) { sdo_word.push_back(pos->second.word()) ; std::vector sdoDepBC(pos->second.getdeposits().size()); std::vector sdoDepEnergy(pos->second.getdeposits().size()); - for (auto deposit: pos->second.getdeposits()) { + for (auto& deposit: pos->second.getdeposits()) { if (deposit.first) { sdoDepBC.push_back(deposit.first->barcode()); } else { @@ -345,7 +345,7 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const I if (not siHit.isSCT()) continue; //Check if it is on the correct module - Identifier clusterId{prd->identify()}; + Identifier clusterId{prd->identify()}; if (m_SCTHelper->phi_module(clusterId) != siHit.getPhiModule() or m_SCTHelper->eta_module(clusterId) != siHit.getEtaModule() or m_SCTHelper->layer_disk(clusterId) != siHit.getLayerDisk() or @@ -393,18 +393,19 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const I ++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) { + } else if (fabs((lowestXPos->localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))localStartPosition().z()-(*siHitIter2)->localEndPosition().z())) #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(); virtual StatusCode execute(const EventContext& ctx) const; virtual StatusCode finalize(); -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 SiHitCollection* collection) const; std::vector findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, const SiHitCollection* collection) 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"}; + 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"}; @@ -87,7 +86,6 @@ private: // --- private members mutable std::atomic_bool m_firstEventWarnings; - }; #endif // SCT_PREPDATATOXAOD_H -- GitLab From c03069eb5f8f7e7514954a62fdea8a361b10e44a Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Sat, 30 Mar 2019 04:09:46 +0100 Subject: [PATCH 04/10] Avoid ReadHandles in for loops. --- .../src/SCT_PrepDataToxAOD.cxx | 102 ++++++++++-------- .../src/SCT_PrepDataToxAOD.h | 4 +- 2 files changed, 61 insertions(+), 45 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index 428ba74e300..d217dc30f63 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx @@ -94,6 +94,41 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const } 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; + } + } + + std::vector> 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}; if (not sctClusterContainer.isValid()) { @@ -108,7 +143,7 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const 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) { @@ -125,7 +160,7 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const 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->at(counter) = xprd; @@ -162,6 +197,7 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const // Set vector of hit identifiers std::vector rdoIdentifierList; + rdoIdentifierList.reserve(prd->rdoList().size()); for (const auto& hitIdentifier: prd->rdoList()) { rdoIdentifierList.push_back(hitIdentifier.get_compact()); } @@ -196,8 +232,7 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const // Use the MultiTruth Collection to get a list of all true particle contributing to the cluster if (m_useTruthInfo) { - SG::ReadHandle prdmtColl{m_multiTruth, ctx}; - if (prdmtColl.isValid()) { + if (prdmtColl) { std::vector barcodes; //std::pair; auto range{prdmtColl->equal_range(clusterId)}; @@ -211,19 +246,15 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const // 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, ctx}; - if (sdoCollection.isValid()) { - addSDOInformation(xprd, prd, &*sdoCollection); + 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) { - SG::ReadHandle sihitCollection{m_sihitContainer, ctx}; - if (sihitCollection.isValid()) { - addSiHitInformation(xprd, prd, &*sihitCollection); - } + addSiHitInformation(xprd, prd, &siHits[prd->detectorElement()->identifyHash()]); } } } @@ -242,24 +273,23 @@ void SCT_PrepDataToxAOD::addSDOInformation(xAOD::TrackMeasurementValidation* xpr std::vector> sdo_depositsBarcode(prd->rdoList().size()); std::vector> sdo_depositsEnergy(prd->rdoList().size()); // find hit + unsigned int nSDOs{0}; for (const auto& hitIdentifier: prd->rdoList()) { auto pos{sdoCollection->find(hitIdentifier)}; if (pos != sdoCollection->end()) { - sdo_word.push_back(pos->second.word()) ; - - std::vector sdoDepBC(pos->second.getdeposits().size()); + sdo_word[nSDOs] = 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.push_back(deposit.first->barcode()); - } else { - sdoDepBC.push_back(-1); - } - sdoDepEnergy.push_back(deposit.second); + 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[nSDOs] = sdoDepBC; + sdo_depositsEnergy[nSDOs] = sdoDepEnergy; + nSDOs++; } } AUXDATA(xprd, std::vector, sdo_words) = sdo_word; @@ -270,9 +300,9 @@ void SCT_PrepDataToxAOD::addSDOInformation(xAOD::TrackMeasurementValidation* xpr void SCT_PrepDataToxAOD::addSiHitInformation(xAOD::TrackMeasurementValidation* xprd, const InDet::SCT_Cluster* prd, - const SiHitCollection* sihitCollection) const + const std::vector* siHits) const { - std::vector matchingHits{findAllHitsCompatibleWithCluster(prd, sihitCollection)}; + std::vector matchingHits{findAllHitsCompatibleWithCluster(prd, siHits)}; long unsigned int numHits{matchingHits.size()}; @@ -329,9 +359,9 @@ void SCT_PrepDataToxAOD::addSiHitInformation(xAOD::TrackMeasurementValidation* x } std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, - const SiHitCollection* collection) const + const std::vector* siHits) 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 @@ -340,25 +370,11 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const I 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->phi_module(clusterId) != siHit.getPhiModule() or - m_SCTHelper->eta_module(clusterId) != siHit.getEtaModule() or - m_SCTHelper->layer_disk(clusterId) != siHit.getLayerDisk() or - m_SCTHelper->barrel_ec(clusterId) != siHit.getBarrelEndcap() or - m_SCTHelper->side(clusterId) != siHit.getSide()) { - 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"); - 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)}; @@ -367,7 +383,7 @@ std::vector SCT_PrepDataToxAOD::findAllHitsCompatibleWithCluster(const I ATH_MSG_DEBUG("Truth Strip " << diode.phiIndex() << " Cluster Strip " << m_SCTHelper->strip(hitIdentifier)); if (abs(static_cast(diode.phiIndex()) - m_SCTHelper->strip(hitIdentifier))<=1) { - multiMatchingHits.push_back(&siHit); + multiMatchingHits.push_back(siHit); break; } } diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h index 6140d90cfb6..1761e79c199 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h @@ -57,10 +57,10 @@ class SCT_PrepDataToxAOD : public AthReentrantAlgorithm { void addSiHitInformation(xAOD::TrackMeasurementValidation* xprd, const InDet::SCT_Cluster* prd, - const SiHitCollection* collection) const; + const std::vector* siHits) const; std::vector findAllHitsCompatibleWithCluster(const InDet::SCT_Cluster* prd, - const SiHitCollection* collection) const; + const std::vector* siHits) const; void addRDOInformation(xAOD::TrackMeasurementValidation*, const InDet::SCT_Cluster*, -- GitLab From 7cf5228ed24c800843f2b213b5be73b2dfa487c2 Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Sat, 30 Mar 2019 04:18:02 +0100 Subject: [PATCH 05/10] Move initialization to the header file. --- .../InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx | 5 +---- .../InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index d217dc30f63..a979c0ed2b1 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx @@ -30,9 +30,7 @@ // ///////////////////////////////////////////////////////////////////// SCT_PrepDataToxAOD::SCT_PrepDataToxAOD(const std::string& name, ISvcLocator* pSvcLocator) : - AthReentrantAlgorithm(name, pSvcLocator), - m_SCTHelper{nullptr}, - m_firstEventWarnings{true} + AthReentrantAlgorithm(name, pSvcLocator) { } @@ -234,7 +232,6 @@ StatusCode SCT_PrepDataToxAOD::execute(const EventContext& ctx) const 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()); diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h index 1761e79c199..0e0f6bfaf2f 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h @@ -67,7 +67,7 @@ class SCT_PrepDataToxAOD : public AthReentrantAlgorithm { const std::map& idToRAWDataMap) const; - const SCT_ID* m_SCTHelper; + 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"}; @@ -85,7 +85,7 @@ class SCT_PrepDataToxAOD : public AthReentrantAlgorithm { 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 -- GitLab From 974e569fc5cf2a5dbd98b525a3ed2be06ba0109d Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Sat, 30 Mar 2019 06:41:38 +0100 Subject: [PATCH 06/10] Bug fix --- .../src/SCT_PrepDataToxAOD.cxx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx index a979c0ed2b1..97dc81d6f99 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.cxx @@ -266,15 +266,14 @@ void SCT_PrepDataToxAOD::addSDOInformation(xAOD::TrackMeasurementValidation* xpr const InDet::SCT_Cluster* prd, const InDetSimDataCollection* sdoCollection) const { - std::vector sdo_word(prd->rdoList().size()); - std::vector> sdo_depositsBarcode(prd->rdoList().size()); - std::vector> sdo_depositsEnergy(prd->rdoList().size()); + std::vector sdo_word; + std::vector> sdo_depositsBarcode; + std::vector> sdo_depositsEnergy; // find hit - unsigned int nSDOs{0}; for (const auto& hitIdentifier: prd->rdoList()) { auto pos{sdoCollection->find(hitIdentifier)}; if (pos != sdoCollection->end()) { - sdo_word[nSDOs] = pos->second.word(); + 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}; @@ -284,9 +283,8 @@ void SCT_PrepDataToxAOD::addSDOInformation(xAOD::TrackMeasurementValidation* xpr sdoDepEnergy[nDepos] = deposit.second; nDepos++; } - sdo_depositsBarcode[nSDOs] = sdoDepBC; - sdo_depositsEnergy[nSDOs] = sdoDepEnergy; - nSDOs++; + sdo_depositsBarcode.push_back(sdoDepBC); + sdo_depositsEnergy.push_back(sdoDepEnergy); } } AUXDATA(xprd, std::vector, sdo_words) = sdo_word; -- GitLab From c1eb36cd535813fe323dbd7448fbfaf3110e6c31 Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Sat, 30 Mar 2019 07:05:47 +0100 Subject: [PATCH 07/10] Cleanup for speed up --- .../src/SCT_PrepDataToxAOD.h | 2 ++ .../src/SCT_RawDataToxAOD.cxx | 26 ++++++++++++------- .../src/SCT_RawDataToxAOD.h | 12 ++++----- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h index 0e0f6bfaf2f..91c08695b47 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_PrepDataToxAOD.h @@ -1,3 +1,5 @@ +// -*- C++ -*- + /* Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx index 345d2abbc20..e99343f3f01 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx @@ -17,8 +17,7 @@ SCT_RawDataToxAOD::SCT_RawDataToxAOD(const std::string &name, ISvcLocator *pSvcLocator) - : AthReentrantAlgorithm(name, pSvcLocator), - m_SCTHelper{nullptr} + : AthReentrantAlgorithm(name, pSvcLocator) { } @@ -30,21 +29,28 @@ 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; // 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())); + // Count RDO size and resize xAOD using it to avoid push_back. + unsigned nRDOs{0}; + for (const SCT_RDO_Collection* collection: *rdoContainer) { + nRDOs += collection->size(); + } + xaod->resize(nRDOs); /// loop over input RDOs - for (const SCT_RDO_Collection* collection : *rdoContainer) { - for (const SCT_RDORawData* rdo : *collection) { + nRDOs = 0; + 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->push_back(xrdo); + xAOD::SCTRawHitValidation* xrdo{new xAOD::SCTRawHitValidation()}; /// 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 @@ -53,6 +59,8 @@ StatusCode SCT_RawDataToxAOD::execute(const EventContext& ctx) const { xrdo->setPhi_module(m_SCTHelper->phi_module(id)); xrdo->setEta_module(m_SCTHelper->eta_module(id)); xrdo->setSide(m_SCTHelper->side(id)); + xaod->at(nRDOs) = xrdo; + nRDOs++; } } ATH_MSG_DEBUG(" recorded SCT_RawData objects: size " << xaod->size()); diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.h b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.h index 5cb610854fb..4f4fd9d40d2 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" @@ -28,12 +28,12 @@ class SCT_RawDataToxAOD : public AthReentrantAlgorithm { public: SCT_RawDataToxAOD(const std::string& name, ISvcLocator* pSvcLocator); - StatusCode initialize(); - StatusCode execute(const EventContext& ctx) const; - StatusCode finalize(); + virtual StatusCode initialize(); + virtual StatusCode execute(const EventContext& ctx) const; + virtual StatusCode finalize(); 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"}; -- GitLab From 7bdc39884f122487a6769cfd1913698180e2ccd4 Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Sat, 30 Mar 2019 07:05:47 +0100 Subject: [PATCH 08/10] Cleanup for speed up Use universal initialization --- .../src/SCT_RawDataToxAOD.cxx | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx index e99343f3f01..9b4ab862a8d 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/SCT_RawDataToxAOD.cxx @@ -15,8 +15,8 @@ // xAOD container type #include "xAODTracking/SCTRawHitValidationAuxContainer.h" -SCT_RawDataToxAOD::SCT_RawDataToxAOD(const std::string &name, - ISvcLocator *pSvcLocator) +SCT_RawDataToxAOD::SCT_RawDataToxAOD(const std::string& name, + ISvcLocator* pSvcLocator) : AthReentrantAlgorithm(name, pSvcLocator) { } @@ -31,26 +31,25 @@ StatusCode SCT_RawDataToxAOD::initialize() { StatusCode SCT_RawDataToxAOD::execute(const EventContext& ctx) const { 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}; ATH_CHECK(xaod.record(std::make_unique(), std::make_unique())); - // Count RDO size and resize xAOD using it to avoid push_back. - unsigned nRDOs{0}; - for (const SCT_RDO_Collection* collection: *rdoContainer) { - nRDOs += collection->size(); - } - xaod->resize(nRDOs); + xaod->reserve(nRDOs); /// loop over input RDOs - nRDOs = 0; 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->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 @@ -59,8 +58,6 @@ StatusCode SCT_RawDataToxAOD::execute(const EventContext& ctx) const { xrdo->setPhi_module(m_SCTHelper->phi_module(id)); xrdo->setEta_module(m_SCTHelper->eta_module(id)); xrdo->setSide(m_SCTHelper->side(id)); - xaod->at(nRDOs) = xrdo; - nRDOs++; } } ATH_MSG_DEBUG(" recorded SCT_RawData objects: size " << xaod->size()); -- GitLab From 5f73a6e51bf2ecc502c9844cc553339cad98909c Mon Sep 17 00:00:00 2001 From: Susumu Oda Date: Sat, 30 Mar 2019 13:11:37 +0100 Subject: [PATCH 09/10] Add SCTRawHitValidation_v1 to selection.xml --- Event/xAOD/xAODTracking/xAODTracking/selection.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/Event/xAOD/xAODTracking/xAODTracking/selection.xml b/Event/xAOD/xAODTracking/xAODTracking/selection.xml index 4619fabaf1f..3010b2d4d6b 100644 --- a/Event/xAOD/xAODTracking/xAODTracking/selection.xml +++ b/Event/xAOD/xAODTracking/xAODTracking/selection.xml @@ -107,6 +107,7 @@ + Date: Sat, 30 Mar 2019 17:15:21 +0100 Subject: [PATCH 10/10] Update PixelPrepDataToxAOD --- .../src/PixelPrepDataToxAOD.cxx | 119 ++++++++++-------- .../src/PixelPrepDataToxAOD.h | 2 +- 2 files changed, 65 insertions(+), 56 deletions(-) diff --git a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.cxx b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.cxx index f643b692882..e1f30a647b4 100644 --- a/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.cxx +++ b/InnerDetector/InDetEventCnv/InDetPrepRawDataToxAOD/src/PixelPrepDataToxAOD.cxx @@ -126,11 +126,50 @@ StatusCode PixelPrepDataToxAOD::execute() ATH_MSG_ERROR("Failed to retrieve PixelClusterContainer with key" << PixelClusterContainer.key() ); return StatusCode::FAILURE; } + + const PRD_MultiTruthCollection* prdmtColl(nullptr); + if (m_useTruthInfo) { + SG::ReadHandle 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 6cb62f5e764..626e8af46bb 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; -- GitLab