Fixes for TClonesArray usage so that is is created only once and properly cleared.
authorkharlov <kharlov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 19 Sep 2010 18:45:08 +0000 (18:45 +0000)
committerkharlov <kharlov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 19 Sep 2010 18:45:08 +0000 (18:45 +0000)
PHOS/AliPHOSClusterizerv1.cxx
PHOS/AliPHOSEmcRecPoint.h
PHOS/AliPHOSRawDigiProducer.cxx
PHOS/AliPHOSRawDigiProducer.h
PHOS/AliPHOSRecPoint.h
PHOS/AliPHOSReconstructor.cxx
PHOS/AliPHOSReconstructor.h
PHOS/AliPHOSTracker.cxx

index fe6716b..5c693a3 100644 (file)
@@ -265,8 +265,8 @@ void AliPHOSClusterizerv1::Digits2Clusters(Option_t *option)
     AliInfo(Form("took %f seconds for Clusterizing\n",
                 gBenchmark->GetCpuTime("PHOSClusterizer"))); 
   }
-  fEMCRecPoints->Delete();
-  fCPVRecPoints->Delete();
+  fEMCRecPoints->Clear("C");
+  fCPVRecPoints->Clear("C");
 }
 
 //____________________________________________________________________________
index eb8ea5b..bde6378 100644 (file)
@@ -44,6 +44,8 @@ public:
  
   virtual ~AliPHOSEmcRecPoint() ;  
 
+  virtual void Clear(const Option_t* /*option*/ ="") { delete[] fEnergyList; fEnergyList=0; AliPHOSRecPoint::Clear(); }
+
   //This virtual function has signature different from AliPHOSRecPoint::AddDigit
   //it hides, not overrides. using - declaration should fix the problem, at least for
   //g++
