From 34f1bfa0370831c4b8ac1b6091de7522be8d8b88 Mon Sep 17 00:00:00 2001 From: cussonno Date: Fri, 22 Jul 2005 07:59:56 +0000 Subject: [PATCH] memory leak fixed in track reconstruction and obsolete code removed --- MUON/AliMUONData.cxx | 4 +- MUON/AliMUONEventReconstructor.cxx | 61 ++---------------------------- MUON/AliMUONEventReconstructor.h | 16 -------- MUON/AliMUONTrack.cxx | 16 +++++--- 4 files changed, 15 insertions(+), 82 deletions(-) diff --git a/MUON/AliMUONData.cxx b/MUON/AliMUONData.cxx index c44cab5fd4b..9bd25ad0957 100644 --- a/MUON/AliMUONData.cxx +++ b/MUON/AliMUONData.cxx @@ -845,14 +845,14 @@ void AliMUONData::ResetRecTracks() { // Reset tracks information fNrectracks = 0; - if (fRecTracks) fRecTracks->Clear(); + if (fRecTracks) fRecTracks->Delete(); // necessary to delete in case of memory allocation } //____________________________________________________________________________ void AliMUONData::ResetRecTriggerTracks() { // Reset tracks information fNrectriggertracks = 0; - if (fRecTriggerTracks) fRecTriggerTracks->Clear(); + if (fRecTriggerTracks) fRecTriggerTracks->Delete(); // necessary to delete in case of memory allocation } //_____________________________________________________________________________ void AliMUONData::SetTreeAddress(Option_t* option) diff --git a/MUON/AliMUONEventReconstructor.cxx b/MUON/AliMUONEventReconstructor.cxx index b94f13ffda6..a3eeafce737 100644 --- a/MUON/AliMUONEventReconstructor.cxx +++ b/MUON/AliMUONEventReconstructor.cxx @@ -47,7 +47,6 @@ #include "AliMUONRawCluster.h" #include "AliMUONLocalTrigger.h" #include "AliMUONGlobalTrigger.h" -#include "AliMUONRecoEvent.h" #include "AliMUONSegment.h" #include "AliMUONTrack.h" #include "AliMUONTrackHit.h" @@ -103,9 +102,6 @@ AliMUONEventReconstructor::AliMUONEventReconstructor(AliLoader* loader) // Is 10 the right size ???? fRecTracksPtr = new TClonesArray("AliMUONTrack", 10); fNRecTracks = 0; // really needed or GetEntriesFast sufficient ???? -// trigger tracks - fRecTriggerTracksPtr = new TClonesArray("AliMUONTriggerTrack", 10); - fNRecTriggerTracks = 0; // really needed or GetEntriesFast sufficient ???? // Memory allocation for the TClonesArray of hits on reconstructed tracks // Is 100 the right size ???? //AZ fRecTrackHitsPtr = new TClonesArray("AliMUONTrack", 100); @@ -133,12 +129,7 @@ AliMUONEventReconstructor::AliMUONEventReconstructor(AliLoader* loader) fBkgTrackRefParticles = 0; fBkgTrackRefTTR = 0; fBkgTrackRefEventNumber = -1; - - // Initialize to 0 pointers to RecoEvent, tree and tree file - fRecoEvent = 0; - fEventTree = 0; - fTreeFile = 0; - + // initialize loader's fLoader = loader; @@ -172,12 +163,6 @@ AliMUONEventReconstructor::operator=(const AliMUONEventReconstructor& rhs) AliMUONEventReconstructor::~AliMUONEventReconstructor(void) { // Destructor for class AliMUONEventReconstructor - if (fTreeFile) { - fTreeFile->Close(); - delete fTreeFile; - } -// if (fEventTree) delete fEventTree; - if (fRecoEvent) delete fRecoEvent; delete fHitsForRecPtr; // Correct destruction of everything ???? or delete [] ???? for (Int_t st = 0; st < AliMUONConstants::NTrackingCh()/2; st++) delete fSegmentsPtr[st]; // Correct destruction of everything ???? @@ -424,16 +409,6 @@ void AliMUONEventReconstructor::ResetTracks(void) return; } - //__________________________________________________________________________ -void AliMUONEventReconstructor::ResetTriggerTracks(void) -{ - // To reset the TClonesArray of reconstructed trigger tracks - if (fRecTriggerTracksPtr) fRecTriggerTracksPtr->Delete(); - // Delete in order that the Track destructors are called, - // hence the space for the TClonesArray of pointers to TrackHit's is freed - fNRecTriggerTracks = 0; - return; -} //__________________________________________________________________________ void AliMUONEventReconstructor::ResetTrackHits(void) @@ -961,7 +936,6 @@ void AliMUONEventReconstructor::ValidateTracksWithTrigger(void) AliMUONTrack *track; TClonesArray *recTriggerTracks; - fMUONData->ResetRecTriggerTracks(); fMUONData->SetTreeAddress("RL"); fMUONData->GetRecTriggerTracks(); recTriggerTracks = fMUONData->RecTriggerTracks(); @@ -979,7 +953,6 @@ Bool_t AliMUONEventReconstructor::MakeTriggerTracks(void) { // To make the trigger tracks from Local Trigger AliDebug(1, "Enter MakeTriggerTracks"); - // ResetTriggerTracks(); Int_t nTRentries; Long_t gloTrigPat; @@ -1051,9 +1024,11 @@ Bool_t AliMUONEventReconstructor::MakeTriggerTracks(void) Float_t thetay = TMath::ATan2( (y21-y11) , (z21-z11) ); recTriggerTrack = new AliMUONTriggerTrack(x11,y11,thetax,thetay,gloTrigPat); + // since static statement does not work, set gloTrigPat for each track fMUONData->AddRecTriggerTrack(*recTriggerTrack); + delete recTriggerTrack; } // end of loop on Local Trigger return kTRUE; } @@ -1617,36 +1592,6 @@ void AliMUONEventReconstructor::EventDumpTrigger(void) } } -//__________________________________________________________________________ -void AliMUONEventReconstructor::FillEvent() -{ -// Create a new AliMUONRecoEvent, fill its track list, then add it as a -// leaf in the Event branch of TreeRecoEvent tree - cout << "Enter FillEvent() ...\n"; - - if (!fRecoEvent) { - fRecoEvent = new AliMUONRecoEvent(); - } else { - fRecoEvent->Clear(); - } - //save current directory - TDirectory *current = gDirectory; - if (!fTreeFile) fTreeFile = new TFile("tree_reco.root", "RECREATE"); - if (!fEventTree) fEventTree = new TTree("TreeRecoEvent", "MUON reconstructed events"); - //AZif (fRecoEvent->MakeDumpTracks(fRecTracksPtr)) { - if (fRecoEvent->MakeDumpTracks(fMuons, fRecTracksPtr, this)) { //AZ - if (AliLog::GetGlobalDebugLevel() > 1) fRecoEvent->EventInfo(); - TBranch *branch = fEventTree->GetBranch("Event"); - if (!branch) branch = fEventTree->Branch("Event", "AliMUONRecoEvent", &fRecoEvent, 64000); - branch->SetAutoDelete(); - fTreeFile->cd(); - fEventTree->Fill(); - fTreeFile->Write(); - } - // restore directory - current->cd(); -} - //__________________________________________________________________________ void AliMUONEventReconstructor::MakeTrackCandidatesK(void) { diff --git a/MUON/AliMUONEventReconstructor.h b/MUON/AliMUONEventReconstructor.h index 5ba9a30e27d..90ef83b53a3 100644 --- a/MUON/AliMUONEventReconstructor.h +++ b/MUON/AliMUONEventReconstructor.h @@ -18,7 +18,6 @@ class AliMUONSegment; class TClonesArray; class TFile; class TTree; -class AliMUONRecoEvent; class AliMUONData; class AliRunLoader; class AliLoader; @@ -71,11 +70,6 @@ class AliMUONEventReconstructor : public TObject { void SetNRecTracks(Int_t NRecTracks) {fNRecTracks = NRecTracks;} TClonesArray* GetRecTracksPtr(void) const {return fRecTracksPtr;} // Array - // Reconstructed trigger tracks - Int_t GetNRecTriggerTracks() const {return fNRecTriggerTracks;} // Number - void SetNRecTriggerTracks(Int_t NRecTriggerTracks) {fNRecTriggerTracks = NRecTriggerTracks;} - TClonesArray* GetRecTriggerTracksPtr(void) const {return fRecTriggerTracksPtr;} // Array - // Hits on reconstructed tracks Int_t GetNRecTrackHits() const {return fNRecTrackHits;} // Number void SetNRecTrackHits(Int_t NRecTrackHits) {fNRecTrackHits = NRecTrackHits;} @@ -172,19 +166,10 @@ class AliMUONEventReconstructor : public TObject { TClonesArray *fRecTracksPtr; // pointer to array of reconstructed tracks Int_t fNRecTracks; // number of reconstructed tracks - // Reconstructed trigger tracks - TClonesArray *fRecTriggerTracksPtr; // pointer to array of reconstructed trigger tracks - Int_t fNRecTriggerTracks; // number of reconstructed trigger tracks - // Track hits on reconstructed tracks TClonesArray *fRecTrackHitsPtr; // pointer to array of hits on reconstructed tracks Int_t fNRecTrackHits; // number of hits on reconstructed tracks - // Objects needed for tree writing - AliMUONRecoEvent *fRecoEvent; // the reconstructed event - TTree *fEventTree; // tree of reconstructed events - TFile *fTreeFile; // file where the tree is outputed - // data container AliMUONData* fMUONData; // Data container for MUON subsystem @@ -209,7 +194,6 @@ class AliMUONEventReconstructor : public TObject { Bool_t MakeTriggerTracks(void); void ResetTrackHits(void); void ResetTracks(void); - void ResetTriggerTracks(void); Int_t MakeTrackCandidatesWithTwoSegments(AliMUONSegment *BegSegment); Int_t MakeTrackCandidatesWithOneSegmentAndOnePoint(AliMUONSegment *BegSegment); void MakeTrackCandidates(void); diff --git a/MUON/AliMUONTrack.cxx b/MUON/AliMUONTrack.cxx index d490e535125..bed3e822d19 100644 --- a/MUON/AliMUONTrack.cxx +++ b/MUON/AliMUONTrack.cxx @@ -33,6 +33,8 @@ #include #include +#include "AliLog.h" + #include "AliMUONEventReconstructor.h" #include "AliMUONHitForRec.h" #include "AliMUONSegment.h" @@ -123,21 +125,19 @@ AliMUONTrack::~AliMUONTrack() { // Destructor if (fTrackHitsPtr) { - fTrackHitsPtr->Clear(); - delete fTrackHitsPtr; // delete the TObjArray of pointers to TrackHit's + // delete the TObjArray of pointers to TrackHit's + delete fTrackHitsPtr; fTrackHitsPtr = NULL; } if (fTrackParamAtHit) { // delete the TClonesArray of pointers to TrackParam - fTrackParamAtHit->Clear(); delete fTrackParamAtHit; fTrackParamAtHit = NULL; } if (fHitForRecAtHit) { // delete the TClonesArray of pointers to HitForRec - fHitForRecAtHit->Clear(); delete fHitForRecAtHit; fHitForRecAtHit = NULL; } @@ -160,6 +160,7 @@ AliMUONTrack::AliMUONTrack (const AliMUONTrack& theMUONTrack) AliMUONTrackHit *trackHit = new AliMUONTrackHit(*(AliMUONTrackHit*)(theMUONTrack.fTrackHitsPtr)->At(index)); fTrackHitsPtr->Add(trackHit); } + fTrackHitsPtr->SetOwner(); // nedeed for deleting TClonesArray // necessary to make a copy of the objects and not only the pointers in TClonesArray. fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10); @@ -196,8 +197,9 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack) // base class assignement TObject::operator=(theMUONTrack); - // fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor); // is it right ? - // is it right ? NO because it would use dummy copy constructor + // fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor); + // is it right ? + // is it right ? NO because it would use dummy copy constructor fEventReconstructor = theMUONTrack.fEventReconstructor; fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex; @@ -207,6 +209,7 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack) AliMUONTrackHit *trackHit = new AliMUONTrackHit(*(AliMUONTrackHit*)(theMUONTrack.fTrackHitsPtr)->At(index)); fTrackHitsPtr->Add(trackHit); } + fTrackHitsPtr->SetOwner(); // nedeed for deleting TClonesArray // necessary to make a copy of the objects and not only the pointers in TClonesArray. fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10); @@ -545,6 +548,7 @@ void AliMUONTrack::AddHitForRec(AliMUONHitForRec* HitForRec) new ((*recTrackHitsPtr)[eventTrackHits]) AliMUONTrackHit(HitForRec); this->fEventReconstructor->SetNRecTrackHits(eventTrackHits + 1); // track + if (fTrackHitsPtr->IsOwner()) AliFatal("fTrackHitsPtr is owner"); fTrackHitsPtr->Add(trackHit); fNTrackHits++; } -- 2.43.0