Skip to content
Snippets Groups Projects
Commit 411bac90 authored by Adam Edward Barton's avatar Adam Edward Barton
Browse files

Merge branch 'digi/MM' into 'master'

Cleanup memory handling of MM_DigitizationTool

See merge request atlas/athena!38257
parents c2b77155 c85ea303
No related branches found
No related tags found
No related merge requests found
......@@ -34,6 +34,7 @@
In the execute() method...
*/
#include "PileUpTools/PileUpMergeSvc.h"
#include "PileUpTools/PileUpToolBase.h"
#include "GaudiKernel/AlgTool.h"
#include "GaudiKernel/ServiceHandle.h"
......@@ -60,6 +61,7 @@
#include "MagFieldElements/AtlasFieldCache.h"
#include "MM_Digitization/IMM_DigitizationTool.h"
#include <memory>
#include <string>
#include <sstream>
#include <vector>
......@@ -71,9 +73,7 @@ namespace MuonGM{
class MuonDetectorManager;
}
class PileUpMergeSvc;
class MicromegasHitIdHelper;
class StoreGateSvc;
class TTree;
class TFile;
......@@ -126,7 +126,10 @@ class MM_DigitizationTool : public PileUpToolBase {
SG::ReadCondHandleKey<AtlasFieldCacheCondObj> m_fieldCondObjInputKey {this, "AtlasFieldCacheCondObj", "fieldCondObj"};
Gaudi::Property<std::string> m_inputObjectName{this,"InputObjectName","MicromegasSensitiveDetector","name of the input objects"};
Gaudi::Property<bool> m_onlyUseContainerName{this, "OnlyUseContainerName", true, "Don't use the ReadHandleKey directly. Just extract the container name from it."};
SG::ReadHandleKey<MMSimHitCollection> m_hitsContainerKey{this, "InputObjectName", "MicromegasSensitiveDetector", "name of the input objects"};
std::string m_inputObjectName{""};
Gaudi::Property<std::string> m_vmmReadoutMode{this,"vmmReadoutMode","peak","For readout (DAQ) path. Can be peak or threshold"};
Gaudi::Property<std::string> m_vmmARTMode{this,"vmmARTMode","threshold","For ART (trigger) path. Can be peak or threshold"};
......@@ -162,20 +165,20 @@ class MM_DigitizationTool : public PileUpToolBase {
Gaudi::Property<float> m_stripdeadtime{this,"StripDeadTime",200,"dead-time for strip, default value 200 ns = 8 BCs"};
Gaudi::Property<float> m_ARTdeadtime{this,"ARTDeadTime",200,"dead-time for ART, default value 200 ns = 8 BCs"};
SG::WriteHandleKey<MmDigitContainer> m_outputDigitCollectionKey{this,"OutputObjectName","MM_DIGITS","WriteHandleKey for Output MmigitContainer"}; // name of the output digits
SG::WriteHandleKey<MuonSimDataCollection> m_outputSDO_CollectionKey{this,"OutputSDOName","MM_SDO","WriteHandleKey for Output MuonSimDataCollection"}; // name of the output SDOs
SG::WriteHandleKey<MmDigitContainer> m_outputDigitCollectionKey{this,"OutputObjectName","MM_DIGITS","WriteHandleKey for Output MmigitContainer"}; // name of the output digits
SG::WriteHandleKey<MuonSimDataCollection> m_outputSDO_CollectionKey{this,"OutputSDOName","MM_SDO","WriteHandleKey for Output MuonSimDataCollection"}; // name of the output SDOs
PileUpMergeSvc *m_mergeSvc; // Pile up service
ServiceHandle<PileUpMergeSvc> m_mergeSvc{this, "MergeSvc", "PileUpMergeSvc", "Merge service used in digitization"};
TFile *m_file;
TTree *m_ntuple;
TFile *m_file{};
TTree *m_ntuple{};
MicromegasHitIdHelper* m_muonHelper;
const MuonGM::MuonDetectorManager* m_MuonGeoMgr;
std::list<MMSimHitCollection*> m_MMHitCollList;
TimedHitCollection<MMSimHit>* m_timedHitCollection_MM; // the pileup hits
MM_StripsResponseSimulation* m_StripsResponseSimulation;
MM_ElectronicsResponseSimulation* m_ElectronicsResponseSimulation;
const MicromegasHitIdHelper* m_muonHelper{}; // not owned
const MuonGM::MuonDetectorManager* m_MuonGeoMgr{}; // not owned
std::list<std::unique_ptr<MMSimHitCollection>> m_MMHitCollList{};
std::unique_ptr<TimedHitCollection<MMSimHit>> m_timedHitCollection_MM{}; // the pileup hits
std::unique_ptr<MM_StripsResponseSimulation> m_StripsResponseSimulation{};
std::unique_ptr<MM_ElectronicsResponseSimulation> m_ElectronicsResponseSimulation{};
float m_driftVelocity;
int m_n_Station_side;
......
......@@ -47,9 +47,6 @@
#include "TrkEventPrimitives/LocalDirection.h"
#include "TrkSurfaces/Surface.h"
//Pile-up
#include "PileUpTools/PileUpMergeSvc.h"
//Truth
#include "CLHEP/Units/PhysicalConstants.h"
#include "GeneratorObjects/HepMcParticleLink.h"
......@@ -79,15 +76,6 @@ using namespace MuonGM;
/*******************************************************************************/
MM_DigitizationTool::MM_DigitizationTool(const std::string& type, const std::string& name, const IInterface* parent):
PileUpToolBase(type, name, parent),
m_mergeSvc(nullptr),
m_file(nullptr),
m_ntuple(nullptr),
m_muonHelper(nullptr),
m_MuonGeoMgr(nullptr),
m_MMHitCollList(),
m_timedHitCollection_MM(nullptr),
m_StripsResponseSimulation(nullptr),
m_ElectronicsResponseSimulation(nullptr),
m_driftVelocity(0),
// Tree Branches...
m_n_Station_side(-INT_MAX),
......@@ -126,10 +114,8 @@ StatusCode MM_DigitizationTool::initialize() {
ATH_MSG_DEBUG ("MM_DigitizationTool:: in initialize()") ;
// Initialize transient detector store and MuonGeoModel OR MuonDetDescrManager
StoreGateSvc* detStore=nullptr;
ATH_CHECK( serviceLocator()->service("DetectorStore", detStore) );
if(detStore->contains<MuonGM::MuonDetectorManager>( "Muon" )){
ATH_CHECK( detStore->retrieve(m_MuonGeoMgr) );
if(detStore()->contains<MuonGM::MuonDetectorManager>( "Muon" )){
ATH_CHECK( detStore()->retrieve(m_MuonGeoMgr) );
ATH_MSG_DEBUG ( "Retrieved MuonGeoModelDetectorManager from StoreGate" );
}
......@@ -138,24 +124,33 @@ StatusCode MM_DigitizationTool::initialize() {
// Digit tools
ATH_CHECK(m_digitTool.retrieve());
//initialize the output WriteHandleKeys
if(m_outputDigitCollectionKey.key()=="") {
ATH_MSG_FATAL("Property OutputObjectName not set !");
return StatusCode::FAILURE;
}
ATH_CHECK(m_outputDigitCollectionKey.initialize());
ATH_CHECK(m_outputSDO_CollectionKey.initialize());
ATH_MSG_DEBUG("Output Digits: '"<<m_outputDigitCollectionKey.key()<<"'");
if (m_hitsContainerKey.key().empty()) {
ATH_MSG_FATAL("Property InputObjectName not set !");
return StatusCode::FAILURE;
}
if (m_onlyUseContainerName) m_inputObjectName = m_hitsContainerKey.key();
ATH_MSG_DEBUG("Input objects in container: '" << m_inputObjectName << "'");
// Pile-up merge service
if (m_onlyUseContainerName) {
ATH_CHECK(m_mergeSvc.retrieve());
}
// Initialize ReadHandleKey
ATH_CHECK(m_hitsContainerKey.initialize(!m_onlyUseContainerName));
ATH_CHECK(m_fieldCondObjInputKey.initialize());
ATH_CHECK(m_calibrationTool.retrieve());
// Initialize the output WriteHandleKeys
ATH_CHECK(m_outputDigitCollectionKey.initialize());
ATH_CHECK(m_outputSDO_CollectionKey.initialize());
ATH_MSG_DEBUG("Output Digits: '"<<m_outputDigitCollectionKey.key()<<"'");
ATH_CHECK(m_fieldCondObjInputKey.initialize());
ATH_CHECK(m_calibrationTool.retrieve());
//simulation identifier helper
m_muonHelper = MicromegasHitIdHelper::GetHelper();
// Locate the PileUpMergeSvc and initialize our local ptr
ATH_CHECK(service("PileUpMergeSvc", m_mergeSvc, true));
// Validation File Output
if (m_writeOutputFile){
m_file = new TFile("MM_Digitization_plots.root","RECREATE");
......@@ -192,7 +187,7 @@ StatusCode MM_DigitizationTool::initialize() {
}
// StripsResponseSimulation Creation
m_StripsResponseSimulation = new MM_StripsResponseSimulation();
m_StripsResponseSimulation = std::make_unique<MM_StripsResponseSimulation>();
m_StripsResponseSimulation->setQThreshold(m_qThreshold);
m_StripsResponseSimulation->setDriftGapWidth(m_driftGapWidth);
m_StripsResponseSimulation->setCrossTalk1(m_crossTalk1);
......@@ -216,7 +211,7 @@ StatusCode MM_DigitizationTool::initialize() {
m_StripsResponseSimulation->initialize();
// ElectronicsResponseSimulation Creation
m_ElectronicsResponseSimulation = new MM_ElectronicsResponseSimulation();
m_ElectronicsResponseSimulation = std::make_unique<MM_ElectronicsResponseSimulation>();
m_ElectronicsResponseSimulation->setPeakTime(m_peakTime); // VMM peak time parameter
m_ElectronicsResponseSimulation->setTimeWindowLowerOffset(m_timeWindowLowerOffset);
m_ElectronicsResponseSimulation->setTimeWindowUpperOffset(m_timeWindowUpperOffset);
......@@ -281,8 +276,8 @@ StatusCode MM_DigitizationTool::prepareEvent(const EventContext& /*ctx*/, unsign
m_MMHitCollList.clear();
if(!m_timedHitCollection_MM) {
m_timedHitCollection_MM = new TimedHitCollection<MMSimHit>();
if (m_timedHitCollection_MM == nullptr) {
m_timedHitCollection_MM = std::make_unique<TimedHitCollection<MMSimHit>>();
} else {
ATH_MSG_ERROR ( "m_timedHitCollection_MM is not null" );
return StatusCode::FAILURE;
......@@ -315,19 +310,19 @@ StatusCode MM_DigitizationTool::processBunchXing(int bunchXing,
// Iterating over the list of collections
for( ; iColl != endColl; iColl++){
MMSimHitCollection *hitCollPtr = new MMSimHitCollection(*iColl->second);
auto hitCollPtr = std::make_unique<MMSimHitCollection>(*iColl->second);
PileUpTimeEventIndex timeIndex(iColl->first);
ATH_MSG_DEBUG("MMSimHitCollection found with " << hitCollPtr->size() <<
" hits");
ATH_MSG_VERBOSE("time index info. time: " << timeIndex.time()
<< " index: " << timeIndex.index()
<< " type: " << timeIndex.type());
m_timedHitCollection_MM->insert(timeIndex, hitCollPtr);
m_MMHitCollList.push_back(hitCollPtr);
m_timedHitCollection_MM->insert(timeIndex, hitCollPtr.get());
m_MMHitCollList.push_back(std::move(hitCollPtr));
}
return StatusCode::SUCCESS;
}
......@@ -340,10 +335,6 @@ StatusCode MM_DigitizationTool::getNextEvent() {
ATH_MSG_DEBUG ( "MM_DigitizationTool::getNextEvent()" );
if (!m_mergeSvc) {
ATH_CHECK(service("PileUpMergeSvc", m_mergeSvc, true));
}
// get the container(s)
typedef PileUpMergeSvc::TimedList<MMSimHitCollection>::type TimedHitCollList;
......@@ -360,8 +351,8 @@ StatusCode MM_DigitizationTool::getNextEvent() {
}
// create a new hits collection - Define Hit Collection
if(!m_timedHitCollection_MM) {
m_timedHitCollection_MM = new TimedHitCollection<MMSimHit>();
if (m_timedHitCollection_MM == nullptr) {
m_timedHitCollection_MM = std::make_unique<TimedHitCollection<MMSimHit>>();
}else{
ATH_MSG_ERROR ( "m_timedHitCollection_MM is not null" );
return StatusCode::FAILURE;
......@@ -388,19 +379,10 @@ StatusCode MM_DigitizationTool::mergeEvent(const EventContext& ctx) {
ATH_CHECK( doDigitization(ctx) );
// reset the pointer (delete null pointer should be safe)
if (m_timedHitCollection_MM){
delete m_timedHitCollection_MM;
m_timedHitCollection_MM = nullptr;
}
// reset the pointer
m_timedHitCollection_MM.reset();
// remove cloned one in processBunchXing......
std::list<MMSimHitCollection*>::iterator MMHitColl = m_MMHitCollList.begin();
std::list<MMSimHitCollection*>::iterator MMHitCollEnd = m_MMHitCollList.end();
while(MMHitColl!=MMHitCollEnd) {
delete (*MMHitColl);
++MMHitColl;
}
// clear cloned list
m_MMHitCollList.clear();
return StatusCode::SUCCESS;
}
......@@ -419,11 +401,8 @@ StatusCode MM_DigitizationTool::processAllSubEvents(const EventContext& ctx) {
ATH_CHECK( doDigitization(ctx) );
// reset the pointer (delete null pointer should be safe)
if (m_timedHitCollection_MM){
delete m_timedHitCollection_MM;
m_timedHitCollection_MM = nullptr;
}
// reset the pointer
m_timedHitCollection_MM.reset();
return StatusCode::SUCCESS;
}
/*******************************************************************************/
......@@ -437,10 +416,6 @@ StatusCode MM_DigitizationTool::finalize() {
m_file->Close();
}
delete m_StripsResponseSimulation;
delete m_ElectronicsResponseSimulation;
return StatusCode::SUCCESS;
}
/*******************************************************************************/
......@@ -469,7 +444,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
}
// Perform null check on m_thpcCSC
if(!m_timedHitCollection_MM) {
if (m_timedHitCollection_MM == nullptr) {
ATH_MSG_ERROR ( "m_timedHitCollection_MM is null" );
return StatusCode::FAILURE;
}
......@@ -1049,7 +1024,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
std::unique_ptr<MmDigit> newDigit = nullptr;
if ( !m_doSmearing ) {
newDigit = std::unique_ptr<MmDigit>(new MmDigit( stripDigitOutputAllHits.digitID(),
newDigit = std::make_unique<MmDigit>(stripDigitOutputAllHits.digitID(),
electronicsOutputForReadout->stripTime(),
electronicsOutputForReadout->stripPos(),
electronicsOutputForReadout->stripCharge(),
......@@ -1061,7 +1036,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
finalElectronicsTriggerOutput.chipCharge(),
finalElectronicsTriggerOutput.MMFEVMMid(),
finalElectronicsTriggerOutput.VMMid()
));
);
}
else {
......@@ -1091,7 +1066,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
}
if ( stripPosSmeared.size() > 0 ) {
newDigit = std::unique_ptr<MmDigit>(new MmDigit( digitId,
newDigit = std::make_unique<MmDigit>(digitId,
stripTimeSmeared,
stripPosSmeared,
stripChargeSmeared,
......@@ -1103,7 +1078,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
finalElectronicsTriggerOutput.chipCharge(),
finalElectronicsTriggerOutput.MMFEVMMid(),
finalElectronicsTriggerOutput.VMMid()
));
);
}
else {
continue;
......@@ -1126,7 +1101,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
// put new collection in storegate
// Get the messaging service, print where you are
const MmDigitCollection* coll = digitContainer->indexFindPtr(moduleHash );
if (nullptr == coll) {
if (coll == nullptr) {
digitCollection = new MmDigitCollection( elemId, moduleHash );
digitCollection->push_back(std::move(newDigit));
ATH_CHECK(digitContainer->addCollection(digitCollection, moduleHash ) );
......@@ -1149,10 +1124,7 @@ StatusCode MM_DigitizationTool::doDigitization(const EventContext& ctx) {
ATH_MSG_DEBUG ( "MM_Digitization Done!" );
if (m_timedHitCollection_MM){
delete m_timedHitCollection_MM;
m_timedHitCollection_MM = nullptr;
}
m_timedHitCollection_MM.reset();
return StatusCode::SUCCESS;
}
......
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