Skip to content
Snippets Groups Projects
Commit 02489305 authored by Frank Winklmeier's avatar Frank Winklmeier
Browse files

Merge branch 'cherry-pick-f361798839a-master' into 'master'

Sweeping !39060 from 21.9 to master.
Fix memory leak in mm digi

See merge request atlas/athena!39134
parents 6611852f 71c12ee2
No related branches found
No related tags found
No related merge requests found
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#ifndef MM_DIGITIZATION_MM_IONIZATIONCLUSTER_H
......@@ -63,17 +63,16 @@ class MM_IonizationCluster {
MM_IonizationCluster ();
MM_IonizationCluster (float HitX, float IonizationX, float IonizationY);
MM_IonizationCluster (const MM_IonizationCluster& MM_IonizationCluster);
void createElectrons(TRandom3* rndm);
void propagateElectrons(float lorentzAngle, float driftVel);
std::vector<MM_Electron*> getElectrons() const;
std::vector<std::unique_ptr<MM_Electron>>& getElectrons();
float getHitX() const { return m_HitX; }
TVector2 getIonizationStart() const { return m_IonizationStart; }
private:
// Members supplied by user
std::vector<MM_Electron*> m_Electrons;
std::vector<std::unique_ptr<MM_Electron>> m_Electrons;
float m_HitX;
TVector2 m_IonizationStart;
......
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#ifndef MM_DIGITIZATION_MM_STRIPRESPONSE_H
......@@ -22,7 +22,7 @@ class MM_StripResponse {
public:
MM_StripResponse();
MM_StripResponse(std::vector<MM_IonizationCluster> IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID);
MM_StripResponse(std::vector<std::unique_ptr<MM_IonizationCluster>>& IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID);
void timeOrderElectrons();
void calculateTimeSeries(float thetaD, int gasgap);
// void calculateTimeSeries();
......@@ -41,7 +41,7 @@ class MM_StripResponse {
int getNElectrons();
float getTotalCharge();
std::vector<MM_Electron*> getElectrons();
std::vector<std::unique_ptr<MM_Electron>>& getElectrons();
private:
......@@ -51,7 +51,7 @@ class MM_StripResponse {
int m_minstripID;
int m_maxstripID;
std::vector<MM_Electron*> m_Electrons;
std::vector<std::unique_ptr<MM_Electron>> m_Electrons;
// First argument is time bin, second argument is strip ID
std::map< int, std::map<int,float> > m_stripCharges;
......
......@@ -166,7 +166,7 @@ private:
MM_StripsResponseSimulation & operator=(const MM_StripsResponseSimulation &right);
MM_StripsResponseSimulation(const MM_StripsResponseSimulation&);
std::vector<MM_IonizationCluster> m_IonizationClusters;
std::vector<std::unique_ptr<MM_IonizationCluster>> m_IonizationClusters;
std::map<TString, TH1F* > m_mapOfHistograms;
std::map<TString, TH2F* > m_mapOf2DHistograms;
......
......@@ -10,13 +10,6 @@ MM_IonizationCluster::MM_IonizationCluster () {}
MM_IonizationCluster::MM_IonizationCluster (float HitX, float IonizationX, float IonizationY) : m_HitX(HitX), m_IonizationStart(IonizationX, IonizationY) {}
MM_IonizationCluster::MM_IonizationCluster (const MM_IonizationCluster& MM_IonizationCluster) {
m_HitX = MM_IonizationCluster.getHitX();
m_IonizationStart = MM_IonizationCluster.getIonizationStart();
m_Electrons = MM_IonizationCluster.getElectrons();
}
void MM_IonizationCluster::createElectrons(TRandom3* rndm) {
......@@ -24,7 +17,7 @@ void MM_IonizationCluster::createElectrons(TRandom3* rndm) {
int Nelectron = MM_IonizationCluster::s_NelectronProb.FindBin(MM_IonizationCluster::s_NelectronProb.GetRandom());
m_Electrons.reserve(Nelectron);
for (int iElectron = 0; iElectron<Nelectron; iElectron++)
m_Electrons.push_back(new MM_Electron(m_IonizationStart.X()+m_HitX, m_IonizationStart.Y()));
m_Electrons.push_back(std::make_unique<MM_Electron>(m_IonizationStart.X()+m_HitX, m_IonizationStart.Y()));
}
void MM_IonizationCluster::propagateElectrons(float lorentzAngle, float driftVel) {
......@@ -35,4 +28,4 @@ void MM_IonizationCluster::propagateElectrons(float lorentzAngle, float driftVel
}
// accessors
std::vector<MM_Electron*> MM_IonizationCluster::getElectrons() const { return m_Electrons; }
std::vector<std::unique_ptr<MM_Electron>>& MM_IonizationCluster::getElectrons() { return m_Electrons; }
......@@ -6,11 +6,11 @@
MM_StripResponse::MM_StripResponse() {}
MM_StripResponse::MM_StripResponse(std::vector<MM_IonizationCluster> IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID) : m_timeResolution(timeResolution), m_stripPitch(stripPitch), m_stripID(stripID), m_minstripID(minstripID), m_maxstripID(maxstripID) {
MM_StripResponse::MM_StripResponse(std::vector<std::unique_ptr<MM_IonizationCluster>>& IonizationClusters, float timeResolution, float stripPitch, int stripID, int minstripID, int maxstripID) : m_timeResolution(timeResolution), m_stripPitch(stripPitch), m_stripID(stripID), m_minstripID(minstripID), m_maxstripID(maxstripID) {
for (auto& IonizationCluster : IonizationClusters)
for (auto& Electron : IonizationCluster.getElectrons())
m_Electrons.push_back(Electron);
for (auto& Electron : IonizationCluster->getElectrons())
m_Electrons.push_back(std::move(Electron));
}
......@@ -20,19 +20,19 @@ int MM_StripResponse::getNElectrons(){
float MM_StripResponse::getTotalCharge(){
float qtot = 0;
for(const MM_Electron* electron : m_Electrons) {
for(const std::unique_ptr<MM_Electron>& electron : m_Electrons) {
qtot += electron->getCharge();
}
return qtot;
}
std::vector<MM_Electron*> MM_StripResponse::getElectrons(){
std::vector<std::unique_ptr<MM_Electron>>& MM_StripResponse::getElectrons(){
return m_Electrons;
}
void MM_StripResponse::timeOrderElectrons() {
std::sort(m_Electrons.begin(), m_Electrons.end(), [](const MM_Electron* a, const MM_Electron* b) -> bool { return a->getTime() < b->getTime(); });
std::sort(m_Electrons.begin(), m_Electrons.end(), [](const std::unique_ptr<MM_Electron>& a, const std::unique_ptr<MM_Electron>& b) -> bool { return a->getTime() < b->getTime(); });
}
......
......@@ -220,10 +220,10 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
while (pathLengthTraveled < pathLength){
// N.B. Needs correction from alpha angle still...
MM_IonizationCluster IonizationCluster(hitx, pathLengthTraveled*sin(theta), pathLengthTraveled*cos(theta));
IonizationCluster.createElectrons(m_random);
std::unique_ptr<MM_IonizationCluster> IonizationCluster = std::make_unique<MM_IonizationCluster>(hitx, pathLengthTraveled*sin(theta), pathLengthTraveled*cos(theta));
IonizationCluster -> createElectrons(m_random);
TVector2 initialPosition = IonizationCluster.getIonizationStart();
TVector2 initialPosition = IonizationCluster->getIonizationStart();
ATH_MSG_DEBUG("New interaction starting at x,y, pathLengthTraveled: "
<< initialPosition.X()
......@@ -233,16 +233,16 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
<< pathLengthTraveled
);
for (auto& Electron : IonizationCluster.getElectrons()) {
for (auto& Electron : IonizationCluster->getElectrons()) {
Electron->setOffsetPosition(getTransverseDiffusion(initialPosition.Y()) , getLongitudinalDiffusion(initialPosition.Y()) );
}
IonizationCluster.propagateElectrons( lorentzAngle , m_driftVelocity );
IonizationCluster->propagateElectrons( lorentzAngle , m_driftVelocity );
int tmpEffectiveNElectrons = 0;
for (auto& Electron : IonizationCluster.getElectrons()){
for (auto& Electron : IonizationCluster->getElectrons()){
//float effectiveCharge = m_polyaFunction->GetRandom();
float effectiveCharge = getEffectiveCharge();
......@@ -264,7 +264,7 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
if(m_writeOutputFile) m_mapOfHistograms["effectiveNElectrons"]->Fill( tmpEffectiveNElectrons / m_avalancheGain);
//---
m_IonizationClusters.push_back(IonizationCluster);
m_IonizationClusters.push_back(std::move(IonizationCluster));
pathLengthTraveled += getPathLengthTraveled();
......@@ -310,15 +310,16 @@ void MM_StripsResponseSimulation::whichStrips( const float & hitx,
if(m_outputFile) m_outputFile->cd();
TGraph grIonizationXZ( m_IonizationClusters.size() );
for (int iIonization=0; iIonization < (int) m_IonizationClusters.size(); iIonization++) {
TVector2 ionizationPosition( m_IonizationClusters.at(iIonization).getIonizationStart() );
TVector2 ionizationPosition( m_IonizationClusters.at(iIonization)->getIonizationStart() );
grIonizationXZ.SetPoint( iIonization, ionizationPosition.X(), ionizationPosition.Y() );
}
grIonizationXZ.Write("ionizationXZ");
TGraph grElectronsXZ( stripResponseObject.getNElectrons() );
std::vector<MM_Electron*> tmpElectrons = stripResponseObject.getElectrons();
for (int iElectron=0; iElectron < (int) tmpElectrons.size(); iElectron++){
grElectronsXZ.SetPoint( iElectron, tmpElectrons.at(iElectron)->getX(), tmpElectrons.at(iElectron)->getY() );
int iElectron = 0;
for (const auto & electron: stripResponseObject.getElectrons()){
grElectronsXZ.SetPoint( iElectron, electron->getX(), electron->getY() );
iElectron++;
}
grElectronsXZ.Write("electronsXZ");
}
......
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