Fix for memory leaks in digits TClonesArrays (Matevz)
authorcvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 1 Dec 2009 22:50:11 +0000 (22:50 +0000)
committercvetan <cvetan@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 1 Dec 2009 22:50:11 +0000 (22:50 +0000)
ACORDE/AliACORDEReconstructor.cxx
ACORDE/AliACORDEReconstructor.h
VZERO/AliVZEROReconstructor.cxx
VZERO/AliVZEROReconstructor.h

index 609c184..9c71c75 100644 (file)
@@ -33,7 +33,8 @@ AliACORDEReconstructor:: AliACORDEReconstructor():
   AliReconstructor(),\r
   fESDACORDE(0x0),\r
   fAcordeRecoParam(0x0),\r
-  fCalibData(0x0)\r
+  fCalibData(0x0),\r
+  fDigitsArray(0)\r
 {\r
   // Default constructor  \r
   // Get calibration data\r
@@ -66,7 +67,8 @@ AliACORDEReconstructor& AliACORDEReconstructor::operator =
 AliACORDEReconstructor::~AliACORDEReconstructor()\r
 {\r
 // destructor\r
-  delete fESDACORDE; \r
+  delete fESDACORDE;\r
+  delete fDigitsArray;\r
 }\r
 \r
 //_____________________________________________________________________________\r
@@ -84,8 +86,10 @@ void AliACORDEReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digit
     return;\r
   }\r
 \r
-  TClonesArray* digitsArray = new TClonesArray("AliACORDEdigit");\r
-  digitsTree->Branch("ACORDEdigit", &digitsArray);\r
+  if (!fDigitsArray)\r
+    fDigitsArray = new TClonesArray("AliACORDEdigit", 60);\r
+\r
+  digitsTree->Branch("ACORDEdigit", &fDigitsArray);\r
 \r
   rawReader->Reset();\r
   AliACORDERawStream rawStream(rawReader);\r
@@ -94,12 +98,13 @@ void AliACORDEReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digit
       Int_t  index = iChannel / 30;\r
       Int_t  bit   = iChannel % 30;\r
       if (rawStream.GetWord(index) & (1 << bit))\r
-        new ((*digitsArray)[digitsArray->GetEntriesFast()]) AliACORDEdigit(iChannel+1,0);\r
+        new ((*fDigitsArray)[fDigitsArray->GetEntriesFast()]) AliACORDEdigit(iChannel+1,0);\r
     }\r
   }\r
 \r
   digitsTree->Fill();\r
-                       \r
+\r
+  fDigitsArray->Clear();\r
 }\r
 \r
 void AliACORDEReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,AliESDEvent* esd) const\r
@@ -113,23 +118,22 @@ void AliACORDEReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,
       return;\r
     }\r
 \r
-  TClonesArray* digitsArray = NULL;\r
   TBranch* digitBranch = digitsTree->GetBranch("ACORDEdigit");\r
   if (!digitBranch) {\r
     AliError("No ACORDE digits branch found!");\r
     return;\r
   }\r
-  digitBranch->SetAddress(&digitsArray);\r
+  digitBranch->SetAddress(&fDigitsArray);\r
 \r
   digitsTree->GetEvent(0);\r
 \r
   Bool_t AcoHitSingle[60],AcoHitMulti[60];\r
   for(Int_t i = 0; i < 60; i++) { AcoHitSingle[i] = AcoHitMulti[i] = kFALSE; }\r
 \r
-  Int_t nDigits = digitsArray->GetEntriesFast();\r
+  Int_t nDigits = fDigitsArray->GetEntriesFast();\r
     \r
   for (Int_t d=0; d<nDigits; d++) {    \r
-    AliACORDEdigit* digit = (AliACORDEdigit*)digitsArray->At(d);\r
+    AliACORDEdigit* digit = (AliACORDEdigit*) fDigitsArray->At(d);\r
     Int_t module = digit->GetModule();\r
 \r
     AcoHitSingle[module-1] = kTRUE;\r
@@ -144,7 +148,9 @@ void AliACORDEReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,
     {\r
       AliDebug(1, Form("Writing ACORDE data to ESD Tree"));\r
       esd->SetACORDEData(fESDACORDE);\r
-    }  \r
+    }\r
+\r
+  fDigitsArray->Clear();\r
 }\r
 \r
 \r
index ff365bb..27355b8 100644 (file)
@@ -54,7 +54,9 @@ private:
   AliACORDEReconstructor& operator = (const AliACORDEReconstructor&); //Not implemented
   
   AliACORDECalibData* fCalibData;      //! calibration data
