Skip to content
Snippets Groups Projects
Commit d145b01b authored by Christos Anastopoulos's avatar Christos Anastopoulos Committed by Julien Maurer
Browse files

Use DataPool for TRT_DriftCircle (offline version)

Use DataPool for TRT_DriftCircle (offline version)
parent 99c7f560
2 merge requests!641822023-07-06: Daily sweep of 23.0 into main,!64155ATLASRECTS-6783 Use DataPool for TRT_DriftCircle (offline version)
......@@ -77,8 +77,6 @@ namespace InDet {
///////////////////////////////////////////////////////////////////
StatusCode TRT_RIO_Maker::execute(const EventContext& ctx) const {
// TRT_DriftCircle container registration
SG::WriteHandle<InDet::TRT_DriftCircleContainer> rioContainer(m_rioContainerKey, ctx);
if(m_rioContainerCacheKey.key().empty()){
rioContainer = std::make_unique<InDet::TRT_DriftCircleContainer>(m_pTRTHelper->straw_layer_hash_max(),EventContainers::Mode::OfflineFast);
......@@ -90,19 +88,30 @@ namespace InDet {
ATH_CHECK(rioContainer.isValid());
ATH_MSG_DEBUG( "Container "<< rioContainer.name() << " initialised" );
SG::ReadHandle<TRT_RDO_Container> rdoContainer(m_rdoContainerKey, ctx);
ATH_CHECK(rdoContainer.isValid());
ATH_CHECK(rdoContainer.isValid());
const bool hasExternalCache = rdoContainer->hasExternalCache();
std::unique_ptr<DataPool<TRT_DriftCircle>> dataItemsPool = nullptr;
if (!hasExternalCache) {
dataItemsPool = std::make_unique<DataPool<TRT_DriftCircle>>(ctx);
dataItemsPool->reserve(100000); // Some large default size
}
// Get TRT_RDO and produce TRT_RIO collections
if (!m_roiSeeded) {//Full-scan mode
for(const auto *const rdoCollections : *rdoContainer) {
const InDetRawDataCollection<TRT_RDORawData>* currentCollection(rdoCollections);
InDet::TRT_DriftCircleContainer::IDC_WriteHandle lock = rioContainer->getWriteHandle(currentCollection->identifyHash());
if( lock.OnlineAndPresentInAnotherView() ) continue;
std::unique_ptr<TRT_DriftCircleCollection> p_rio(m_driftcircle_tool->convert(m_mode_rio_production,
currentCollection, ctx, m_trtBadChannels));
if(p_rio && !p_rio->empty()) {
ATH_CHECK(lock.addOrDelete(std::move(p_rio)));
if (lock.OnlineAndPresentInAnotherView()) {
continue;
}
std::unique_ptr<TRT_DriftCircleCollection> p_rio(
m_driftcircle_tool->convert(m_mode_rio_production,
currentCollection, ctx, dataItemsPool.get(),
m_trtBadChannels));
if (p_rio && !p_rio->empty()) {
ATH_CHECK(lock.addOrDelete(std::move(p_rio)));
}
}
}else{
......@@ -122,18 +131,21 @@ namespace InDet {
const InDetRawDataCollection<TRT_RDORawData>* RDO_Collection (rdoContainer->indexFindPtr(id));
if (!RDO_Collection) continue;
InDet::TRT_DriftCircleContainer::IDC_WriteHandle lock = rioContainer->getWriteHandle(id);
if( lock.OnlineAndPresentInAnotherView() ) continue;
if( lock.OnlineAndPresentInAnotherView() ) {
continue;
}
// Use one of the specific clustering AlgTools to make clusters
std::unique_ptr<TRT_DriftCircleCollection> p_rio(m_driftcircle_tool->convert(m_mode_rio_production,
RDO_Collection , ctx, m_trtBadChannels));
if (p_rio && !p_rio->empty()){
std::unique_ptr<TRT_DriftCircleCollection> p_rio(
m_driftcircle_tool->convert(m_mode_rio_production,
RDO_Collection, ctx, dataItemsPool.get(),
m_trtBadChannels));
if (p_rio && !p_rio->empty()) {
#ifndef NDEBUG
ATH_MSG_VERBOSE( "REGTEST: TRT : DriftCircleCollection contains "
<< p_rio->size() << " clusters" );
#endif
ATH_CHECK(lock.addOrDelete(std::move(p_rio)));
}
}
}
......
......@@ -21,6 +21,7 @@
#include "InDetRawData/TRT_RDORawData.h"
#include "TrkPrepRawData/PrepRawDataCLASS_DEF.h"
#include "AthAllocators/DataPool.h"
namespace InDet {
......@@ -43,7 +44,12 @@ namespace InDet {
static const InterfaceID& interfaceID( ) { return IID_ITRT_DriftCircleTool; };
/** Interface method */
virtual InDet::TRT_DriftCircleCollection* convert(int,const InDetRawDataCollection<TRT_RDORawData>*, const EventContext& ctx, const bool CTBBadChannels) const = 0;
virtual InDet::TRT_DriftCircleCollection* convert(
int,
const InDetRawDataCollection<TRT_RDORawData>*,
const EventContext& ctx,
DataPool<TRT_DriftCircle>* dataItemsPool,
const bool CTBBadChannels) const = 0;
/** test validity gate for corrected drift times */
virtual bool passValidityGate(unsigned int word, float lowGate, float highGate, float t0) const =0;
......
......@@ -42,7 +42,7 @@ namespace InDet {
Class for converting a RDO collection to a DriftCircle collection
Performs trigger phase corrections in case of CTB data
*/
class TRT_DriftCircleTool: public AthAlgTool, virtual public ITRT_DriftCircleTool
class TRT_DriftCircleTool final: public AthAlgTool, virtual public ITRT_DriftCircleTool
{
///////////////////////////////////////////////////////////////////
......@@ -55,14 +55,18 @@ public:
/** destructor */
virtual ~TRT_DriftCircleTool ();
/** initialize needed services */
virtual StatusCode initialize();
virtual StatusCode initialize() override;
/** finalize */
virtual StatusCode finalize ();
virtual StatusCode finalize () override;
/** make the conversion from RDOs to DriftCircles */
virtual InDet::TRT_DriftCircleCollection*
convert(int,const InDetRawDataCollection<TRT_RDORawData>*, const EventContext& ctx, const bool CTBBadChannels) const;
convert(int,
const InDetRawDataCollection<TRT_RDORawData>*,
const EventContext& ctx,
DataPool<TRT_DriftCircle>* dataItemsPool,
const bool CTBBadChannels) const override;
/** test validity gate for corrected drift times */
virtual bool passValidityGate(unsigned int word, float lowGate, float highGate, float t0) const;
virtual bool passValidityGate(unsigned int word, float lowGate, float highGate, float t0) const override;
///////////////////////////////////////////////////////////////////
// Private methods:
......
......@@ -58,7 +58,9 @@ public:
virtual StatusCode finalize ();
/** make the conversion from RDOs to DriftCircles */
virtual InDet::TRT_DriftCircleCollection*
convert(int,const InDetRawDataCollection<TRT_RDORawData>*, const EventContext& ctx, const bool CTBBadChannels) const;
convert(int,const InDetRawDataCollection<TRT_RDORawData>*, const EventContext& ctx,
DataPool<TRT_DriftCircle>* dataItemsPool,
const bool CTBBadChannels) const;
virtual bool passValidityGate(unsigned int word, float lowGate, float highGate, float t0) const;
///////////////////////////////////////////////////////////////////
......
......@@ -171,6 +171,7 @@ InDet::TRT_DriftCircleTool::convert(
int Mode,
const InDetRawDataCollection<TRT_RDORawData>* rdo,
const EventContext& ctx,
DataPool<TRT_DriftCircle>* dataItemsPool,
const bool getTRTBadChannel) const
{
......@@ -203,6 +204,10 @@ InDet::TRT_DriftCircleTool::convert(
rio = new InDet::TRT_DriftCircleCollection(IHc);
rio->setIdentifier(rdo->identify());
rio->reserve( std::distance(rb, re) );
//DataPool will own them if there.
if (dataItemsPool) {
rio->clear(SG::VIEW_ELEMENTS);
}
bool isArgonStraw = false;
bool isGasSet = false;
......@@ -303,8 +308,16 @@ InDet::TRT_DriftCircleTool::convert(
auto errmat = Amg::MatrixX(1,1);
errmat(0,0) = error*error;
Amg::Vector2D loc(radius, 0.);
InDet::TRT_DriftCircle* tdc =
new InDet::TRT_DriftCircle(id, loc, std::move(errmat), pE, word);
InDet::TRT_DriftCircle* tdc = nullptr;
//
if (dataItemsPool) {
tdc = dataItemsPool->nextElementPtr();
(*tdc) = InDet::TRT_DriftCircle(id, loc, std::move(errmat), pE, word);
} else {
tdc = new InDet::TRT_DriftCircle(id, loc, std::move(errmat), pE, word);
}
//
if (tdc) {
tdc->setHashAndIndex(rio->identifyHash(), rio->size());
rio->push_back(tdc);
......
......@@ -170,7 +170,11 @@ StatusCode InDet::TRT_DriftCircleToolCosmics::finalize()
// Trk::TRT_DriftCircles collection production
///////////////////////////////////////////////////////////////////
InDet::TRT_DriftCircleCollection* InDet::TRT_DriftCircleToolCosmics::convert(int Mode,const InDetRawDataCollection<TRT_RDORawData>* rdo, const EventContext& ctx, const bool /* _getTRTBadChannel */) const
InDet::TRT_DriftCircleCollection* InDet::TRT_DriftCircleToolCosmics::convert(int Mode,
const InDetRawDataCollection<TRT_RDORawData>* rdo,
const EventContext& ctx,
DataPool<TRT_DriftCircle>* /*dataItemsPool*/,
const bool /* _getTRTBadChannel */) const
{
//Initialise a new TRT_DriftCircleCollection
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment