Correct leak in AliCaloCalibPedestal
authorgconesab <gconesab@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 3 Sep 2010 17:08:56 +0000 (17:08 +0000)
committergconesab <gconesab@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 3 Sep 2010 17:08:56 +0000 (17:08 +0000)
EMCAL/AliCaloCalibPedestal.cxx
EMCAL/AliCaloCalibPedestal.h
EMCAL/AliEMCALClusterizer.cxx
EMCAL/AliEMCALReconstructor.cxx

index f1a215c..1188312 100644 (file)
@@ -127,7 +127,17 @@ AliCaloCalibPedestal::AliCaloCalibPedestal(kDetType detectorType) :
     fRowMultiplier = 1;
   } 
   fDetType = detectorType;
+
+  // ValidateProfiles(); // not to be done in ctor; info from Axel N. 
+}
+
+//_____________________________________________________________________
+void AliCaloCalibPedestal::ValidateProfiles()
+{
+  //Make sure the basic histos exist
+  if (!fPedestalLowGain.IsEmpty()) return; //The profiles already exist. We just check one, because they're all created at
+  //the same time
+
   //Then, loop for the requested number of modules
   TString title, name;
   for (int i = 0; i < fModules; i++) {
@@ -200,7 +210,13 @@ AliCaloCalibPedestal::AliCaloCalibPedestal(kDetType detectorType) :
                          fRows, fRowMin, fRowMax));
   
   }//end for nModules create the histograms
+
+  CompressAndSetOwner();
+}
+
+//_____________________________________________________________________
+void AliCaloCalibPedestal::CompressAndSetOwner()
+{ 
   //Compress the arrays, in order to remove the empty objects (a 16 slot array is created by default)
   fPedestalLowGain.Compress();
   fPedestalHighGain.Compress();
@@ -232,7 +248,6 @@ AliCaloCalibPedestal::AliCaloCalibPedestal(kDetType detectorType) :
   fPeakMinusPedLowGainRatio.SetOwner(kTRUE);
   fPeakMinusPedHighGainRatio.SetOwner(kTRUE);
   fDeadMap.SetOwner(kTRUE);
-
 }
 
 // dtor
@@ -267,7 +282,7 @@ AliCaloCalibPedestal::~AliCaloCalibPedestal()
 
 // copy ctor
 //_____________________________________________________________________
-AliCaloCalibPedestal::AliCaloCalibPedestal(const AliCaloCalibPedestal &ped) :
+AliCaloCalibPedestal::AliCaloCalibPedestal(AliCaloCalibPedestal &ped) :
   TObject(ped),
   fPedestalLowGain(),
   fPedestalHighGain(),
@@ -328,43 +343,12 @@ AliCaloCalibPedestal::AliCaloCalibPedestal(const AliCaloCalibPedestal &ped) :
     fDeadMap.Add( ped.GetDeadMap(i) );  
   }//end for nModules 
  
-  //Compress the arrays, in order to remove the empty objects (a 16 slot array is created by default)
-  fPedestalLowGain.Compress();
-  fPedestalHighGain.Compress();
-  fPedestalLEDRefLowGain.Compress();
-  fPedestalLEDRefHighGain.Compress();
-  fPeakMinusPedLowGain.Compress();
-  fPeakMinusPedHighGain.Compress();
-  fPeakMinusPedHighGainHisto.Compress();
-  fDeadMap.Compress();
-
-  // set owner ship for everyone
-  fPedestalLowGain.SetOwner(kTRUE);
-  fPedestalHighGain.SetOwner(kTRUE);
-  fPedestalLEDRefLowGain.SetOwner(kTRUE);
-  fPedestalLEDRefHighGain.SetOwner(kTRUE);
-  fPeakMinusPedLowGain.SetOwner(kTRUE);
-  fPeakMinusPedHighGain.SetOwner(kTRUE);
-  fPeakMinusPedHighGainHisto.SetOwner(kTRUE);
-  fPedestalLowGainDiff.SetOwner(kTRUE);
-  fPedestalHighGainDiff.SetOwner(kTRUE);
-  fPedestalLEDRefLowGainDiff.SetOwner(kTRUE);
-  fPedestalLEDRefHighGainDiff.SetOwner(kTRUE);
-  fPeakMinusPedLowGainDiff.SetOwner(kTRUE);
-  fPeakMinusPedHighGainDiff.SetOwner(kTRUE);
-  fPedestalLowGainRatio.SetOwner(kTRUE);
-  fPedestalHighGainRatio.SetOwner(kTRUE);
-  fPedestalLEDRefLowGainRatio.SetOwner(kTRUE);
-  fPedestalLEDRefHighGainRatio.SetOwner(kTRUE);
-  fPeakMinusPedLowGainRatio.SetOwner(kTRUE);
-  fPeakMinusPedHighGainRatio.SetOwner(kTRUE);
-  fDeadMap.SetOwner(kTRUE);
-
+  CompressAndSetOwner();
 }
 
 // assignment operator; use copy ctor to make life easy..
 //_____________________________________________________________________