+
+  mutable TClonesArray *fDigitsArray;  // clones-array for ConvertDigits() and FillESD()
+
   ClassDef(AliACORDEReconstructor, 1)  // class for the ACORDE reconstruction
 };
 
index b5b97c5..214779c 100644 (file)
@@ -46,7 +46,8 @@ AliVZEROReconstructor:: AliVZEROReconstructor(): AliReconstructor(),
                         fESDVZEROfriend(0x0),
                         fCalibData(GetCalibData()),
                         fCollisionMode(0),
-                        fBeamEnergy(0.)
+                        fBeamEnergy(0.),
+                        fDigitsArray(0)
 {
   // Default constructor  
   // Get calibration data
@@ -73,6 +74,7 @@ AliVZEROReconstructor::~AliVZEROReconstructor()
 
    delete fESDVZERO;
    delete fESDVZEROfriend;
+   delete fDigitsArray;
 }
 
 //_____________________________________________________________________________
@@ -96,8 +98,9 @@ void AliVZEROReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits
     return;
   }
 
-  TClonesArray* digitsArray = new TClonesArray("AliVZEROdigit");
-  digitsTree->Branch("VZERODigit", &digitsArray);
+  if (!fDigitsArray)
+    fDigitsArray = new TClonesArray("AliVZEROdigit", 64);
+  digitsTree->Branch("VZERODigit", &fDigitsArray);
 
   fESDVZEROfriend->Reset();
 
@@ -199,13 +202,15 @@ void AliVZEROReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits
            time[iChannel] = (Float_t) kInvalidTime;     
          }
         if (adc[iChannel] > 0)
-          new ((*digitsArray)[digitsArray->GetEntriesFast()])
+          new ((*fDigitsArray)[fDigitsArray->GetEntriesFast()])
              AliVZEROdigit(iChannel, adc[iChannel], time[iChannel],
                           width[iChannel], BBFlag[iChannel], BGFlag[iChannel],integrator[iChannel]);
         
      }          
      digitsTree->Fill();
   }
+
+  fDigitsArray->Clear();
 }
 
 //______________________________________________________________________
@@ -219,9 +224,8 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,
       return;
   }
 
-  TClonesArray* digitsArray = NULL;
   TBranch* digitBranch = digitsTree->GetBranch("VZERODigit");
-  digitBranch->SetAddress(&digitsArray);
+  digitBranch->SetAddress(&fDigitsArray);
 
   Float_t   mult[64];  
   Float_t    adc[64]; 
@@ -244,10 +248,10 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,
   for (Int_t e=0; e<nEntries; e++) {
     digitsTree->GetEvent(e);
 
-    Int_t nDigits = digitsArray->GetEntriesFast();
+    Int_t nDigits = fDigitsArray->GetEntriesFast();
     
     for (Int_t d=0; d<nDigits; d++) {    
-        AliVZEROdigit* digit = (AliVZEROdigit*)digitsArray->At(d);      
+        AliVZEROdigit* digit = (AliVZEROdigit*) fDigitsArray->At(d);      
         Int_t  pmNumber      = digit->PMNumber(); 
         // Pedestal retrieval and suppression: 
        Bool_t   integrator  = digit->Integrator();
@@ -282,7 +286,7 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,
   TriggerMask->SetTimeWindowWidthBGA(20);
   TriggerMask->SetTimeWindowWidthBBC(50);
   TriggerMask->SetTimeWindowWidthBGC(20);
-  TriggerMask->FillMasks(digitsTree,digitsArray);
+  TriggerMask->FillMasks(digitsTree, fDigitsArray);
 
   fESDVZERO->SetBBtriggerV0A(TriggerMask->GetBBtriggerV0A());
   fESDVZERO->SetBGtriggerV0A(TriggerMask->GetBGtriggerV0A());
@@ -301,6 +305,8 @@ void AliVZEROReconstructor::FillESD(TTree* digitsTree, TTree* /*clustersTree*/,
         fr->SetVZEROfriend(fESDVZEROfriend);
     }
   }
+
+  fDigitsArray->Clear();
 }
 
 //_____________________________________________________________________________
index 392eea5..6070033 100644 (file)
@@ -68,7 +68,9 @@ private:
 
   Int_t              fCollisionMode;  // =0->p-p, =1->A-A
   Float_t            fBeamEnergy;     // beam energy
-    
+
+  mutable TClonesArray *fDigitsArray; // clones-array for ConvertDigits() and FillESD()
+
   ClassDef(AliVZEROReconstructor, 1)  // class for the VZERO reconstruction
 };