index c87b256..dcca626 100644 (file)
@@ -155,8 +155,18 @@ AliPHOSRawDigiProducer::~AliPHOSRawDigiProducer()
 //--------------------------------------------------------------------------------------
 void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0* fitter) 
 {
+  // Create a temporary array of LG digits and then make digits from raw data
+
+  TClonesArray *tmpLG = new TClonesArray("AliPHOSDigit",10000) ;
+  MakeDigits(digits, tmpLG, fitter);
+  tmpLG->Delete();
+  delete tmpLG;
+}
+//--------------------------------------------------------------------------------------
+void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, TClonesArray *tmpDigLG, AliPHOSRawFitterv0* fitter) 
+{
   //Makes the job.
-  //TClonesArray *digits and raw data fitter should be provided by calling function.
+  //TClonesArray *digits, *tmpDigLG and raw data fitter should be provided by calling function.
 
   digits->Clear();
  
@@ -173,8 +183,8 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0
   else
     fSampleToSec=fRawStream->GetTSample() ;
   
-  //Temporary array for LowGain digits
-  TClonesArray tmpLG("AliPHOSDigit",10000) ;
+  // Clear a temporary array for LowGain digits
+  tmpDigLG->Clear();
   Int_t ilgDigit=0 ;
 
   //Let fitter subtract pedestals in case of ZS
@@ -258,9 +268,9 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0
        continue;
       
       if (caloFlag == AliCaloRawStreamV3::kLowGain) {
-       new(tmpLG[ilgDigit]) AliPHOSDigit(-1,absId,(Float_t)energy,(Float_t)time);
+       new((*tmpDigLG)[ilgDigit]) AliPHOSDigit(-1,absId,(Float_t)energy,(Float_t)time);
        if (sigLength>0 && fADCValuesLG!=0)
-         dynamic_cast<AliPHOSDigit*>(tmpLG.At(ilgDigit))->SetALTROSamplesLG(sigLength,fADCValuesLG);
+         dynamic_cast<AliPHOSDigit*>(tmpDigLG->At(ilgDigit))->SetALTROSamplesLG(sigLength,fADCValuesLG);
        ilgDigit++ ; 
       }
       else if (caloFlag == AliCaloRawStreamV3::kHighGain) {
@@ -279,17 +289,17 @@ void AliPHOSRawDigiProducer::MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0
     //replace energy of HighGain digits only if there is overflow
     //negative energy (overflow)
     digits->Sort() ;
-    tmpLG.Sort() ;
+    tmpDigLG->Sort() ;
     Int_t iLG = 0;
-    Int_t nLG1 = tmpLG.GetEntriesFast()-1 ;
+    Int_t nLG1 = tmpDigLG->GetEntriesFast()-1 ;
     
     for(Int_t iDig=0 ; iDig < digits->GetEntriesFast() ; iDig++) { 
       AliPHOSDigit * digHG = dynamic_cast<AliPHOSDigit*>(digits->At(iDig)) ;
       if (!digHG) continue;
-      AliPHOSDigit * digLG = dynamic_cast<AliPHOSDigit*>(tmpLG.At(iLG)) ;
+      AliPHOSDigit * digLG = dynamic_cast<AliPHOSDigit*>(tmpDigLG->At(iLG)) ;
       while(digLG && iLG<nLG1 && digHG->GetId()> digLG->GetId()){
        iLG++ ;
-       digLG = dynamic_cast<AliPHOSDigit*>(tmpLG.At(iLG)) ;
+       digLG = dynamic_cast<AliPHOSDigit*>(tmpDigLG->At(iLG)) ;
       }
       absId=digHG->GetId() ;
       fGeom->AbsToRelNumbering(absId,relId) ;
index d65070e..ad89d0c 100644 (file)
@@ -31,6 +31,7 @@ public:
   virtual ~AliPHOSRawDigiProducer(); 
 
   void MakeDigits(TClonesArray *digits, AliPHOSRawFitterv0* fitter);
+  void MakeDigits(TClonesArray *digits, TClonesArray *tmpDigLG, AliPHOSRawFitterv0* fitter);
 
   void SetEmcMinAmp(Float_t emcMin) { fEmcMinE=emcMin; }
   void SetCpvMinAmp(Float_t cpvMin) { fCpvMinE=cpvMin; }
index eb99fda..b503a18 100644 (file)
@@ -33,6 +33,8 @@ class AliPHOSRecPoint : public AliCluster {
   
   virtual ~AliPHOSRecPoint();
 
+  virtual void Clear(const Option_t* /*option*/ ="") { delete[] fDigitsList; fDigitsList=0; delete[] fTracksList; fTracksList=0; }
+
 //  virtual  void   AddDigit(AliDigitNew &){
 //   Fatal("AddDigit", "use AddDigit(AliPHOSDigit & digit, Float_t Energy)") ; 
 //  }
index 9afd29b..ca7eae6 100644 (file)
@@ -65,15 +65,16 @@ AliPHOSCalibData * AliPHOSReconstructor::fgCalibData  = 0 ;
 
 //____________________________________________________________________________
 AliPHOSReconstructor::AliPHOSReconstructor() :
-  fGeom(NULL),fClusterizer(NULL),fTSM(NULL),fPID(NULL)
+  fGeom(NULL),fClusterizer(NULL),fTSM(NULL),fPID(NULL),fTmpDigLG(NULL)
 {
   // ctor
-  fGeom        = AliPHOSGeometry::GetInstance("IHEP","");
-  fClusterizer = new AliPHOSClusterizerv1      (fGeom);
-  fTSM         = new AliPHOSTrackSegmentMakerv1(fGeom);
-  fPID         = new AliPHOSPIDv1              (fGeom);
-  fgDigitsArray = new TClonesArray("AliPHOSDigit",100);
-  fgEMCRecPoints= new TObjArray(100) ;
+  fGeom          = AliPHOSGeometry::GetInstance("IHEP","");
+  fClusterizer   = new AliPHOSClusterizerv1      (fGeom);
+  fTSM           = new AliPHOSTrackSegmentMakerv1(fGeom);
+  fPID           = new AliPHOSPIDv1              (fGeom);
+  fTmpDigLG      = new TClonesArray("AliPHOSDigit",100);
+  fgDigitsArray  = new TClonesArray("AliPHOSDigit",100);
+  fgEMCRecPoints = new TObjArray(100) ;
   if (!fgCalibData)
     fgCalibData = new AliPHOSCalibData(-1); //use AliCDBManager's run number
 
@@ -83,13 +84,14 @@ AliPHOSReconstructor::AliPHOSReconstructor() :
 }
 
 //____________________________________________________________________________
-  AliPHOSReconstructor::~AliPHOSReconstructor()
+AliPHOSReconstructor::~AliPHOSReconstructor()
 {
   // dtor
   delete fGeom;
   delete fClusterizer;
   delete fTSM;
   delete fPID;
+  delete fTmpDigLG;
   delete fgDigitsArray;
   delete fgEMCRecPoints;
 } 
@@ -342,9 +344,9 @@ void AliPHOSReconstructor::FillESD(TTree* digitsTree, TTree* clustersTree,
     delete [] fracList;
     delete [] absIdList;
   }
-  fgDigitsArray ->Delete();
-  fgEMCRecPoints->Delete();
-  recParticles  ->Delete();
+  fgDigitsArray ->Clear();
+  fgEMCRecPoints->Clear("C");
+  recParticles  ->Clear();
 
   //Store PHOS misalignment matrixes
   FillMisalMatrixes(esd) ;
@@ -399,7 +401,7 @@ void  AliPHOSReconstructor::ConvertDigits(AliRawReader* rawReader, TTree* digits
   rdp.SetEmcMinAmp(GetRecoParam()->GetEMCRawDigitThreshold()); // in ADC
   rdp.SetCpvMinAmp(GetRecoParam()->GetCPVMinE());
   rdp.SetSampleQualityCut(GetRecoParam()->GetEMCSampleQualityCut());
-  rdp.MakeDigits(digits,fitter);
+  rdp.MakeDigits(digits,fTmpDigLG,fitter);
 
   delete fitter ;
 
index dcca58d..4d3f3e5 100644 (file)
@@ -100,11 +100,12 @@ private:
   AliPHOSClusterizerv1     *fClusterizer;    //! PHOS clusterizer
   AliPHOSTrackSegmentMaker *fTSM;            //! PHOS TrackSegmentMaker
   AliPHOSPID               *fPID;            //! PHOS PID maker
+  TClonesArray             *fTmpDigLG;       //! Temporary array of LG digits
   static TClonesArray      *fgDigitsArray;   //! Array of PHOS digits
   static TObjArray         *fgEMCRecPoints;  //! Array of EMC rec.points
   static AliPHOSCalibData * fgCalibData ;    //! Calibration database if aval.
 
-  ClassDef(AliPHOSReconstructor,8)  // PHOS Reconstruction class
+  ClassDef(AliPHOSReconstructor,9)  // PHOS Reconstruction class
 
 }; 
 
index 543859c..15b34c2 100644 (file)
@@ -94,7 +94,7 @@ Int_t AliPHOSTracker::LoadClusters(TTree *cTree) {
   }
   branch->SetAddress(&arr);
 
-  for(Int_t m=0;m<5; m++) fModules[m]->Clear() ;
+  for(Int_t m=0;m<5; m++) fModules[m]->Clear("C") ;
 
   Int_t nclusters=0;
   Int_t nentr=(Int_t)branch->GetEntries();