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"};