-AliCaloCalibPedestal& AliCaloCalibPedestal::operator = (const AliCaloCalibPedestal &source)
+AliCaloCalibPedestal& AliCaloCalibPedestal::operator = (AliCaloCalibPedestal &source)
 {
   // assignment operator; use copy ctor
   if (&source == this) return *this;
@@ -376,6 +360,7 @@ AliCaloCalibPedestal& AliCaloCalibPedestal::operator = (const AliCaloCalibPedest
 //_____________________________________________________________________
 void AliCaloCalibPedestal::Reset()
 {
+  ValidateProfiles(); // make sure histos/profiles exist
   // Reset all arrays/histograms
   for (int i = 0; i < fModules; i++) {
     GetPedProfileLowGain(i)->Reset();
@@ -448,7 +433,7 @@ void AliCaloCalibPedestal::SetParametersFromFile(const char *parameterFile)
       s >> keyValue;
       
       // check stream status
-      if( ( s.rdstate() & ios::failbit ) == ios::failbit ) break;
+      if( s.rdstate() & ios::failbit ) break;
                        
       // skip rest of line if comments found
       if( keyValue.substr( 0, 2 ) == "//" ) break;
@@ -527,8 +512,9 @@ void AliCaloCalibPedestal::WriteParametersToFile(const char *parameterFile)
 }
 
 //_____________________________________________________________________
-Bool_t AliCaloCalibPedestal::AddInfo(const AliCaloCalibPedestal *ped)
+Bool_t AliCaloCalibPedestal::AddInfo(AliCaloCalibPedestal *ped)
 {
+  ValidateProfiles(); // make sure histos/profiles exist
   // just do this for the basic histograms/profiles that get filled in ProcessEvent
   // may not have data for all modules, but let's just Add everything..
   for (int i = 0; i < fModules; i++) {
@@ -562,6 +548,8 @@ Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStreamV3 *in)
   // Method to process=analyze one event in the data stream
   if (!in) return kFALSE; //Return right away if there's a null pointer
   fNEvents++; // one more event
+
+  if (fNEvents==1) ValidateProfiles(); // 1st event, make sure histos/profiles exist
   
   // indices for the reading
   int sample = 0;
@@ -671,7 +659,7 @@ Bool_t AliCaloCalibPedestal::ProcessEvent(AliCaloRawStreamV3 *in)
 Bool_t AliCaloCalibPedestal::SaveHistograms(TString fileName, Bool_t saveEmptyHistos)
 {
   //Saves all the histograms (or profiles, to be accurate) to the designated file
-  
+  ValidateProfiles(); // make sure histos/profiles exist
   TFile destFile(fileName, "recreate");
   
   if (destFile.IsZombie()) {
@@ -882,6 +870,7 @@ void AliCaloCalibPedestal::ValidateComparisonProfiles()
 void AliCaloCalibPedestal::ComputeDiffAndRatio()
 {
   // calculate differences and ratios relative to a reference
+  ValidateProfiles(); // make sure histos/profiles exist
   ValidateComparisonProfiles();//Make sure the comparison histos exist
  
   if (!fReference) {
@@ -968,6 +957,7 @@ void AliCaloCalibPedestal::ComputeDiffAndRatio()
 //_____________________________________________________________________
 void AliCaloCalibPedestal::ComputeHotAndWarningTowers(const char * hotMapFile)
 { // look for hot/noisy towers
+  ValidateProfiles(); // make sure histos/profiles exist
   ofstream * fout = 0;
   char name[512];//Quite a long temp buffer, just in case the filename includes a path
 
@@ -1054,6 +1044,7 @@ void AliCaloCalibPedestal::ComputeHotAndWarningTowers(const char * hotMapFile)
 //_____________________________________________________________________
 void AliCaloCalibPedestal::ComputeDeadTowers(const char * deadMapFile)
 {
+  ValidateProfiles(); // make sure histos/profiles exist
   //Computes the number of dead towers etc etc into memory, after this you can call the GetDead... -functions
   int countTot = 0;
   int countNew = 0;
@@ -1144,6 +1135,11 @@ void AliCaloCalibPedestal::ComputeDeadTowers(const char * deadMapFile)
 //_____________________________________________________________________
 Bool_t AliCaloCalibPedestal::IsBadChannel(int imod, int icol, int irow) const
 {
+  // Check if status info histo exists
+  if (!fDeadMap[imod]) { 
+    return kFALSE;
+  }
+
   //Check if channel is dead or hot.  
   Int_t status =  (Int_t) ( ((TH2D*)fDeadMap[imod])->GetBinContent(icol,irow) );
   if(status == kAlive)
@@ -1156,6 +1152,7 @@ Bool_t AliCaloCalibPedestal::IsBadChannel(int imod, int icol, int irow) const
 //_____________________________________________________________________
 void AliCaloCalibPedestal::SetChannelStatus(int imod, int icol, int irow, int status)
 {
+  ValidateProfiles(); // make sure histos/profiles exist
   //Set status of channel dead, hot, alive ...  
   ((TH2D*)fDeadMap[imod])->SetBinContent(icol, irow, status);  
 }
index 7472763..8832b25 100644 (file)
@@ -44,8 +44,8 @@ class AliCaloCalibPedestal : public TObject {
 
   // copy ctor, and '=' operator, are not fully tested/debugged yet
   // at least for now; the reference info is not copied from one to the other
-  AliCaloCalibPedestal(const AliCaloCalibPedestal &ped); 
-  AliCaloCalibPedestal& operator = (const  AliCaloCalibPedestal &source);
+  AliCaloCalibPedestal(AliCaloCalibPedestal &ped); 
+  AliCaloCalibPedestal& operator = (AliCaloCalibPedestal &source);
   
   // Event processing methods:  
   Bool_t ProcessEvent(AliRawReader *rawReader);
@@ -62,12 +62,12 @@ class AliCaloCalibPedestal : public TObject {
   ////////////////////////////
   //Simple getters
   // Main profiles:
-  TProfile2D * GetPedProfileLowGain(int i) const {return (TProfile2D*)fPedestalLowGain[i];};   // Return a pointer to the low-gain pedestal profile
-  TProfile2D * GetPedProfileHighGain(int i) const {return (TProfile2D*)fPedestalHighGain[i];}; // Return a pointer to the high-gain pedestal profile
-  TProfile * GetPedLEDRefProfileLowGain(int i) const {return (TProfile*)fPedestalLEDRefLowGain[i];};   // Return a pointer to the low-gain LEDRef profile 
-  TProfile * GetPedLEDRefProfileHighGain(int i) const {return (TProfile*)fPedestalLEDRefHighGain[i];}; // Return a pointer to the high-gain LEDRef profile 
-  TProfile2D * GetPeakProfileLowGain(int i) const {return (TProfile2D*)fPeakMinusPedLowGain[i];};      // Return a pointer to the low-gain peak-pedestal profile
-  TProfile2D * GetPeakProfileHighGain(int i) const {return (TProfile2D*)fPeakMinusPedHighGain[i];};    // Return a pointer to the high-gain peak-pedestal profile
+  TProfile2D * GetPedProfileLowGain(int i) {ValidateProfiles(); return (TProfile2D*)fPedestalLowGain[i];};     // Return a pointer to the low-gain pedestal profile
+  TProfile2D * GetPedProfileHighGain(int i) {ValidateProfiles(); return (TProfile2D*)fPedestalHighGain[i];};   // Return a pointer to the high-gain pedestal profile
+  TProfile * GetPedLEDRefProfileLowGain(int i) {ValidateProfiles(); return (TProfile*)fPedestalLEDRefLowGain[i];};     // Return a pointer to the low-gain LEDRef profile 
+  TProfile * GetPedLEDRefProfileHighGain(int i) {ValidateProfiles(); return (TProfile*)fPedestalLEDRefHighGain[i];};   // Return a pointer to the high-gain LEDRef profile 
+  TProfile2D * GetPeakProfileLowGain(int i) {ValidateProfiles(); return (TProfile2D*)fPeakMinusPedLowGain[i];};        // Return a pointer to the low-gain peak-pedestal profile
+  TProfile2D * GetPeakProfileHighGain(int i) {ValidateProfiles(); return (TProfile2D*)fPeakMinusPedHighGain[i];};      // Return a pointer to the high-gain peak-pedestal profile
   
   // Differences to references:
   TProfile2D * GetPedProfileLowGainDiff(int i){ValidateComparisonProfiles(); return (TProfile2D*)fPedestalLowGainDiff[i];};    // Return a pointer to the low-gain pedestal profile difference
@@ -85,10 +85,10 @@ class AliCaloCalibPedestal : public TObject {
   TProfile2D * GetPeakProfileLowGainRatio(int i){ValidateComparisonProfiles(); return (TProfile2D*)fPeakMinusPedLowGainRatio[i];};     // Return a pointer to the low-gain peak-pedestal profile ratio
   TProfile2D * GetPeakProfileHighGainRatio(int i){ValidateComparisonProfiles(); return (TProfile2D*)fPeakMinusPedHighGainRatio[i];};   // Return a pointer to the high-gain peak-pedestal profile ratio
   
-  TH2F * GetPeakHighGainHisto(int i) const {return (TH2F*)fPeakMinusPedHighGainHisto[i];};     // Return a pointer to the high-gain peak-pedestal histo
+  TH2F * GetPeakHighGainHisto(int i) {ValidateProfiles(); return (TH2F*)fPeakMinusPedHighGainHisto[i];};       // Return a pointer to the high-gain peak-pedestal histo
 
 
-  TH2D * GetDeadMap(int i) const {return (TH2D*)fDeadMap[i];}
+  TH2D * GetDeadMap(int i) {ValidateProfiles(); return (TH2D*)fDeadMap[i];}
   //void SetDeadMap(int i, TH2D *h) const {((TH2D*)fDeadMap[i])=h;}
        
   Bool_t IsBadChannel(int imod, int icol, int irow) const; 
@@ -146,7 +146,7 @@ class AliCaloCalibPedestal : public TObject {
   int GetDeadTowerResurrected() const {return fResurrectedTowers;}; //The the towers resurrected since the reference run
 
   void Reset();//Resets the whole class.
-  Bool_t AddInfo(const AliCaloCalibPedestal *ped);//picks up new info from supplied argument
+  Bool_t AddInfo(AliCaloCalibPedestal *ped);//picks up new info from supplied argument
   
   //////////////////////////////////////////////////////
   //Functions related to comparing this with another (reference) run.
@@ -162,6 +162,8 @@ class AliCaloCalibPedestal : public TObject {
   
  private:
   
+  void ValidateProfiles(); //Makes sure that basic histos/profiles exist
+  void CompressAndSetOwner(); //Makes sure that basic histos/profiles exist
   void ValidateComparisonProfiles(); //Makes sure that fPe..Diff and fPe..Ratio profiles exist
   
   //The histograms. We use a TObjArray instead of a simple array,because this gives automatic streaming properties for the
index 90b0cb4..5710d47 100644 (file)
@@ -135,14 +135,20 @@ AliEMCALClusterizer::AliEMCALClusterizer(AliEMCALGeometry* geometry, AliEMCALCal
 AliEMCALClusterizer::~AliEMCALClusterizer()
 {
   // dtor
-  if (fDigitsArr) {
-    fDigitsArr->Delete();
-    delete fDigitsArr;
-  }
-  if (fRecPoints) {
-    fRecPoints->Delete();
-    delete fRecPoints;
-  }
+  //Already deleted in AliEMCALReconstructor.
+
+//   if(fGeom)      delete fGeom;
+//   if(fCalibData) delete fCalibData;
+//   if(fCaloPed)   delete fCaloPed;
+
+//   if (fDigitsArr) {
+//     fDigitsArr->Clear("C");
+//     delete fDigitsArr;
+//   }
+//   if (fRecPoints) {
+//     fRecPoints->Delete();
+//     delete fRecPoints;
+//  }
 }
 
 //____________________________________________________________________________
index e758f6d..576c5d8 100644 (file)
@@ -37,6 +37,8 @@
 #include "AliEMCALReconstructor.h"
 
 #include "AliCodeTimer.h"
+#include "AliCaloCalibPedestal.h"
+#include "AliEMCALCalibData.h"
 #include "AliESDEvent.h"
 #include "AliESDCaloCluster.h"
 #include "AliESDCaloCells.h"
@@ -132,11 +134,11 @@ AliEMCALReconstructor::AliEMCALReconstructor()
 AliEMCALReconstructor::~AliEMCALReconstructor()
 {
   // dtor
-  delete fGeom;
-  delete fgRawUtils;
-  delete fgClusterizer;
-  delete fgTriggerProcessor;
-  
+
+  if(fGeom)              delete fGeom;
+  if(fCalibData)         delete fCalibData;
+  if(fPedestalData)      delete fPedestalData;
+
   if(fgDigitsArr){
     fgDigitsArr->Clear("C");
     delete fgDigitsArr; 
@@ -147,6 +149,9 @@ AliEMCALReconstructor::~AliEMCALReconstructor()
     delete fgClustersArr; 
   }
   
+  if(fgRawUtils)         delete fgRawUtils;
+  if(fgClusterizer)      delete fgClusterizer;
+  if(fgTriggerProcessor) delete fgTriggerProcessor;
   
   AliCodeTimer::Instance()->Print();
 }